[ゲーム制作本 紹介] 小一時間でゲームをつくる 7つの定番ゲームのプログラミングを体験

小一時間でゲームをつくる 7つの定番ゲームのプログラミングを体験

 ゲームクリエイターやプログラマーのインタビューでゲーム業界に入るきっかけなどの回答を読んでいると、雑誌のゲーム投稿ページのプログラムを電気屋のPCに打ち込んでいましたとか、MSXでプログラムしてましたとか回答しているのを一昔前はよく見かけた。当時はゲームクリエイターなんて職業は無くて、ゲーム開発者は多くの場合がプログラマーだった。そのうち音楽やイラストや文学など多くの視点からゲームへのアプローチがあり、様々なゲームのジャンルが花開いたと言える。少なくとも私はゲームの進化をそう捉えている。

 その当時に私がプログラミングに挑戦していれば、ゲーム業界で働いたという未来もあったのかも知れない。実際のところ私はPCも持っていないのに「マイコンBASICマガジン」を買っていたし、自分でゲームを作れたらいいのになぁなんて思ってもいたのだ。まだ中学生だった私には知識も情熱もオツムも足りなかったので、40年近くたってやっとその夢に着手できたわけだ。

 ファミコンを遊んでいた頃は文字やアスキーアートで表現したゲームをバカにしていたりもしたが、今になってみるとそれがとても夢のあるモノに思えて気になっていたのだ。あの頃、電気屋でベーマガ片手にプログラミングする情熱と図々しさがあれば、もしかしたら自分もレジェンド級のゲームクリエイターになっていたかも……なんて。「小一時間でゲームをつくる 7つの定番ゲームのプログラミングを体験」は、そんな私の後悔と願望を叶えてくれる本だ。

 Unityのようなツールでグラフィカルなゲームを比較的容易に作れるのも素晴らしいが、ゲーム黎明期のようなシンプルなアルゴリズムのゲームを作ってみるのも素晴らしい。使用するのはC++と無料で入手できる「Visual Studio」のみ。画面もすべてアスキーアートで表現する。誤植がちょっと多いのがたまに傷だが、正誤表もちゃんとホームページにあるので心配はない。

 おかげで私は1980年代に置いてきた夢と後悔を拾ってくることができた。ゲーム制作を始めたばかりの方にも、アルゴリズムに集中して学べるのでおすすめだし、Unityなどのゲーム開発ツールを使っている方にも、開発ツールのどういう部分が便利なのか理解できるようになるのでおすすめだ。ちょっとした趣味でゲームを作ってみたいというのもいいだろう。本に書いてあるとうりに打ち込むだけでゲームは完成する。そのちょっとした挑戦こそ、人生が楽しくなるコツなのだと思う。

内容を各章ごとに紹介

 問題のない範囲で本の内容をイメージできるように各章ごとに簡単に紹介したい。

第1章 王道RPGの戦闘シーンを作成する

 ここではドラクエ等に代表されるコマンド選択と文章で進行する戦闘シーンを作成する。HP・MP表示やAAでの敵キャラの描画、たたかう・じゅもん・にげるのコマンド設定。私たちの大好きなあの画面の戦闘シーンをプログラミングする。画像ファイルが無くてもここまで作れるのかとワクワクする。いきなりボス戦を作るのでちょっと面食らう。

 シンプルな画面だが裏でやることが意外と多いことが実感できる。プレイヤーと敵キャラのステータスの設定と表示。交代に攻撃してゆく仕組み。コマンドまわりの設計と選択する仕組みの実装。攻撃とダメージの計算と戦闘終了の仕組み。ザコとラスボスの差し替えと回復呪文とMPを使う仕組みの実装。画面に現れている以上にやることは多い。

 完成して動かしたときの感動はひとしおで、中の仕組みまで理解したうえでゲームが動いているという事実に興奮する。最初から最後までプログラミングしたという実感。第1章はそれを体験するための場所なのだと思った。

