プログラム講座 初級編8

- 数あてゲームを作ろう -

 初級編8です。今回は簡単な数あてゲームを作成します。今までの講座の中で最もシンプルで簡単なプログラムです。




ゲームプログラムについて
 ファミコンのおかげでゲームプログラマー、デザイナーは大手を振って歩けるようになりました。それだけメジャーになり認知されたという事になります。それに伴ってゲームデザイナーになりたい、ゲームプログラマになりたいという人がかなり増えてきています。ゲームデザイナー養成学校なども花盛りといった所で、勢いは衰えそうもありません。
 ところが、これだけメジャーな産業になりながらゲームプログラムについての本は減ってしまいました。アニメーションの解説本から比べれば十分に多いのですが、ゲームプログラムの宿命からか真にゲームプログラムについてかかれた本は皆無と言ってもよいでしょう。
 ゲームは常に最新技術を追いかけるもの、最新技術を使うものと考えている人もいます。確かに間違いではありません。ところが、この最新技術が手軽に見ることができ、さらに遊ぶことができるため「簡単にできるもの」と思っている人が多いのではないでしょうか。特に中高生など将来ゲームデザイナー、プログラマーになりたいなあ、と考えている人はこの傾向が強いでしょう。

「ヴァーチャファイター3みたいなポリゴン格闘ゲームを作りたいんですが」
「ファイナルファンタジー7みたいなのを作りたいんですが」

 などなど、こちらが固まって(笑)しまう要求(?)も少なくありません。というか、こういうものばかりだったりしますf(^^;
 裏を返せば、そういうハイクオリティなゲームが作れるだけのツールも環境も整っていないという見方もできます。それは、今回の講座とこのページの主旨とは異なってしまいますので取り上げません。この講座では本当に基礎的な部分を勉強してもらいたいと思います。基礎がわかればステップアップもできます。
 今回はゲームの中でも(多分)最もシンプルな「数あてゲーム」を作成します。たかが、数あてゲームですがわずか数行にゲームプログラムの全てが入っていると言ってもよいでしょう。




ゲームの内容を決める
 ゲームの内容をまず決めます。
「そんなの数あてゲームに決まっているじゃないか」
 本当にそうですか? 画面構成は? 入力方式は? ウィンドウを表示するのか? グラフィックは? サウンドは? などなど考慮すべき事柄はたくさんあります。今回は以下のような数あてゲームを作成します。

[1]ウィンドウは標準で表示されるものを使用する
[2]タイトル表示は「数あてゲーム」にする
[3]数は0〜9まで、乱数を使う
[4]数字の入力はINPUT命令を使う
[5]数が違っていた場合は、大小によってメッセージを変える
[6]正解の場合は「正解!」と表示し再度遊ぶかどうか尋ねる
[7]Yが選択されたら[2]に戻りゲームを続行する
[8]Y以外であれば終了する

 これだけ決まれば、これに沿ってプログラムを作成するだけです。重要な事はプログラム前にきちんとどのようなゲームを作成するか決める事です。ただし、あまり細かくする必要はありません。というのも、遊んでみていまいち面白くない場合や、遊びにくい場合は改良、改造するためです。



[2]タイトルの表示
 タイトルを表示するにはPRINT文を使用します。今回は「数あてゲーム」と表示するだけですので以下のようになります。

PRINT "数あてゲーム"

 ただし、これだけでは画面にごみが残っていた場合など重ね書きされてしまいます。ですから、あらかじめ画面を消去しておかなければなりません。画面を消去するには

CLS

 とします。これで無事にタイトルが表示できます。
 ゲームを作る、とわめいてタイトルだけ作成して満足してしまう人も中にはいるようです(^^; タイトルだけだとPRINT文を並べたのと変わりません。簡単でもいいからゲームにしてほしいものですよね。また、あまりに長すぎるオープニングも、このPRINT文が200も300も並んでいるようなものです、気を付けましょう。




[3]乱数の生成、発生
 数あてゲームですので数字があらかじめ決まっていては話になりません。そこで登場するのが乱数です。乱数はその名のごとく適当な数を生成します。乱数を生成するには

RND(発生させる乱数の範囲)

 のようになります。発生させる乱数の範囲を10とすれば0〜9までの10個の数値が生成されます。
 ゲームバランスが悪いとか、ゲームバランスが良いなどと言われますが、この数あてゲームは、この乱数の範囲がゲームバランスに相当します。プログラムでは0〜9までの数字になっていますが、もしこれを0か1にしたら、すごく簡単になってしまいます。
逆に一万にすると0〜9999となってしまい見当もつかなくなって、難しすぎる/遊べないという事になってしまいます。いろいろな要素が盛り込まれた最近のゲームではゲームバランスの例えは難しいのですが、この数あてゲームで考えてみればよくわかるでしょう。




[4]プレイヤーからの入力
 準備ができたら、今度はプレイヤーからの入力を待ちます。今回は制限時間はなくて、ひたすら入力を待ちます。一番楽なINPUT命令を使用しています。この命令はウィンドウ上に?を表示し(他のメッセージも表示できます)カーソルを点滅させてプレイヤーからの入力を待ち続けます。
 この入力がリアルタイムで制限時間が10秒以内のようにしてみると面白いかもしれません。こうしたらどうだろう、ああしたら? こんな具合にしたら?といろいろ考えて改良してみてください。今は他人のプログラムをリバースエンジニアリング(解析)したりする事を禁じられていますが、私達の頃ははっきりいって他人のプログラムを盗んだようなものです。そうやって勉強しゲームを作ってきたのです。今はソースリストは非公開、解析も駄目という困った世の中になってしまいました。




[5]コンピューターの反応
 入力された数字によってコンピューター側はメッセージを表示します。入力した数値と比較して大きいか、小さいかによってメッセージを変えています。
 ゲームはプレイヤーとコンピューターとのやりとり、かけひきです。もし入力された数字に対して何も反応しなかったら、面白味が半減してしまいます。IF文で比較している2行を削除するかコメントにしてプレイしてみると良いでしょう。
 ここらへんが、うまくできているゲームはユーザーインターフェースが良くできていると言えます。アイコンやグラフィック、ウィンドウを使ったから良いユーザーインターフェースになるというのは幻想に過ぎません。要求に対して自然な反応を返すのが一番良いと思います。
 ちなみに、このゲームで極悪にするには外れた場合に、延々と50行ほど説教するような感じのメッセージを表示するとか、プレイヤーに不快感を与えるものです。RPG(ロールプレイングゲーム)やアドベンチャーゲームで1文字づつセリフを表示するのも不快感を煽ってしまいます。




[7]ゲームオーバー
 このゲームでは正解したらゲームオーバーになります。正解後、再度遊ぶかどうか尋ねてきます。Yを入力した場合のみゲームを続けます。大文字のYしか受け付けないので、良いインターフェースとは言えません。というのは、通常小文字のyを入力する可能性の方が高いためです。ここは勉強がてら改良して見るとよいでしょう。



終わりに
 ゲームは、ものによっては簡単に作成できます。ハイパーカードを使用すればアドベンチャーゲームなどは、あっという間に出来てしまいます。簡単なRPGならばMMDirectorでも作成できます。しかし、ハイパーカードを使用しようとC言語で作成しようと労力とできる事の違いだけであり、ゲームの本質的な部分は今回作成した数あてゲームと何ら変わりありません。もし、作成したゲームが面白くなかったりした場合は、この数あてゲームを思い出してみましょう。きっと、どこかが悪いはずです。悪い部分についても、ここが数あてゲームのココに相当するのだな、とわかれば自然と対処法も出てくるでしょう。
 ゲームの基本的な流れもやはり同じです。これはヴァーチャファイターであってもファイナルファンタジーであっても本当に変わりません。あとは自分の思うがままにプログラムを作成し機能を盛り込めばいいでしょう。
 ゲームプログラムは、教えてもらうものではありません(教えてくれる学校はありますが)。自分で自分の作成したいゲームのために自分が考え実現していかなければなりません。あと最初は簡単なゲームから作成するのがよいでしょう。普通の人には大作を作れませんから(例外的に数人1、2作目が大作という人もいます。ただし、1万人〜10万人に1人程度の割合でしょう。最初は簡単なものから作りましょう)。



今回のプログラムリスト
LOCAL FN main WHILE _true CLS PRINT "数あてゲーム" A = INT(RND(10)) PRINT "数を当ててね(0〜9までの数字を入れてください)" DO INPUT B IF B > A THEN PRINT "はずれ〜(もっと小さい数だよ)" IF B < A THEN PRINT "はずれ〜(もっと大きい数だよ)" UNTIL B = A PRINT "正解!" PRINT "もう一度遊ぶ?(Y/N)" INPUT C$ IF C$<>"Y" THEN EXIT FN WEND END FN FN main