C基礎7 テキストアドベンチャーゲーム2
C基礎7 テキストアドベンチャーゲーム2
「3 テキストアドベンチャーゲーム1」では選択処理だけで作成しましたが、ここでは、繰返しを使ってゲームを再開できる様にします。
関数化に加え、グローバル変数と、配列を利用したディスパッチテーブルと取り入れることで、様々シーンへの展開が簡単に行うことができるプログラミングテクニックについて紹介します。3章で作成したテキストアドベンチャーゲームを、このテクニックを使って成長させます。
プログラミングのテクニックとして、練習問題31の中で、ラッパー関数についても紹介します。可変長引数を使ったprintf関数のラッパー関数を使ったプログラムを作成します。
動画は、Windows10とVisualStudio2019を使った説明になっていますが、WIndows11とVisualStudio2022を使った場合の操作方法と同じです。
変数は、関数の外で宣言することもできます。関数の外で宣言した変数をグローバル変数、今までの様に関数の中で宣言した変数をローカル変数と呼びます。ローカル変数は、宣言した関数の中でしか使えませんが、グローバル変数は、宣言した位置より下で定義した複数の関数で使う事ができます。
グローバル変数は、1回宣言するだけで、全ての関数で使えるため便利に感じますが、プログラムの可読性、保守性の観点からは使うべきではない変数です。変数はローカル変数にすることが最優先です。複数の関数で共用せざるを得ない時だけグローバル変数を使う様にしましょう。
テキストアドベンチャーゲームでは、様々なシーンをプレイヤーが移動していきますが、このシーン展開に便利なプログラミングテクニックとして、ディスパッチテーブルがあります。元々は通信制御プログラムで使われている状態遷移プログラムで使われているテクニックです。関数名の配列で、文字列配列でも使った*という記号の付いたポインタ型(関数ポインタ)の配列になっています。ポインタ型についてはC言語応用編で詳しく説明しますので、ここでは、書き方だけを覚えてください。
「3 テキストアドベンチャーゲーム1」で作ったプログラムを使って、シーン毎の関数化を行います。この際に必要なのがグローバル変数になります。最後はディスパッチテーブル化することでプログラムのステップ数を減らすことができることを説明しています。
・関数の中はローカルで関数の外はグローバル
関数の中で宣言した変数はローカル変数、関数の外で宣言した変数はグローバル変数になります。
変数は、なるべくローカル変数にします。
・複数の関数で共用する変数はグローバル変数
シーン毎に関数化すると、鍵や剣を取得したフラグは、複数の関数で使うため、グローバル変数にする必要があります。
・ディスパッチテーブルは関数名の配列
関数名の配列を作ると、その配列を使って関数呼出しすることができます。
switch文で、case毎に関数を呼び出していた所が、1行の関数呼出しになります。
練習問題12のテキストアドベンチャーをディスパッチテーブルを使ったプログラムに書換えてみましょう。
ディスパッチテーブルを使ったプログラムを作成する場合、「シーン遷移図」を事前に作成することが重要になります。独自のテキストアドベンチャーゲームを作成した人は、プログラムを書く前に、自分のゲームのシーン遷移図を作成する様にしましょう。
練習問題12のプログラム使ってプログラムを書き換える人で、このプログラムを所持していない人は、右下の動画をYouTubeを使って見てください。YouTubeの動画説明の中にURLを記載していますので、そこからダウンロードして使ってください。
ゲームクリア・ゲームオーバーした後、再度ゲームを行うかを問い合わせるシーンを追加しましょう。
シーンの遷移を変更する場合、先ずは「シーン遷移図」を変更することからはじめてください。
本動画のプログラムでは、新しい演算子である三項演算子を使っています。大変便利な演算子ですので、使い慣れると良いでしょう。
また、便利な文字関数も使っています。「#include <ctype.h>」をプログラムの最初にある#include達に追加すると、右下に示す様な関数が使えます。英大文字変換や英小文字変換を、今までは計算式で行っていましたが、これからは文字関数を使う様にしましょう。
練習問題29で完成させたテキストアドベンチャーに、新たなシーンを追加してみましょう。例えば、最初の道の選択のシーンで、右も左も選択しなかった場合、抜け道を見つけたシーンにして、次の扉の選択シーンに移るようにしてみましょう。
練習問題30のディスパッチテーブル方式のテキストアドベンチャーのプログラムに、以下のプログラムを追加してみましょう。
練習問題26で作った色付きAAを追加
練習問題27で作った背景色図形の選択画面を追加
練習問題26,27のプログラムを所持していない人は、右下の動画をYouTubeを使って見てください。YouTubeの動画説明の中にURLを記載していますので、そこからダウンロードして使ってください。
本動画のプログラムでは、可変長引数を使ったprintf関数のラッパー関数を作っています。
ラッパー関数は、関数に新たな機能を追加する時、その関数を自分で修正できない様な場合に使うテクニックです。
printf関数やscanf関数は、引数の数が決まっていない可変長引数を持つ関数です。
今回、printf関数のラッパー関数を作るため、可変長引数が必要になります。
可変長引数は、仮引数宣言するときに、可変長の部分を「...」(ピリオド3つ)と書く事で宣言できます。
可変長引数を使う場合は「#include <stdarg.h>」を#include達の中に追加します。これにより、va_list, va_start, va_endを使う事ができます(実体はマクロ)。
左記の様に決まった書き方になります。
可変長引数を使うprintf関数は、vprintf関数にします。
テスト実施フォーム ← テストチャレンジできます
上記テストの解説と解答