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

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

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

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

Q&A

解決済

2回答

3134閲覧

15×15の碁盤で5つそろったら勝ちというゲームを作りたい

kuroni

総合スコア4

C

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

0グッド

1クリップ

投稿2020/08/31 11:40

15×15の碁盤の上で、5つ先に同じマークを縦横斜めどれでも並べたら勝ちなゲームのコードで、勝利判定の部分がわからないので教えていただけると嬉しいです。
同じマークが5つ揃ったら1に返すコードのつもりで考えています。
自分なりに作ってみたのですが、縦5つの時と、横5つの時と、左上がりの斜めのの時の判定は合ってると思っています。間違っていたら指摘をお願いします。
また、右あがりの時の判定はどう書けば良いでしょうか。

int judge(int Row, int Column, char Board[15][15]){ int i,j; for(i = Row - 4; i<=14; i++){ for(j = Column -4; j <=14; j++){ if(i >= 0 && i <= 10 && j >= 0 && j <= 14){ if((Board[i][j] == '@' && Board[i+1][j] == '@' && Board[i+2][j] == '@' && Board[i+3][j] == '@' && Board[i+4][j] == '@')||(Board[i][j] == 'o' && Board[i+1][j] == 'o' && Board[i+2][j] == 'o' &&Board[i+3][j] == 'o' &&Board[i+4][j] == 'o')){ return 1; } } if(i>= 0 && i <= 14 && j >= 0 && j <= 10){ if((Board[i][j]== '@' && Board[i][j+1] == '@' && Board[i][j+2] == '@' && Board[i][j+3] == '@' && Board[i][j+4] == ; '@')||(Board[i][j] == 'o' && Board[i][j+1] == 'o' && Board[i][j+2] == 'o' &&Board[i][j+3] == 'o' &&Board[i][j+4] == 'o')){ return 1; } } if(i >= 0 && i <= 10 && j >= 0 && j<= 10){ if((Board[i][j] == '@' && Board[i+1][i+1] == '@' && Board[i+2][j+2] == '@' && Board[i+3][j+3] == '@' && Board[i+4][j+4] =='@')||(Board[i][j] =='o' && Board[i+1][j+1] == 'o' && Board[i+2][j+2] == 'o' && Board[i+3][j+3] == 'o' && Board[i+4][j+4] == 'o')){ return 1; } }

c言語初心者でもあり、至らない点等あるかもしれませんが、よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どうして出来ないのかわからないくらいほとんど出来ているので細かい説明は不要でしょう。

結論から言うと、右上がりの場合というのは左上がりの場合の逆向きに伸びているのですから

if(i >= 0 && i <= 10 && j >= 4 && j<= 14) { if((Board[i][j] == '@' && Board[i+1][i-1] == '@' && Board[i+2][j-2] == '@' && Board[i+3][j-3] == '@' && Board[i+4][j-4] =='@') || (Board[i][j] =='o' && Board[i+1][j-1] == 'o' && Board[i+2][j-2] == 'o' && Board[i+3][j-3] == 'o' && Board[i+4][j-4] == 'o')){ return 1; } }

といった要領で書けばよいです。 マイナス方向になるだけです。


質問の趣旨から外れた余談ですが、質問の事例がいわゆる五目並べ (交互に一手づつ石を置く) なのだとしたら今打った石を含む並びだけチェックすれば良く、盤全体を走査する必要はありません。

今打った石を で表すとすると下図の青塗りの範囲だけ調べて五個以上が並んでいるかを調べれば十分です。

操作する範囲

今打った手を含まない部分で五個の並びが無いことは過去の手番におけるチェックでわかっているからです。

プログラム的にはチェック以外の部分も少し構成を変更する必要がありますのでここではコードは示しません。 質問者がこの考え方を元に記述を試みた上でどうしてもわからないところがあるようなら別の質問として投稿してください。

投稿2020/08/31 12:40

編集2020/08/31 14:25
SaitoAtsushi

総合スコア5675

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

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

kuroni

2020/08/31 13:15

SaitoAtsushi様回答ありがとうございます。私はc言語を勉強し始めて、まだ日が浅いのですが、余談に記載されている、今打った石を含む並びのみのチェックのコードはどのようになるかご教授いただけないでしょうか
SaitoAtsushi

2020/08/31 13:56

「今打った石を含む並び」が実際にどの範囲であるかはわかりますか?
kuroni

2020/08/31 14:05

すいません。理解が及ばないです。
kuroni

2020/08/31 14:29

丁寧な説明ありがとうございます。もう少し勉強してから取り組んでみるレベルのことだと思うので、勉強してみます。本当にありがとうございました
guest

0

右上がりの場合、あなたが目で見て判断するときにどういうふうに判断するんでしょうか。
まずはそれをできるだけ詳しく文章に起こしましょう。
それをその文章に従ってコードに起こしていけばいいというはなしとなります。

投稿2020/08/31 11:42

y_waiwai

総合スコア88024

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問