« オセロ(c)ゲームを作る!初回構想 | トップページ | オセロゲームを作る!基本動作を考える »

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が使えるのに。。。

|

« オセロ(c)ゲームを作る!初回構想 | トップページ | オセロゲームを作る!基本動作を考える »

オセロ」カテゴリの記事

「プログラミング」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/3317/57153964

この記事へのトラックバック一覧です: オセロゲームを作る!データ構造を考える:

» オセロゲームを作る!基本動作を考える [ヴァルヘルのソフト開発日記]
データを圧縮するためと無駄な探査をなくすために、向きが違うだけのオセロ盤は同じも [続きを読む]

受信: 2013/04/13 11:38

« オセロ(c)ゲームを作る!初回構想 | トップページ | オセロゲームを作る!基本動作を考える »