moon Gamer - ボードゲームブログ

テーブルゲーム(ボードゲームやカードゲーム等々)と、その周辺の話題を中心にした個人ブログです。

タグ:プログラミング

moon Gamer

自分が仕事で主に使用しているデータベースは MySQL で、クセもコツもある程度は把握している。最初はこれを使おうとも考えたが、環境を変更するたびにデータベースの再インストールをするのは面倒だ。今後、ひょっとしたら公開する可能性もある(まさかユーザ全員に MySQL をインストールさせるわけにはいかない)。無償データベースには PostgreSQL や SQL Server 2005 Express Edition 等々いくつかあるが、上記と同じ理由によりこれも却下。

ではどうするかというと、以前から知識としてだけはあった小型・軽量の組み込みデータベースである SQLite を使ってみることにした。で、Visual C++ なら以下のページに詳しく書いてあるので、そのままやればよい。SQlite のバージョンが古く、さらに Express Edition だが、Professional Edition でもだいたい同じ手順で行える。

[SQLiteで組み込みDB体験(2007年版)]
http://codezine.jp/a/article/aid/1252.aspx

これでめでたしめでたし… ではつまらないので、個人的に小物ツール作成やホビー用途に使用している Borland C++ Builder 6(以下BCD6)でも SQLite を使ってみることにする。

SQLite は上記サイトの説明と同じように以下からダウンロードする。

[SQLite Download Page]
http://www.sqlite.org/download.html

ダウンロードするファイルは「Source Code」の「sqlite-amalgamation-3_5_1.zip」にする。これならソースファイルがひとつにまとめられていて扱いが簡単だからだ。これを解凍したらソースファイルとヘッダファイルは同じフォルダに入れておく。なお、SQLite サイトには、他にコマンドラインツール類もあるので、必要ならそちらも落としておくといいだろう(もちろん後でも構わない)

次は BCD6 の設定を行う。メニューから「ファイル」→「新規作成」→「その他」から「コンソールウィザード」を選択する。

moon Gamer

ソースの種類を C にして、プロジェクトソースはダウンロードした「sqlite.c」を指定する。ここまでやったらひとまず(メイクではなく)コンパイルしてエラーが出ないかを確認しておく。警告が山ほど出るのは気にしない(これは VC++ でも状況は同じ)。

※以前のバージョンでは 一部 struct 定義中にある const の変数が初期化されていない旨のエラーが発生していたが、現在のバージョンでは修正されたようである。

続いて以下のページのソースコードを sample.cpp として別途テキストエディタで作成する。
http://codezine.jp/a/article/aid/1252.aspx?p=2

上記で作成した sample.cpp を sqlite.c と同じプロジェクトに追加したら、おもむろにメイク。が、実はこのままメイクすると sample.cpp の36行目付近でエラーが出る。

moon Gamer

解決方法はいろいろだが、ひとまずこの行の前後にある文字列リテラルを単に1行にしてしまうのがよい。

これでメイク完了となるはず(相変わらず警告だらけだけど)。出来上がった実行ファイル(Project.exe とかなんとか)をコマンドプロンプトから実行して、以下のような結果が表示されたらOK。

moon Gamer

この下準備は何をしているのかというと、メモリ上にデータベースを作成する実験だ。これによって、高速かつ高機能なデータベースを簡単に利用することができるようになる。軽量データベースとはいえ、以下のように扱える SQL 言語は豊富に揃っているのでものすごく便利だ。

[SQLite が認識できる SQL]
http://www.net-newbie.com/sqlite/lang.html

これで開発の下準備は出来た。
今後、ヒマな時間を見つくろって、総合的な「18xx」管理ツールの作成を進めてみたいと思う。

    このエントリーをはてなブックマークに追加

moon Gamer

「1846」の資産管理システムもどきを Excel のマクロ(VBA)を使って開発した話は少し前に書いた。以前から「18xx」の管理システムのアイデアは頭の中にもやもやと持っていて、機会があればまとめようとは思っていたので、今回、「1846」のおかげでこれを形することが出来たのたのは大きな前進と言って良い。ひとまず目標は達成したとも言える。

ところで、こいつの開発中にあることに気がついた。

「18xx」では、資金の扱い方が、他でありそうで実はあまり例のないルールによって構成されている。銀行が中立の資金プールとなっているのはよくあるルールだが、総資金額が定められており、資金が銀行から枯渇するとゲーム終了条件を満たす(ただし枯渇した後は資金量に上限がなくなる)。つまりプレイヤーは、有限の資金を取り合うゼロサムゲームを行っているようなものだ。

何が言いたいのかというと、「18xx」において資金とは、何かに付随するプロパティではなくオブジェクトそのものではないかということだ。

具体的には、ゲームで扱うすべての $1 札は個別にオブジェクトとし、各々の「$1 札オブジェクト」の所有名義を参照/更新することで、それら所有者の財産を管理したり計測する処理が簡単に実現する。すなわち「18xx」において収入や支払とは、各 $1 札の所有権を、現在の所有者から別の所有者へ移行することを純粋に意味しているのである。

ただこの方法では、$1 札単位でオブジェクトを管理することになるので、その数(つまりお札の枚数)が多くなるとオブジェクト数(というかインスタンス数)も増大する。総資金量の多い「18xx」だと、初期の銀行資金は2万ドルくらいのオーダーとなるだろう。資金が少しでも動くたびに、平凡に2万回のループを行うというのは、安全ではあるけれども技術者感覚ではあまり美しい実装には思えない。

もっとも、実際のところ総オブジェクト数(インスタンス数)が万のオーダーくらいなら、アルゴリズムを工夫して高速化を図る手法を模索する考え方は決して非現実的でもない。しかしここはもう少し楽をする(あるいは拡張性に柔軟性を持たせる)という意味で、データベースのお世話になれないものか考えることにした。

(つづく)

    このエントリーをはてなブックマークに追加

このページのトップヘ