質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

0回答

1338閲覧

C言語でオセロを裏返すプログラム

matusann

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/11/02 02:48

編集2020/11/02 04:29
コード #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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/11/02 02:57

提示のコードではどういう不具合があるんでしょうか
matusann

2020/11/02 03:01

実行はされるのですが望まれる結果を得ることが出来ません。コードのどこがいけないのか教えていただきたいです。
y_waiwai

2020/11/02 03:05 編集

望まれる結果が得られないとは、具体的にどういう結果が得られるんでしょうか。詳しく説明しましょう。 どういう操作でそうなったのか、を説明してください また、 このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
thkana

2020/11/02 03:04

> いろいろ調べてみた とのことですが、調査済のことと同じアドバイスをしても無駄になってしまいますから、何を調べてどうだったのか、先に教えていただけますか?
Soei

2020/11/02 03:09 編集

現状ではコードが読みにくいです。 質問は編集できるので、以下を参考にしてマークダウンを修正してください https://teratail.com/questions/238564 ひっくり返せる場所の探索と盤面の表示を分けてみてはいかがでしょうか
thkana

2020/11/02 10:51

「調べた」の文言がなくなっちゃいましたねぇ。何故? > 間に白が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"); } を入れてなにが表示されるか、それはなぜかといったことについて 考察してみるといいかも知れません。 (なにしろ、状況の報告だけで「何を質問しているのか」も書いてないし...)
matusann

2020/11/02 14:55

main関数のreturn 0の前(つまりプログラムが終わる直前に for(int i=0;i<8;i++){ for(int j=0;j<8;j++){ printf("%d ",board[i][j]); } printf("\n"); } を入れたところ無事に表示されました。 ご回答いただきありがとうございます。
thkana

2020/11/04 13:39

無事...ですか? 私の手元では 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 になりましたけど。「望まれる実行結果」と異なります。 あなたがそれで構わないのならそれでもいいですけれど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問