第2章 ライフゲームを作成する

 ライフゲームというのはマス目に配置されたセルが一定のルールによって増減し、まるで生命を持っているかのように動くのを観察するシミュレーションゲームだ。マインスイーパーのフィールドを思い浮かべてもらえば、その見た目は想像しやすいだろう。配置するセルには2種類あり、生きたセルと死んだセルだ。マインスイーパーでいう爆弾のあるマスが”生きたセル”になるわけだ。

 フィールド上にパターンとして生きたセルを任意の範囲に並べる。パターンは棒でもいいし文字や絵みたいな形でもいい。最初に並べた状態が第1世代となる。そこから一定のルールで世代を進めてゆき、セルの増減を観察するという遊びだ。最初の状態によって永遠に増減を繰り返す場合もあるし、すぐにセルが全部消滅してしまい滅亡することもある。地味なゲームだが、セルが増減を繰り返す様子には目を奪われる。時には生命のように、時には花火のように、様々な姿を観察できて意外と楽しい。一見の価値のあるゲームだ。

 さてその”ルール”なのだが、それはひとつのセルがいくつの”生きたセル”に囲まれているかで、そのセルの生死が決まるというものだ。マインスイーパーでいうと、任意のマスの周りにいくつ爆弾があるかという数字がそれにあたる。そのセルの周囲にある”生きたセル”の数によって、そのセルが「死ぬ」のか「のこる」のか判定され、そのセルが”死んでいるセル”なら特定の条件で”生きたセル”として復活するのだ。

 以上の仕組みをプログラミングしてゆくわけだが、ルールが正しく適用されるためのプログラムが必要だ。フィールドの範囲と範囲外をコンピュータに教えること、フィールドの範囲のすべてのセルについて判定することなどだ。フィールドに置くパターンの宣言と描き込みや、世代を進行させる処理なども実装しなくてはいけない。

 ここで学ぶ処理のなかで最も重要なのは、フィールドの範囲内に存在するマスすべてにアクセスする方法だ。2次元のゲームを作るうえで絶対に必要な要素なので、ここではそれをしっかり認識して学ぶべきだと思う。

第3章 リバーシを作成する

 ここでは対戦ゲームの定番であるリバーシをプログラミングする。ゲームのルール自体は誰でも知っているし単純なので説明の必要はないだろう。しかしその単純なリバーシもそう簡単にプログラミングできるわけではない。この第3章では対戦相手と交代で打つ2PモードとAIと対戦する1Pモード、加えてAIの対戦を観戦するモードも実装する。

 石を置く盤面を描画し選択して石を置く方法や、石の色を交互に切り替える方法を学ぶ。石が置ける場所なのか判定しなくてはいけないし、石が置けないのなら順番をパスしなくてはならない。最後まで打ったら石の数をカウントして勝敗を決める。そのほとんどの工程にすべてのマスにアクセスすることが必要になっている。

 最後にAIが石を置く判定をする仕組みを実装して1Pモードと観戦モードを作る。実装するAIは非常に簡素なもので、いい感じに動くのか大丈夫なのか心配になるが、遊んでみるとなかなか楽しい。ここからAIを強くするにはどうしたらいいのか考えるのも面白いだろう。

第4章 落ちものパズルゲームを作成する

 みんな大好き落ち物パズル。その中でも最も有名でシンプルなテトリス形式のゲームの作り方を学ぶ。本家のテトリスよりブロックの形状や種類も少ないしフィールドの形も変則的なので、出来上がるゲームはあくまでテトリス風なことには注意だ。しかし自分で改造すればまんまテトリスに仕上げることも可能なので、そこまで作り込んでいくのもいいだろう。

 ここで学ぶアルゴリズムはブロックの落下や回転、積み上がる判定と横に揃うと消える処理、それに伴うブロックの下方向へのずらし等だ。当たり判定や時間進行による描画の繰り返しなど、これまでに学んだ方法を総動員してアルゴリズムを組み立てる。

 このゲームを作ることによって、同じアルゴリズムでも発想によって色々な表現ができるということが実感できた。ブロックを積み上げて綺麗に行が消えて残った上のブロックが落ちる。これだけのアルゴリズムの連鎖がちゃんと動いてくれると感動する。 

第5章 ドットイートゲームを作成する

 こちらの元ネタは「パックマン」。若い世代では遊んだことのある人は少ないかもしれないが、ゲームといえば「インベーダー」か「パックマン」がその代表格だった。ゴーストから逃げつつステージ上に配置されたエサを全部食べればクリア。スーパーエサを食べると数秒間だけゴーストを食べられるようになる。今回はスーパーエサは無しのゲームになる。

 ここで学ぶのはAIを組み込んだ4種類のモンスターのプログラミングだ。ランダムに動くモンスター、プレイヤーを追いかけてくるモンスター、プレイヤーの先回りをするモンスター、追いかけモンスターと連携して挟み撃ちしてくるモンスターの4種類だ。フィールド内の迷路でプレイヤーの位置とモンスターの位置からルートを探索して動かすAIをプログラミングする。

 非常に単純な仕組みのAIで作成するが、動かしてみると各モンスターが生き生きとプレイヤーの邪魔をしてくる。アイデア次第でキャラクターに個性がつけられる面白さを感じられた。

