【C言語プログラミング11】超劣化版バーチャファイターを作る パイ・チェンの連環転身脚を喰らえ!
バーチャファイターってご存じですか?セガが開発した格闘ゲームなんですが、キャラクターが3次元的に見える発売当時は画期的なゲームでした。今初代のバーチャファイターを見ると、何これ?って感じですが、当時は凄かったんです。このゲームにパイ・チェンと言うキャラが居て、パイの蹴り技の一つである、”連環転身脚”を発動するプログラムを書いてみます。
連環転身脚とは
この技は、パンチ ⇒ パンチ ⇒ パンチ ⇒ 後ろ回し蹴りと言う連続攻撃を相手に喰らわす技で、綺麗にヒットすると爽快です。「ちょっと動くなよ、そのまま立っとってな!、おい!動くな言うたやんけ!」と技の練習中に友達にカウンター入れられて喧嘩になる、そんな技です。
キーボードからの入力を受け取る!
これまで、いくつかのプログラムを書いて来ましたが、"C programing!!!"と表示するだけのプログラムも、ルフィを描くプログラムもプログラムが一方的に何かを出力して終わりでした。今回は初めて人間の入力に対して反応するプログラムになります。ゲームの場合は通常コントローラーからコマンドを入力しますが、今回はキーボードからの入力となります。
コンソールに何かを出力する方法は既にご存知ですね。printf関数を使えば出来ます。では、逆にコンソールから何かを入力するにはどうすれば良いのか?printf関数が用意されているなら、その逆の関数もあるんちゃうん?ええ、勿論ございます。入力を受け付ける関数は色々あるんですが、今回はその内、fgets関数を使います。
fgetsの使い方
fgets関数もprintf関数と同様にどっかの誰かが作ってくれた関数ですので、インクルードすることで使えるようになります。#include <stdio.h>を冒頭に記述します。fgets関数はコンソールから入力された文字を指定した変数に入れてくれます。コードで書くと以下のようになります。
char command[100]
fgets(&command[0], 100, stdin);
char型の配列であるcommandと言う変数を宣言し、第一引数でその先頭アドレスを渡しています。ポインタの話が理解できている方は、はいはい、そりゃそうやんなってなりますね?キーボードから入力された文字を”ここに入れてくれ!”ってfgets関数に教えてあげないといけないですね。”ここ”をピンポイントで示すのはポインタを使うんでしたよね。だから、command配列の先頭アドレスを指定しているのです。第二引数は配列の最大サイズです。100バイトしか配列を宣言していないのに、キーボードから1000文字入力されたら溢れますからね。第三引数はコンソールからの入力ですよと言う意味です。
キーボードから入力された文字をオウム返しする
キーボードから入力された文字をオウム返しするコードを書いてみます。
#include <stdio.h>
void main(void)
{
char command[100];
fgets(&command[0], 100, stdin);
printf("入力文字 = %s\n", command);
}
このコードをコンパイルして実行すると次のような結果になります。123の後にEnterキーを押した結果です。Enterキーを押すと入力文字がプログラムに取り込まれます。入力文字 = 123となっていますね。
連環転身脚のコマンドはPPPK
コンソールからの入力が取れるようになったので、連環転身脚のコマンドである”PPPK”(パンチ・パンチ・パンチ・キック)が入力されたら「連環転身脚!!」と表示するプログラムを作ってみます。なんじゃ!それだけかい!とか言わないように。ソースコードは以下の通り。
#include <stdio.h>
#include <string.h>
void main(void)
{
int ret;
char command[100];
printf("####################\n");
printf("### Fight!!! ###\n");
printf("####################\n\n");
while (1) {
printf("コマンドを入力:");
fgets(&command[0], 100, stdin);
ret = strcmp(&command[0], "PPPK\n");
if (ret == 0) {
printf("連環転身脚!!\n\n");
printf("####################\n");
printf("### KO!! ###\n");
printf("####################\n\n");
break;
}
else {
printf("弱攻撃!!\n\n");
}
}
}
whileループ
while (1) { }と記述されている箇所がありますが、初めて登場する文法ですね。これはwhileループと言って、繰り返し制御をする為に使用します。以下のように記述します。
while (継続条件) {
// 繰り返し処理
}
上のコードではwhile(1)となっていますが、プログラムの世界で1:真、0:偽となって、()に1を入れると条件=真、つまり継続条件成立と言う意味になります。今回、1を直接記述しているので、永久に継続条件が成立します。無限ループするということです。
ループと言えばforループが以前に登場していますが、どちらを使っても同じことが実現できます。私はforループは継続回数が予め決まっている場合に使い、whileループは無限ループさせたい場合や、継続回数が分からない場合に使います。
strcmp関数
whileループの中にstrcmp(&command[0], "PPPK\n");と言う記述がありますね。これは文字列を比較してくれる関数です。#include <string.h>とすれば使えるようになります。command配列の中身と"PPPK\n"が同じであれば、strcmp関数は0をリターンしてくれます。strcmp関数の詳細はGoogle先生に聞けば詳しく教えてくれます。
if文の中身
if文の中身は簡単で、strcmp関数の戻り値が0の時とそうでない時で処理を分岐しています。0の場合は”連環転身脚!!”と”KO!!”が表示され、0以外の時は”弱攻撃!!”が表示されます。0の場合に注目して欲しいのですが、最後にbreak;とありますね。これはループを抜けると言う命令になります。このwhileループは無限ループなので、breakしないと永久に終わりません。今回のコードでは"PPPK"が入力されると、プログラムが終了します。
超劣化版バーチャファイターをプレイ
では、早速の超劣化版バーチャファイターをやってみましょう。
1)P Enter
2)K Enter
3)pppk Enter
4)PPPK Enter
の順でコマンドを入力した結果が以下の通りです。PPPKが入力されるまではプログラムが終了せずに繰り返していますね。
しかし、オ、オモんねー・・・。タダでも要らんわ、こんなゲーム。
まとめ
今回はバーチャファイターを題材に、外部からの入力を待ってから動作するプログラムを作りました。結果、全然オモロないゲームになりましたが、それはご勘弁を。しかし、本物のバーチャファイターもコントローラーからの入力を受け付け、入力コマンドを判定する部分は、今回作ったプログラムと同じようなことをやっているはずです。弱攻撃!!とか連環転身脚!!とprintfしている所が、本物だともっとグラフィカルになるのです。
これで、入出力のどちらもプログラミングできるようになったので、次はもう少し遊べる何かを作ってみようかな。
この記事が気に入ったらサポートをしてみませんか?