• 締切済み

オセロゲーム 2次元配列で困ってます。

オセロゲームを作ってますが、オセロの石はただ置けばよいものではなく、他の石と接触している場所でないといけないですよね。だから、いきなり角に石を置く事ができないわけです。 隣に石があるか調べるには基本的には、左・右・上・下・左上・右上・左下・右下と8箇所ですが、端だと5箇所箇所となり、更に角になると3箇所となるわけです。 それぞれ石が置けるかを調べるために関数の一部にこのようなもの作って見ました。 でも、端に接触するマスの座標を指定しても、置けないはずなのに、いしが置けてしまいます。 動解決すればよいかおしえてください。 NGだと0を返し、OKだと1を返します。 #defien OTHELLO_NON 0 int Contact(int data[][GOBAN], int tate, int yoko ) { int signal = 0; if(data[tate][yoko - 1] != OTHELLO_NON){ signal = 1; } if(data[tate][yoko + 1] != OTHELLO_NON){ signal = 1; } if(data[tate - 1][yoko - 1] != OTHELLO_NON){ signal = 1; } if(data[tate - 1][yoko] != OTHELLO_NON){ signal = 1; } if(data[tate - 1][yoko + 1] != OTHELLO_NON){ signal = 1; } if(data[tate + 1][yoko - 1] != OTHELLO_NON){ signal = 1; } if(data[tate + 1][yoko] != OTHELLO_NON){ signal = 1; } if(data[tate + 1][yoko + 1] != OTHELLO_NON){ signal = 1; } return signal; }

みんなの回答

  • valvelde
  • ベストアンサー率35% (46/129)
回答No.3

すべて見れてないのでわかりませんがdata配列の範囲外参照が原因でおこっていると思います。 tateおよびyokoが0~GOBAN以外の値になった場合dataを参照しない処理を追加するか、NO1さんがかかれているような処理を行う必要があります。

nVIDIA
質問者

お礼

質問書き直します

  • akanekor
  • ベストアンサー率52% (102/194)
回答No.2

data[]の 入力処理とか他の部分は見せてくれないのか、、。 (==; まあ、いいや。 予想です。、 たぶん、data構造体の初期化忘れが原因。 for (int iCntX =0; iCntX< xxx; iCntX++) { for (int iCntY =0; iCntY< YYY; iCntY++) { data[iCntX][iCntY] = (初期値); } } こんな感じのコードちゃんと書いてますか? 書かないと、メモリ上のゴミデータ読んじゃうよ。

nVIDIA
質問者

お礼

質問書き直します

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> 石が置けるかを調べる まず「すでに相手、または自分の石があると不可」 これがクリアされたら 「周囲8個に相手、または自分の石が無いと不可」 ということですよね。 (さらには「相手を挟む石」も必要でしょうけど) 2次元配列は外周1列余計に宣言したほうが、チェックが単純化できます。 オセロの盤面って8×8ですから10×10で宣言して、添字の範囲を絞って、内側の8×8のみを使用。 もちろん初期値セットは外周部も含め「石なし」で。 これならチェック対象は常に周囲8セルになりますので 「周辺で対象外となるセルが意図しない値を返す」ことが回避できます。

nVIDIA
質問者

お礼

質問書き直します

関連するQ&A