|
前頁では話が少し堅くなってしまいました。ここでは少し柔らかい話を、という事で、ゲームな話を少し考えてみます。
日本国内でコンピュータ的なゲームというと、ゲームセンターで流行ったインベーダーゲーム、携帯用ゲームでは「ゲーム電卓」や「ゲームウォッチ」等がありました。こういった1人用ゲーム以外にも、テーブルテニスのような対コンピュータ戦はあるけれども2人でプレイする対戦型のゲームがありました。対戦型ゲームといえばこの他にも、レーシングゲーム、格闘ゲーム、撃ち合いのゲーム、パズルゲーム、アクションゲーム、クイズゲーム等があります。思えば、オセロ、囲碁、将棋、麻雀、双六、等のボードゲームは対戦型が多いですね。
また、協力型ゲームというものもありますね。シューティングゲームで2プレイヤー同時進行するもの、RPG、等。特にネットワーク上でのオンラインRPGというのは現在世界的に流行しています。
というわけで、マルチプレイヤーゲームを考える場合は、システムやシナリオも当然ですけれども、対戦型なのか協力型なのか、それとも混合型(一緒にシナリオを進むけれどもポイントや経験値・レベル・アイテム等の違いで競うタイプ)それによってエンディングのありかたも多少変わるのかもしれません。
Windowsでネットワークを利用したマルチプレイヤーゲームを作成する場合は、通常、DirectX の「DirectPlay」というAPIを使う場合が多いかもしれません。ゲームソフトであれば、ジョイスティックやゲームパッドで「DirectInput」、サウンド関連で「DirectSound」、2D画面表示で「DirectDraw」、3D画面表示で「Direct3D」等を利用する事になる場合も多いので、DirectX(GAME-API)が利用される場合が多いと思います。
ですが、Delphiでは DirectXを簡単に使える環境や参考書の類が非常に少ないですし、データベースをテーマにしていますので、ここではDirectXには一切触れません(私自身、DirectXの知識も経験もないというのが現実だったりしますけれど)。
さて、マルチプレイヤーなゲームソフトを作る、という事は、まず、プレイヤーの管理を行うためのテーブルが必要なように思われます。プレイヤーの名前、ログイン(ゲームに参加)しているかどうか、プレイヤー同士の同期の問題、得点を管理するなんて事も。ゲームにも依りますが、プレイヤーが操作するキャラの座標や状態などを保持する必要もありそうです。
ただ、キャラをリアルタイムに扱う(短い時間毎に情報が更新される)場合は、データベースアクセスが頻繁に起きる、つまり、データベースエンジンの負荷が上がる可能性はありますので一応留意しておくのが良いでしょう。また、ゲーム全体の状態をデータベースに入れて更新・管理を行うのか、いやそれだと負荷が掛かりすぎるから各PCで出来る事は各PCで行うようにするのか、といった切り分けが必要になる場合もあるかもしれません。それにより、PCによって、同じ画面のはずが、違った画面になってしまう可能性もありますが、何も無い状態でそこまで危惧するのは考え過ぎかもしれません。
データベースでゲーム、となれば、一番ありがちなパターンとしては、クイズゲームでしょうか。質問の文章、答え、選択方式であればその答えの候補、質問の並びを変えるための番号、等が必要となるでしょう。クイズのパターンとしては、入力方式か選択方式か。入力方式の場合は漢字のみ許可するのか仮名でも許すのか。色々と許す事になると正解の判断が難しくなります。選択方式の場合は何択にするのか。画像やサウンドが必要になる場合は別途、サーバーの共用フォルダ内にそのデータを入れておくようにしておけばいいでしょう。入力待ちをするのか早押しか。正解者全員が得点+なのか、早い者1人だけが+なのか。これらの混合タイプにするのか。等、色々と決める必要はありそうです。質問&答えのデータベースを作るのも大変でしょう。管理者が一括して作業するのではなく、各PCで質問&答えを各自作成出来るようにするのも良いかもしれません。
それでは物は試しに作ってみましょう。
プロジェクト「d014」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「d014」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
タイトル | d014−クイズゲーム |
[ディレクトリ/条件]頁
パス及びディレクトリ | C:\DelphiProgram\db\d014 |
トップメニューから、いつものデータベース設定の画面、そこで、利用者名の登録も出来るようにしておきます。データベース名は「GAMES.FDB」固定として、テーブル「PLAYER」、クイズQ&Aテーブル「QUIZQA」、とします。データファイルはこれまでプログラム名+拡張子「.dat」としていましたが、これから作成する他のゲームでも同じフォルダに置いて共通で利用したいため、共通の部分については「games.dat」という名前で固定にします。そうすれば何度も入力する必要は無いでしょう。そのソフト独自の設定についてはこれまでと同様、個別に保存・呼出しするものとします。
テーブル「PLAYER」
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
名前 | PNAME | 文字(最大半角16文字) |
パスワード | PASWD | 文字(最大半角 8文字) |
ゲーム総合得点 | POINTS | 倍精度実数(浮動小数点) |
テーブル「QUIZQA」
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
並替番号 | SN | 整数 クイズの順番を決定させる |
質問文1 | Q1 | 文字(最大半角50文字) |
質問文2 | Q2 | 文字(最大半角50文字) |
質問文3 | Q3 | 文字(最大半角50文字) |
質問文4 | Q4 | 文字(最大半角50文字) |
正解の答え | ANS | 文字(最大半角30文字) |
不正解1 | AN1 | 文字(最大半角30文字) |
不正解2 | AN2 | 文字(最大半角30文字) |
不正解3 | AN3 | 文字(最大半角30文字) |
正解番号 | ANN | 整数 ランダムで 1〜4 のいずれか |
テーブル「QUIZMEM」ゲームに参加するメンバー
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
プレイヤー番号 | MN | 整数 プレイヤーの登録番号 |
状態 | OK | 整数 |
ゲーム得点 | GP | 整数 |
テーブル「QUIZANS」質問に対する答えを登録するテーブル
名前 | 変数名 | 内容 |
登録番号 | N | 整数 ダミー |
プレイヤー番号 | MN | 整数 プレイヤーの登録番号 |
指示した答え | AN | 整数 1〜4 |
メイン画面は、ゲーム開始をする画面と、データベース設定やQ&Aデータベースを作成を行う画面を切り替えるようになっています。
恒例のごとくデータベース設定を最初に行います。そこでプレイヤーの名前・パスワードを入力&登録するようになっています。簡単なテストとして「sample.txt」を入れてありますので「(6)Q&Aデータ読込み」を行ってみて下さい。「(7)メンバテーブル削除」は何らかの不具合等でおかしくなった場合、テーブル「QUIZMEM」「QUIZANS」を削除します。これによりゲーム再開が出来るようになる場合があります。Q&Aデータの入力・編集・一覧については前回とよく似ていますので説明は省略します。
ゲーム開始をすると以下のような画面が表示されます。
各PCで実行し、[準備OK]をクリックして、しばらく待ち状態になったあとにクイズゲームがスタートします。10問あります。終了した時に一番多く答えた人に、プレイヤーテーブル「PLAYER」のゲーム総合得点が加算されます。
ゲームスタートすると、問題欄に問題が出題され、答えの4つのボタンに4つの解答が表示され、どれか1つを押す事が出来ます。問題やカウントは 約0.5秒毎に増えていきます。参加メンバーの箇所にはテーブル「QUIZMEM」の監視を行い、状態の箇所にはテーブル「QUIZANS」の監視を行った結果を表示します。約1秒毎に行っています(実際にはタイマ割込処理等も入りますのでもう少し掛かります)。流れとしては、
1)準備状態
参加メンバー状態のチェック
[準備OK]が押されるのを待ちます
2)全員○状態になったら追加の参加者待ち状態に
カウンタ表示
3)ゲームスタート:問題出題
4)問題出題中
答えがあったかどうかテーブル「QUIZANS」の監視を行います
5)問題出題後のウエイト
答えがあったかどうかテーブル「QUIZANS」の監視を行います
6)問題終了
各PCの同期をとります
7)答え合わせ
一番早く正解したメンバーのGPが+1されます
8)次の問題へ
各PCの同期をとります
10問終えたら終了処理を行います
それ以外は3)へ
9)終了処理
最高得点(GP)を探して、
自分がその得点になっている場合は、
テーブル「PLAYER」の POINTS値を加算します。
最高得点が1人であれば+1されます。
同じ得点のプレイヤーが複数居れば、+1を折半します。
テーブル「QUIZMEM」「QUIZANS」を消して
最初から行います。
という感じです。
ただ、色々と考えていくと混乱しそうになります。このゲームでは途中参加は出来ませんが、途中参加を出来るようにするかどうか、同期、テーブルへの書き込み、テーブルの監視、などをしっかり整理・管理するのが良いでしょう。1秒毎のテーブル監視と、状態・答えの書き込みなどで、データベースのアクセスは頻繁に起きています。
今回は実行プログラムとサンプルデータを一緒に圧縮しています。プログラムの内容についてはかなり煩雑になってしまったのでソースプログラムは含めておりません。
全PCで同時に実行し、リアルタイム(※処理としては時分割(タイムシェアリング)になります)に状況を保存・呼出をして反映させるタイプのほか、双六ゲーム等のように、PC間で順番に交代していく(1台のPCが実行している間、他のPCではサーバーへの保存は行わない;状況を取得するため呼出・反映は行う)というタイプも有り得ます。こちらの方がサーバーへの負荷はやや軽くなるでしょう。
ゲームプログラムの場合は、コンマ何秒での処理が必要になる場合も多いので、データベース利用というのは余り向かないかもしれませんが、色々と考えてみるのも面白いのではないかと思います。
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
シェアウェア
Script!World
データベース
A B C D
E F G H
I J K L
M N O P
Q R S T
U V W X
Y Z
|