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万回のループを行うというのは、安全ではあるけれども技術者感覚ではあまり美しい実装には思えない。

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

(つづく)

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

Borland C++ Compiler 5.5 を導入するのは今回が初めてではない。数年前、これが無料公開されてすぐにダウンロードしてしばらく使っていた。ただ、人に使ってもらうツールがいつまでもコマンドラインツールではさすがに申し訳なくなってきたので、C++Builder や Delphi に移行して現在に至るわけだ。

C++Builder も Delphi もどちらもボーランド製の開発環境だ。僕は Turbo-C の時代からボーランド製のCコンパイラは愛用し続けている。住まう世界が Windows になってからも、しばらくは Turbo C の Windows 版を使っていた気がする。

で、数年前にダウンロードした Borland C++ Compiler 5.5 のアーカイブはとっくに削除していたので、今回改めてDLしにボーランドサイトへアクセスする。
http://www.borland.co.jp/cppbuilder/freecompiler/

…あれ? DLの前に「ボーランドMy Page」に登録せよとか書いてある。以前は、コンパイラについてはこんな手続きなしに勝手にDLできたような気がしたんだけど…(Turbo Debugger だけは登録が必要だった)。というか、Borland のサイトに My Page って言われてもなー。でも登録しなければ使えないということなので、しかたなしに My Page を作る。まぁ、Borland のユーザ登録は80年代からしているので、今さら Borland に個人情報を隠してもしょうがないし。

ということで無事にDL成功。My Page は、予想通りただの宣伝ページだったので、もう2度とアクセスすることはなかろう。

喜々として Borland C++ Compiler 5.5 のインストールとセットアップを行う。セットアップと言ってもコンパイラ本体に Path を通すだけだが。Readme.txt には bcc32.cfg と ilink32.cfg を作れと書いてあるが、これはレスポンスファイル1個で事足りる(レスポンスファイルを -@ オプションで指定すればよい)。ということで "Hello World(えー)" とか表示するコードを書いてコンパイル。成功。

うわー、コマンドラインコンパイラってこんなにお手軽だったっけ?orz

しばらく RAD ツールばかり使っていたので、こういう世界をすっかり忘れていました。Borland C++ Compiler 5.5 をインストールするか、と決めてから "Hello World(えー)" の表示までわずか15分。なんだかなー。仕事に必要な使い捨てツールを4つほど書いて完了。やれやれ。

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

プログラムのお仕事をやっていると、何かと小物ツールが必要となるケースに出くわす。

最近は、この手のツール類は Delphi で作ることにしている。Pascal ライクな教条的言語仕様には時々うんざりすることもあるけれども、外部ユニットの取り込みやすさは、一度経験してしまうと離れられないほど便利でお手軽だ。

何しろ、必要なファイルをコピーして、それを uses 節で宣言すればもう終わりなのだ。たったこれだけで外部ユニットにすべての機能が使えてしまう。Delphi のコンポーネントライブラリは世界中に無数にあり、それらがすべてこの方法で使用できる。素晴らしい。C/C++ 処理系だと、ヘッダファイル・makefile・ライブラリアン等々、煩わしい事前手続きが山のようにあるのとは対照的だ。

そんなこともあって Delphi を多用しているのだけれども、単にアルゴリズムのテストをしたい、というような使い捨てレベルのツールで試行錯誤するのは Delphi でも何かと面倒なことが多い。というか、数行のコードのためにわざわざ RAD ツールを使うのはどうなのかと。歩いて1分のコンビニへ車に乗って出かけるようなものだろう。

ということで、フリーのCコンパイラである Borland C++ Compiler 5.5 を導入することに決めた。

(続く)

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

このページのトップヘ