ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュの五目並べの判定処理

  • mixiチェック
  • このエントリーをはてなブックマークに追加
コンソールで五目並べを作っています。
プレイヤー入力のみでAIはナシです。
碁盤は2次元配列で、空:0,白:1,黒:2となっています。
プレイヤーの勝利判定に置いて、斜めの判定がうまくいきません。
縦横の判定はうまくいっています。
どういう手法が最も最適でしょうか。助言を頂けると幸いです。


// 判定処理関数 ※斜め判定未処理
// 戻り値:白が勝利なら1, 黒が勝利なら2, それ以外なら0
int Judgment(int j_ban[BAN_HEIGHT][BAN_WIDTH]) {
int i, j, cnt1=0, cnt2=0;
// 行判定
for(i=0 ; i<BAN_WIDTH ; i++) {
for(j=0 ; j<BAN_HEIGHT ; j++) {
if (j_ban[j][i]==1)
cnt1++;
else
cnt1=0;
if (j_ban[j][i]==2)
cnt2++;
else
cnt2=0;
if(cnt1==5)
return 1;
if(cnt2==5)
return 2;
}
}
// 列判定
for(i=0 ; i<BAN_HEIGHT ; i++) {
for(j=0 ; j<BAN_WIDTH ; j++) {
if (j_ban[i][j]==1)
cnt1++;
else
cnt1=0;
if (j_ban[i][j]==2)
cnt2++;
else
cnt2=0;
if(cnt1==5)
return 1;
if(cnt2==5)
return 2;
}
}
// ※斜め判定を追加したい

return 0;
}

コメント(9)

 BAN_HEIGHT と BAN_WIDTH が常に等しいならば、「斜め」のパターンは2通り、つまり、右上隅から左下隅と、左上隅から右下隅、しかありません。そのうち1つは、次のようにして判定出来るかと思います。

for ( i = 0; i < BAN_HEIGHT; i ++ ) { 
    if ( j_ban[ i ][ i ] == 1 ) {
        cnt1 ++;
    }
    else {
        cnt1 = 0;
    }
    if ( j_ban[ i ][ i ] == 2 ) 
        cnt2 ++;
    else {
        cnt2 = 0;
    }
}

 ご覧の通り、難しくはありません。もう1つのパターンも、似たように出来るはずです。
> khurataさん
!?
五目並べですよね?
6x6 以上の時に成り立ちますか?
ちなみにこのトピ主サンプル
横の判定も出来てますかね?


横の判定を考えて見てください
自ずと、斜めも分かるかと思います
ごめんなさい
横と縦は別にあったのですね
失礼しました。
> khurataさん

コメントありがとうございます。上のコードだと

■□□□■
□■□■□
□□■□□
□■□■□
■□□□■

これの黒い部分のみですよね。
現状10x10の配列をとってます。
白い部分も込みで、シンプルにコーディングしたいんですが、配列の参照を一歩まちがえるとプログラムがすぐに落ちちゃうので…。
とりあえず参考にさせてもらいます。

>Beep大佐さん
縦と横(行と列)の判定はできています。
実行ファイルで確認済みです。
打たれた目を基点に並び判定をやって、
それを打つたびにやるってのはどう?
手数が減らせそう。
大きく分けて、
左上から右下の流れと、
右上から左下への流れ(当然逆の流れでもOKだけど)
があるのだから

一度に盤上のすべてのマスをチェックするんでなくて
分割した関数にして考えたらいいんでない?

その方がわかりやすいと思うけれど。
 最初に書いたコードは、トピックに書かれていたコードをコピーして作った参考コードで、検証もしていません(汗)。ただ、[ i ][ i ] というところを見ていただきたかったのです。

 盤面が 10x10 であれば、6:お気楽 さんが書かれているように、私が示したような判定を各起点から駆動すれば良いのではないかと思います。
番兵を使ったら?
10x10の盤面だったら、データ構造的には12x12を要うして周囲には駒を置かない。表示も内側も10x10エリアしかしない。この場合探索して言ったら必ず駒が置かれていない升目にいってとまるので、探索終了条件がシンプルになる。

あと、
五目並べと連珠では勝利条件が違いますが、五目並べでいいんですよね?

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。