オセロの基本 – プログラミング – Home

通知
すべてクリア

[解決済] オセロの基本


たか
 たか
(@たか)
ゲスト
結合: 25年前
投稿: 73
Topic starter  

はじめまして! たかと申します。

現在プログラミングにはまっていて、オセロをつくっています。

参考本とかはまったく見ずに自分でほとんどつくっています。

今は・・・

・クリックするとそのマスに選択されている石を表示
・黒と白の数を表示
・一度置いたとこには置けない

というところまでできました。

次は・・・

・石ではさむと反転する

というのを実装しているのですが、

上記のように参考本とかを見ないでつくったので、

今から参考にしようとしても遅かったのでわかりませんでした。

それで質問させていただきました。

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


引用未解決
トピックタグ
あー
 あー
(@あー)
ゲスト
結合: 17年前
投稿: 18
 

それほとんど何も出来てないようなもんだよ


返信引用
あー
 あー
(@あー)
ゲスト
結合: 17年前
投稿: 18
 

あ、もしかして対人のみか


返信引用
たか
 たか
(@たか)
ゲスト
結合: 25年前
投稿: 73
Topic starter  

対人のみです。
まずは基本なので・・


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 反転を行うには具体的にはどういうことをしたらよいのでしょうか?

1. 位置(x,y)に色cのコマを置いたとき、反転するコマがあるか否か(true/false)を返す
関数。
2. 位置(x,y)に色cのコマを置いてコマを反転させる関数。
3. [1]の結果をtrueとする(x,y)がすくなくとも一か所存在するか否かを返す関数。

とまぁ、このくらいあればゲームが作れそう。


返信引用
oops
 oops
(@oops)
ゲスト
結合: 17年前
投稿: 28
 

環境は何?

置いたところの縦横斜めを調べてひっくり返せるか見る。
ひっくり返せたら Board[8][8] を書き換えて画面に反映。

具体的に何の作業がわからんのかな?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> それほとんど何も出来てないようなもんだよ

同意。掲示板で聞くよりも参考本を読む方が速いしためになると思うよ。
本を読んでわからないところをピンポイントで質問しよう。
(自分で考えてわからないところをピンポイントでもいいけど)
↓この本ならば持ってるので、多分フォローできる。約束はできないけど。

http://www.amazon.co.jp/dp/4875934289

# レスが多めな気がする。そうでもない?これから増える?
# みんなもオセロには思い入れがあるのだろうか...


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

同じ本持ってます。オセロ作りについて基本的なことはそれなりに書いてあると思います。

# 思い入れといえるかわかりませんが、オセロは学生時代に作ったなぁと…(MS-DOS版だった)。


返信引用
オレンジフィッシュ
 オレンジフィッシュ
(@オレンジフィッシュ)
ゲスト
結合: 18年前
投稿: 58
 

> この仕組みから、反転を行うには具体的にはどういうことをしたらよいのでしょう
か?
反転する前に石が置けるかチェックが必要だね。

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人対戦可能なオセロ?です。


返信引用
たか
 たか
(@たか)
ゲスト
結合: 25年前
投稿: 73
Topic starter  

oopsさん
環境はVisualC++ 2008 Express Editionです。

たいちうさん Banさん
思考ルーチンだけだと思っていたら、
思考ルーチンだけじゃなくて基本までのっていました。
ありがとうございます。

オレンジフィッシュさん
詳しく書いていただいてありがとうございます。


返信引用
a
 a
(@a)
ゲスト
結合: 23年前
投稿: 59
 

a


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました