40:ゲームの初期化をしよう

◆PROCESSINGで始めるゲーム作りとコンピュータ

Monster_1 40:ゲームの初期化をしよう

今日の話題

 

18:全体で管理する変数を考える

前回解説した冒険の地図(SPD)は理解できたでしょうか?。

まずは地図の読み方をしっかりと覚えてくださいね。今回から、冒険の地図に従ってゲームの各処理を解説していきます。

ヨウコ
それじゃぁ、さっそくお待ちかねのゲーム処理について見ていきましょうか。

ケンジ
やったー。

ヨウコ
まずは前回描いたSPDの「ゲームの準備を行う」部分を、より詳しく書いたものを示すわね。

ケンジ
ゲームの準備を行う所で、いろいろな事をするんですね。

ヨウコ
最初にゲームの構造を図で書いたと思うけど、その図と見比べてみると良いかもしれないわね。

ユカ
ゲームの準備には、「リソースを読み込む」処理と「ボードや得点を初期化する」処理があるという事ですか?。

ヨウコ
そうよ。SPD上に赤枠と青枠で囲ってある処理がそれよ。

ユカ
リソースを読み込む処理は、画像や音楽ファイルを読み込む処理の事だと思うんだけど。

ケンジ
そうだね。でも「ボードや得点を初期化する処理」に書いてあるゲーム変数とか駒配列とか・・・なんだかわけがわかんないや(汗)。

ヨウコ
1つ1つ説明するから大丈夫よ。

ヨウコ
まずは、ゲーム全体で必要となる変数について考えてみましょうか。

ユカ
ゲーム全体で必要となる変数ですか・・・。

ヨウコ
例えばこれはゲームだから、今「GAME OVER」状態なのか「PLAY中」なのかを覚えておくと便利だとは思わない?。

ユカ
あ、前回のSPDにもGAME OVERか検査する処理が登場していましたよね?。

ヨウコ
そうよ。多くのゲームでは「現在のゲーム状態」を変数で管理しておくのが定番なの。今回ならPLAY中かGAME OVERかを管理しておくわけね。

ケンジ
???。

ヨウコ
RPGなんかでも、主人公には「健康」、「毒状態」、「麻痺状態」などいろいろな状態があるでしょ?。

(画像URL:illust-AC 様:sworc さん、acworks さん、キラーT細胞 さん)

ヨウコ
多くのゲームでは、「今どんな状態なのか」を様々な変数で管理しているのよ。

ヨウコ
特にゲームPLAY中かGAME OVERかを管理する変数の事を「ゲーム状態変数」と呼ぶの。

(画像URL:illust-AC 様:wakuwaku8さん、キラーT細胞 さん)

ユカ
「ゲーム状態変数」がPLAY中ならゲーム画面を表示して、GAME OVERならゲーム終了画面を表示するといった使い方をするためなんですね。

ヨウコ
ゲームにもよるけど、得点やキャラクター数なんかもゲーム全体で管理される変数の代表例よ。

ケンジ
そうか!。シューティングゲームでも画面の上の方に、得点や残りのライフ数が表示されているもんな。

ヨウコ
そうそう。

(画像URL:ムトー研究所 様)

ヨウコ
今回はリバーシゲームだから「現在の白黒の駒数(得点)」と「いま白黒どちらの手番なのか」を覚えておく変数を用意しているのよ。

ケンジ
なるほど。

.
ゲーム全体でいろいろな情報を管理する変数には、様々なものが考えられます。

もちろん作りたいゲームによって、どのような変数があった方が便利かは異なるでしょう。

ですがその中でも、ゲームの状態を管理する「ゲーム状態変数」は、ゲーム全体で管理される変数の代表例と言えるのではないでしょうか?。

特にPROCESSINGのようなゲームループを意識する言語では、ゲーム状態変数の内容で表示すべき画面やキャラクターを切り替える処理は、定番的なテクニックとなります。

 

19:ゲームボードと駒の扱いを考える

ケンジ
ゲーム状態変数はわかったけど、SPDに書いてある駒配列って何なんですか?。

ヨウコ
そうね。それを説明するためには、ゲームボードと駒を「どのように管理するのか」を考える必要があるわね。

ユカ
ゲームボードって、白黒の駒を置く台の事ですよね?。

ヨウコ
ええ、そうよ。今回はオセロ風リバーシゲームだけど、白黒の駒を置くマス目は幾つあるかしら?。


ケンジ
うーん・・・。縦が8マス、横も8マスだから64個ですよね。

ヨウコ
そうね。それじゃぁ、1個のマスには何種類の状態があると思う?。

ヨウコ
え、状態・・・?。駒が「ある」か「無い」か・・・って事ですか?。

ヨウコ
そうよ。でも「ある」か「無い」かという2種類っていうのは不正解ね。

ユカ
黒い駒がある、白い駒がある、どちらの駒も無いという3種類だと思います。

ヨウコ
その通り。

ケンジ
ちぇっ。そのくらい俺もわかってたんだけどなぁ・・・。

ヨウコ
いじけない、いじけない。でも、この駒を置く場所の数と状態がとても大切なの。

ヨウコ
ところで多くのプログラミング言語には、

ヨウコ
今回のマス目のような「同じ情報」をひとまとめにして扱うのに便利な変数があるんだけど、2人は覚えているかしら?。

ケンジ
確か・・・授業で出てきたような・・・。

ケンジ
あ、思い出した!。配列変数ですよね!。

ヨウコ
大正解!。

ユカ
そうか。じゃぁ64個のマス目を管理する配列変数を用意して、1つ1つの要素に駒の状態を格納するんだ。

ヨウコ
そうよ。こんな感じね。


ヨウコ
配列変数で管理する方法以外にも、いろいろな方法があるけど、今回は駒の状態を管理するのに配列変数を使っているのよ。それが駒配列なの。

ケンジ
具体的には、どうプログラミングするんだろう。

ヨウコ
まずは64個分の配列変数を作る所からね。ケンジくんは配列変数の作り方は覚えてるかしら?。

ケンジ
な、なんとなく・・・。こんな風に、変数名の後ろにカッコ([])をつけるんでしたよね?。


ヨウコ
そうよ。

ユカ
でも駒の状態は3種類あるから、TrueとFalseしか管理できない boolean型じゃダメなんじゃない?。

ケンジ
そうか・・・。じゃint型の配列変数にしよう。

ヨウコ
あとは、配列変数もクラスと同じで new で実態を作らないと利用できないから注意ね。

ケンジ
そうでしたね!。じゃぁ、こんな感じだな。


ユカ
うん。あと、駒配列はプログラムのいろいろな所から使うから、グローバル変数にしたほうがいいんじゃないかしら?。

ユカ
3種類あるマス目の状態も定数にしておきましょうよ!。


ケンジ
よし!。ヨウコ先生、こんなんでどうですか?。

ヨウコ
あら、いいんじゃないかしら。

.
ゲームボードの状態をどのようにプログラミングするかは、今回のゲームの大きなポイントになります。

ここで紹介した方法は、一番基礎的な方法です。これ以外にも様々な方法が考えられますが、まずは配列変数で管理するというオーソドックスな方法に挑戦してみましょう。

配列変数については「17:定数と配列変数」でも紹介していますので、忘れちゃった方は参照してみてください。

 

20:ゲーム初期化関数を作る

ヨウコ
ボードを管理する配列変数ができたら、中身を初期化しておきましょう。

ユカ
用意した配列変数の中身を「コマが無い(空欄)」状態に設定しておくんですね。

ケンジ
えー、面倒くさいなぁ。

ユカ
ゲームが始まったら、真ん中に置く駒以外は何もない状態から始まるんだから、しょうがないでしょ?。

ヨウコ
変数を初期化しておく理由は、それだけじゃないのよ。

ケンジ
?。

ヨウコ
PROCESSINGではint型の変数を作成すると、自動的に内容を0にしてくれるんだけど、

ヨウコ
他のプログラミング言語では、変数を用意しただけでは内容が「不定」なものがあるの。

ヨウコ
内容が不定、つまり何が入っているかわからない状態で使うと予期しないエラーになる事もあるから、

ヨウコ
変数は、「用意したら必ず初期値を入れる」癖をつけた方がいいわね。

ユカ
配列変数に値を入れるにはループ命令を使うと便利なんですよね。

ヨウコ
そうよ。

ケンジ
ループ命令か。確か for文だったよね?・・・。

ユカ
うん。だからこんな感じになるんじゃないかしら?。


ケンジ
このfor文では、int型のiという変数を用意して、iを0から63まで順番に変化させているんだね。


ヨウコ
あっているわね。でも今回は初期化を行う部分を「関数」として独立させておいた方がいいわよ。

ユカ
変数の初期化を行う部分を、1つの関数にするんですか?。

ヨウコ
そうよ。

ヨウコ
プログラムの中で何度も使う処理は、できるだけ関数にまとめておく事が大切なの。前回掲載したゲーム全体のSPDをもう一度みてちょうだい。


ケンジ
?。

ユカ
あれ?。キー入力処理の中にも「ボードや得点の初期化」を行う処理があるわ。

ヨウコ
いいところに気がついたわね。

ヨウコ
これはゲームオーバーになった後で、SPACEキーが押されたらゲームを再開する処理よ。

ケンジ
どうして初期化する処理が、こんな所にあるんだろう?。

ヨウコ
リバーシで「ゲームが終了」する条件は何かしら?。

ケンジ
それは、勝敗が決まった時じゃないですか?。

ヨウコ
そうよね。じゃぁその時、ボードはどうなっている?。

ユカ
ボードは全部コマで埋まっています。

ケンジ
・・・そうか、そこからゲームをもう一度始めるには、ボードの状態をゲーム開始直後と同じ状態に戻す必要があるんだ。

(画像URL:illust-AC 様:R-DESIGNさん)

ヨウコ
その通りよ。だからSPACEキーが押されたときに、ゲームの初期化処理が必要になるのよ。

ヨウコ
ボードの状態をゲーム開始直後に戻すには、配列変数の中身を「コマが無い(空欄)」状態に戻す必要があるでしょ。そしてその処理は、ゲーム開始時点で行う処理と同じ筈よ。

ケンジ
なるほど。

ヨウコ
だから、今回はゲームの初期化を行う部分を initGameという名前の関数にして、その中に駒配列の初期化処理を入れておきましょう。

ユカ
関数は、こんな感じで書くんでしたよね。


ヨウコ
そうよ。

ケンジ
関数の名前は initGame だとして、戻り値の型や引数はどうなるんだろう?。

ヨウコ
とりあえず戻り値も引数も「無し」でいいわよ。

ケンジ
じゃ、こんな感じかな?。

ケンジ
あれ?・・・。なんかエラーが表示されてる。


ヨウコ
戻り値は「無し」でいいとは言ったけど、型を書かないのはNGよ。

ケンジ
???。

ヨウコ
引数が無い場合と戻り値が無い場合では、書き方が異なるのよ。

(画像URL:illust-AC 様:R-DESIGNさん)

ユカ
戻り値がない時は void って書くんでしたよね?。

ヨウコ
そうよ。戻り値が無い時は「省略する(書かない)」んじゃなくて、無い事を明示する必要があるの。

ケンジ
という事は、こうすればいいって事ですか?。

ヨウコ
その通りよ。ゲーム初期化関数ができたら、この関数を setup() 関数から呼び出しておきましょう。

ユカ
こんな感じね。

ヨウコ
ついでに「ゲーム状態変数」、「現在の白黒駒数(得点)」、「いまの手番」を覚えておく変数を用意して、それも初期化しておきましょうか。

ヨウコ
今回は、各変数を次のように作ってね。

ケンジ
できました!。

ヨウコ
初期化の最後は、ボードの中央に白と黒の駒を配置しておく事ね。

ケンジ
ボードの中央に駒を配置するって言われても・・・?。

ヨウコ
ヒントをあげるわね。例えばボードの左上隅に白い駒を配置するには、次のようにプログラムする事になるわ。


ユカ
pieces[ 0 ] = WHITE; は駒配列の0番目、つまり先頭の値をWHITE(=0)にしているんですね。

ケンジ
駒配列は0から63までの64個あるから、その中央は・・・。そうか!、こうすればいいのかな?。

ヨウコ
その通りよ。

.
これでゲームの初期化部分がほぼ出来あがりました。

今回のような小さなプログラムでは難しく考える必要はありませんが、大きなプログラムを作る時や、多人数で分担してプログラムを作成する場合は、事前に変数一覧を作成しておく事はとても重要です。

こうしたチョットした工夫が、スムーズに動作するプログラムの作成には欠かせません。一手間かける事で美味しくなる料理と同じですね(笑)。

ちなみに現在の手番(turnColor)には黒と白しかありませんので、turnColor変数はint型ではなくboolean型にすべきかもしれません。

今回はボード上の駒の状態(黒:1、白:0)をそのまま使いたかったのでint型にしましたが、このあたりは皆さんで工夫してみてください。

※上記会話に登場する素敵な人物画像は、次のサイト様の画像を利用させて頂いております。ありがとうございます。

画像URL:とりのすみか

 

Forest今日の言葉

なし

 

scroll今日の文法

なし

 

 今日のまとめ

  • ゲーム状態などをグローバル変数として管理する
  • ゲームループを持つプログラムでは、ゲーム状態変数でシーンを切り替える
  • 共通化できる処理は関数としてまとめる

39:フローチャートを理解しよう へ戻る
目次へ戻る


本ページで利用している特に参照元記載のないアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。