はじめまして! たかと申します。
現在プログラミングにはまっていて、オセロをつくっています。
参考本とかはまったく見ずに自分でほとんどつくっています。
今は・・・
・クリックするとそのマスに選択されている石を表示
・黒と白の数を表示
・一度置いたとこには置けない
というところまでできました。
次は・・・
・石ではさむと反転する
というのを実装しているのですが、
上記のように参考本とかを見ないでつくったので、
今から参考にしようとしても遅かったのでわかりませんでした。
それで質問させていただきました。
int Board[8][8] =
{
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,2,1,0,0,0},
{0,0,0,1,2,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
0 = 空白(マス)
1 = 黒
2 = 白
これを画面に反映させる仕組みになっています。
この仕組みから、反転を行うには具体的にはどういうことをしたらよいのでしょうか?
回答おねがいいたしますm(..)m
それほとんど何も出来てないようなもんだよ
あ、もしかして対人のみか
対人のみです。
まずは基本なので・・
> 反転を行うには具体的にはどういうことをしたらよいのでしょうか?
1. 位置(x,y)に色cのコマを置いたとき、反転するコマがあるか否か(true/false)を返す
関数。
2. 位置(x,y)に色cのコマを置いてコマを反転させる関数。
3. [1]の結果をtrueとする(x,y)がすくなくとも一か所存在するか否かを返す関数。
とまぁ、このくらいあればゲームが作れそう。
環境は何?
置いたところの縦横斜めを調べてひっくり返せるか見る。
ひっくり返せたら Board[8][8] を書き換えて画面に反映。
具体的に何の作業がわからんのかな?
> それほとんど何も出来てないようなもんだよ
同意。掲示板で聞くよりも参考本を読む方が速いしためになると思うよ。
本を読んでわからないところをピンポイントで質問しよう。
(自分で考えてわからないところをピンポイントでもいいけど)
↓この本ならば持ってるので、多分フォローできる。約束はできないけど。
http://www.amazon.co.jp/dp/4875934289
# レスが多めな気がする。そうでもない?これから増える?
# みんなもオセロには思い入れがあるのだろうか...
同じ本持ってます。オセロ作りについて基本的なことはそれなりに書いてあると思います。
# 思い入れといえるかわかりませんが、オセロは学生時代に作ったなぁと…(MS-DOS版だった)。
> この仕組みから、反転を行うには具体的にはどういうことをしたらよいのでしょう
か?
反転する前に石が置けるかチェックが必要だね。
1.石を置く(x,y)の位置より8方向をチェック
2.8方向のうちどれか1方向でも石を反転可能なら石は置ける
// 石(白,黒)が置けるかチェック
bool check( int x, int y, int mx, int my, int color )
{
do {
x += mx;
y += my;
if ( ボードの範囲以外 ) return false;
} while ( Board[y][x] == color );
return (Board[y][x] == 0) ? false : true;
}
// 8方向の調査
int check8( int x, int y, int color )
{
int dir8 = 0x00;
// 白黒の反転
switch ( color ){
case 1: color = 2; break;
case 2: color = 1; break;
default:return 0;
}
dir8 |= check(x,y,+0,-1,color) ? 0x01 : 0x00; // 上側
dir8 |= check(x,y,+0,+1,color) ? 0x02 : 0x00; // 下側
dir8 |= check(x,y,-1,+0,color) ? 0x04 : 0x00; // 左側
dir8 |= check(x,y,+1,+0,color) ? 0x08 : 0x00; // 右側
dir8 |= check(x,y,-1,-1,color) ? 0x10 : 0x00; // 左上
dir8 |= check(x,y,+1,-1,color) ? 0x20 : 0x00; // 右上
dir8 |= check(x,y,-1,+1,color) ? 0x40 : 0x00; // 左下
dir8 |= check(x,y,+1,+1,color) ? 0x80 : 0x00; // 右下
return dir8;
}
後は自分で考えよう。
ちなみにcheck8関数は石を置ける方向に0x01~0x80のビットを立てる。
0x00なら石は置けない。
check関数を石の反転関数に置き換えればお好みの反転処理が可能。
参考になりそうなリンクを貼っておく。
http://www.geocities.co.jp/SiliconValley-Bay/4543/Osero/index.html
http://www.sm.rim.or.jp/~shishido/gamedev.html
http://hp.vector.co.jp/authors/VA015468/platina/algo/index.html
僕もMS-DOS時代にオセロを作りました。
4人対戦可能なオセロ?です。
oopsさん
環境はVisualC++ 2008 Express Editionです。
たいちうさん Banさん
思考ルーチンだけだと思っていたら、
思考ルーチンだけじゃなくて基本までのっていました。
ありがとうございます。
オレンジフィッシュさん
詳しく書いていただいてありがとうございます。
a