たくさんの打ち手をデータベースにため込むので、効率的なデータ構造を考えてみる。
まずオセロ盤データ。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が使えるのに。。。