コード #include <stdio.h> int board[8][8]; void turnLeftUp1(int x,int y){ if(y>1 && x>1){ if(board[y][x]==2 && board[y-1][x-1]==1){ for(int k=2;;k++){ if(x-k<0 || y-k<0){ break; } if(board[y-k][x-k]==0){ board[y-k][x-k]=3; break; } } } } } void turnUp1(int x, int y){ if(y>1){ if(board[y][x]==2 && board[y-1][x]==1){ for(int k=2;;k++){ if(y-k<0){ break; } if(board[y-k][x]==0){ board[y-k][x]=3; break; } } } } } void turnRightUp1(int x, int y){ if(y>1 && x<6){ if(board[y][x]==2 && board[y-1][x+1]==1){ for(int k=2;;k++){ if(x+k>7||y-k<0){ break; } if(board[y-k][x+k]==0){ board[y-k][x+k]=3; break; } } } } } void turnDown1(int x,int y){ if(y<6){ if(board[y][x]==2 && board[y+1][x]==1){ for(int k=2;;k++){ if(y+k>7){ break; } if(board[y+k][x]==0){ board[y+k][x]=3; break; } } } } } void turnRight1(int x, int y){ if(x<6){ if(board[y][x]==2 && board[y][x+1]==1){ for(int k=2;;k++){ if(x+k>7){ break; } if(board[y][x+k]==0){ board[y][x+k]=3; break; } } } } } void turnLeftDown1(int x,int y){ if(y<6 && x>1){ if(board[y][x]==2 && board[y+1][x-1]==1){ for(int k=2;;k++){ if(x-k<0||y+k>7){ break; } if(board[y+k][x-k]==0){ board[y+k][x-k]=3; break; } } } } } void turnLeft(int x,int y){ if(x>1){ if(board[y][x]==2 && board[y][x-1]==1){ for(int k=2;;k++){ if(x<k) break; if(board[y][x-k]==0){ board[y][x-k]=3; break; } } } } } void turnRightDown1(int x,int y){ if(y<6 && x<6){ if(board[y][x]==2 && board[y+1][x+1]==1){ for(int k=2;;k++){ if(x+k > 7|| y+k > 7){ break; } if(board[y+k][x+k]==0){ board[y+k][x+k]=3; break; } } } } } int main(int argc, char **argv) { FILE *fp; int i, j; if (argc != 2) { return 1; } fp = fopen(argv[1], "r"); if (fp ==NULL) { return 1; } for (i=0; i<8; i++) { for (j=0; j<8; j++) { fscanf(fp, "%d", &(board[i][j])); } } for (i=0; i<8; i++) { for (j=0; j<8; j++) { turnLeftUp1(i,j); turnUp1(i,j); turnRightUp1(i,j); turnLeft(i,j); turnRight1(i,j); turnLeftDown1(i,j); turnDown1(i,j); turnRightDown1(i,j); printf("%d ", board[i][j]); } printf("\n"); } return 0; }# 前提・実現したいこと ここに質問の内容を詳しく書いてください。 C言語で与えられた盤面を表示されるファイルを読み込み黒(2)から見て白(1)をひっくりかえせる場所を3で表示するために8つの方向を調べるオセロのプログラムを作ったのですが上手く表示されません。0は何も置かれていない場所です。 ### 発生している問題・エラーメッセージ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 1 1 2 0 0 0 0 0 2 2 1 3 0 0 0 3 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 上記のように必要な部分がすべて3に変わりません。 以下が望まれる実行結果です。 0 0 0 0 0 0 0 0 0 0 0 3 3 0 0 0 0 0 3 3 1 2 0 0 0 0 3 1 1 2 0 0 0 0 0 2 2 1 3 0 0 0 0 0 0 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
エラーメッセージ
間に白が2つ続くときに該当箇所に3を表示することが出来ません。
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
提示のコードではどういう不具合があるんでしょうか
実行はされるのですが望まれる結果を得ることが出来ません。コードのどこがいけないのか教えていただきたいです。
望まれる結果が得られないとは、具体的にどういう結果が得られるんでしょうか。詳しく説明しましょう。
どういう操作でそうなったのか、を説明してください
また、
このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
> いろいろ調べてみた
とのことですが、調査済のことと同じアドバイスをしても無駄になってしまいますから、何を調べてどうだったのか、先に教えていただけますか?
現状ではコードが読みにくいです。
質問は編集できるので、以下を参考にしてマークダウンを修正してください
https://teratail.com/questions/238564
ひっくり返せる場所の探索と盤面の表示を分けてみてはいかがでしょうか
「調べた」の文言がなくなっちゃいましたねぇ。何故?
> 間に白が2つ続くときに該当箇所に3を表示することが出来ません。
そう...なんでしょうか?
盤データに
0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0
0 1 2 1 0 0 0 0
0 1 1 1 0 0 0 0
(以降全部0)
を与えた結果や
main関数のreturn 0の前(つまりプログラムが終わる直前に
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
printf("%d ",board[i][j]);
}
printf("\n");
}
を入れてなにが表示されるか、それはなぜかといったことについて
考察してみるといいかも知れません。
(なにしろ、状況の報告だけで「何を質問しているのか」も書いてないし...)
main関数のreturn 0の前(つまりプログラムが終わる直前に
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
printf("%d ",board[i][j]);
}
printf("\n");
}
を入れたところ無事に表示されました。
ご回答いただきありがとうございます。
無事...ですか? 私の手元では
0 0 0 0 0 0 0 0
0 0 0 3 3 0 3 0
0 3 3 3 1 2 0 0
0 0 3 1 1 2 0 0
0 0 0 2 2 1 3 0
0 0 3 0 0 3 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
になりましたけど。「望まれる実行結果」と異なります。
あなたがそれで構わないのならそれでもいいですけれど。
あなたの回答
tips
プレビュー