ヴァルヘルのソフト開発日記

動画管理や録画予約、本の発売予定などの便利ツールの開発状況のお知らせ

2013年04月11日

オセロゲームを作る!データ構造を考える

 たくさんの打ち手をデータベースにため込むので、効率的なデータ構造を考えてみる。

まずオセロ盤データ。8×8マスで黒と白の駒と空白。一マス2ビットで表せる。

2bit×64マス= 128ビット

64マスあるので組み合わせは2の64乗・・・10京くらい?(兆の次は京だったっけか・・・)

さらに空白のマスを考えるとその60倍・・・。

オセロ盤データにIDを振るのでIDに64bit(LongInt)。

オセロ盤データが何手目のデータを持たせたい・・・60手まであるのでTinyIntかな。

1手目と2手目を同時に参照する必要はないからテーブルを分けちゃえばいいかな。

ということでテーブルを61個作成。

create table オセロ盤(1目~60手目 + 最後の盤) {

オセロ盤ID: LongInt(64bit) (プライマリキー、自動連番かな)

コマ黒前: Int(32bit) (Delphi6で作る場合32bitまでしか扱えないので) 

コマ黒後: Int

コマ白前: Int

コマ白後: Int

}

次にどこに打ったかというデータを保存するので必要な項目は

オセロ盤ID・・・どのオセロ盤に対応する手か

打つ場所・・・1 - 64のどこか(オセロだとA1 - H8というらしい)

次のオセロ盤ID・・・打った結果、どのような配置になるか

色・・・白か黒か

何手目か

最多コマ数・・・ここに打った時に何コマ取れたか

最少コマ数・・・初手から数手は最多64、最少0で落ち着きそう

何回勝ったか・・・ここに打った時の勝つ確率(勝ち数 - 負け数でいいかな?)

探索完了フラグ・・・その手から派生する全手を探索したらフラグをたてる。

オセロ盤と同じで1手目と2手目を同時に参照することはないからテーブルをわけてもいいかも。

白と黒も同時参照はないからいらない。

create table 打ち手(1手目~60手目) + (黒か白) {

 オセロ盤ID: LongInt(64bit)・・・プライマリキー

打つ場所: TinyInt(8bit)・・・プライマリキー

 次のオセロ盤ID: LongInt

 最多コマ数: TinyInt

 最少コマ数: TinyInt

 何回勝ったか: Int(32bit) 足りるか?

 探索完了フラグ: False or True(1bit)

テーブルは120個・・・1手目は黒しかありえないし、2手目は白しかありえないが・・・

DBは何にしよう。

仕事で使い慣れたOracleとかSQL Serverにしたいが趣味で使うには高すぎる。

Express版だとDBサイズが2GBまでらしい。

しかし、本気で全手探索をしたらペタバイトのディスクがいる。

とりあえず無料の MySQLでも使ってみるかな。

しかしDelphiだとODBCでしか接続方法がなくて遅そう。OracleならOCI、SQL ServerならADOが使えるのに。。。


プログラミング
オセロ