第6章 疑似3Dダンジョンゲームを作成する

 3DダンジョンRPGの名作「ウィザードリィ」風のゲームを作る。今をときめくオープンワールドFPSゲームの原形にあたると言ってもいいだろう。文字だけで3Dダンジョンを表現した夢のあるゲームである。ダンジョンを歩く臨場感、物語を進めてゆく楽しさ、モンスターとの戦闘など、現代にも引き継がれている要素がもりだくさんだ。

 今回の目玉は自動生成ダンジョンのプログラミングだ。大きさの決まったフィールド内にランダムでルートを選んでダンジョンを生成する。プレイヤーの視界に入るマスに対応したAAを表示して3Dダンジョンの景色を表示する。仕組みはそう難しくはないが、実現するためのプログラミングは初心者には手強い相手だ。プログラムも長くなってくるので適度に休憩したほうがいい。

 残念ながら戦闘は今回は無しで、ゴールに到達するとエンディング画面に移行してめでたしめでたしとなる。エンディングの文章を書き換えれば好みのシチュエーションやエンディングを作れて楽しい。ただ写経しただけなのだが、ちゃんと動くのが嬉しくて個人的には満足度がかなり高いプログラミング経験だった。

第7章 戦国シミュレーションゲームを作成する

 第7章は作者の戦国解説が熱い戦国シミュレーションゲームのプログラミングだ。「信長の野望」に代表される戦国シミュレーションの簡易版で、使えるコマンドは「進軍」のみである。しかし、好きな大名でプレイしたり文章で物語を感じさせたりとなかなか雰囲気を盛り上げてくれる内容だ。

 これまで作ってきたゲームの集大成のような内容なので、そんなにつまづくところは無かった印象だ。データやパラメーターの仕込みが多いことと、それらを変数としてまとめて扱いやすくすることがポイントになる。データの使いまわしをしやすくすることによって、プレイヤーが大名を選んだり、領地を広げてゆく様をデータで表現できたり、文章を単純化できたりと、その変数化の効果が実感できるだろう。

 クリアまでの行程が長いのだが、パラメーターをいじってすぐにゲームオーバーしたり楽勝で天下統一したりできるので、スタートからエンディングまでちゃんと動くのか容易に確かめることができる。同時にパラメーターの設定次第で神ゲーにもクソゲーにもなることが実感できる。絶妙のゲームバランスをとることの大変さも分かった。

Appendix 1 戦国シミュレーションゲームを三国志に改造する

 こちらも作者の解説が熱い三国志。戦国シミュレーションのデータ部分を加筆修正して見事に三国志に生まれ変わる。文字化けが発生するので、その解決法も記載してある。

Appendix 2 王道RPG 完全版

 第1章で作成した王道RPGに複数のマップと王城と魔城追加、それに王様、姫、魔王を配置して一通り揃った王道RPGが完成する。もうその気になれば自分で「ドラゴンクエスト」が作れちゃう。

感想

 個人的に完成して嬉しかったのは落ち物パズルと3Dダンジョンだった。自分がよく知っているゲームというのもあるし、ここから発展させてオリジナルゲームに繋げられそうな感じもしたからだ。Unityで作ればブロックにキャラクターをあしらうこともできるし、永遠に続けられる難易度で手遊びのように遊べるパズルゲームにもできるだろう。3Dダンジョンのほうはモンスターとの戦闘を発生させれば、もっとゲームとして完成度の高いものとなる。

 意外とハマったのがライフゲームだ。世代交代のスピードを速くして遊ぶと、本当に生物のように形が変わってゆく。そのさまを観察しているだけで楽しめるのは発見だった。永久に世代交代するセルも面白いが、適度な寿命を持ったセルを産み出すのが楽しかった。最後のセルが消える瞬間がなんとも言えず、生命の始まりから終わりまでの一生を見せられた気分になるのだ。

 この本のプログラムにはテンプレートのような、まっさらの基本構造が記してある。どのゲームもそこに変数や関数を書いていってゲームのプログラムを完成させる。最初は戸惑うかもしれないが、何回も繰り返しているうちにそれぞれの関係性がつかめてくる。局所的な関数や処理はUnityでも把握できるのだが、プログラム全体から俯瞰して個々の処理や関数の役割の関係性をつかむのはなかなか難しい。

「ゲームを一から組み立てる方法を学べるような本が欲しかった」これはUnityでゲームを作り始めたころからずっと抱えていたモヤモヤだった。Unityのおかげでそれなりに見栄えのするゲームは作れた。でも自分は完全に理解していない。どういうアルゴリズムの積み重ねをすればこうなるのか分からない。ちゃんと納得してゲームを作りたい。

 この本を最後までやり通すことによって、Unityがやってくれている事や簡単にしてくれている事がある程度は理解できたし納得もできた。各ゲームジャンルのアルゴリズムの基本をまんべんなく学べたのもよかった。先人の工夫とアイデアには頭が下がる。これまで使った本のなかでも、私にとって一番に勉強になった本だった。