C言語ケーススタディ 文字表示で作ったゲームの基礎(キー入力)




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を強力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



キーボードからの操作と文字表示だけを使った簡単なゲームを作っていきます。

作成にあたり、まずキーボードからキー入力を取得する関数が必要です。 キー入力を処理する関数としてはgetchar()関数scanf()関数などがよく入門書で使われていますが、これらの関数は今回作成するキャラクター(今回は文字ですが)を動かす様なゲームには適していません。

キャラクターはカーソルキーで動かすものとします。この場合の大まかな処理は下記のようになります。

main()
{
        int     ch;

        for(;;){
                ch = キー入力関数;

                switch(ch){
                case 上カーソル:
                        上移動処理;
                        break;
                case 下カーソル:
                        下移動処理;
                        break;
                case 右カーソル:
                        右移動処理;
                        break;
                case 左カーソル:
                        左移動処理;
                        break;
                }
        }
}

キー入力関数としてgetchar()関数を使ってみたらどうなるでしょうか、次のプログラムを実行してみてください。 無限ループしてしまうプログラムなのでCtrl+Cかプログラムの中止などで停止させてください。

main()
{
        int     ch;

        for(;;){
                ch = getchar();
                printf(">>>%x\n", ch);
        }
}

実行してみると、getchar()関数ではEnterキーを押すまで入力した文字が返されないしカーソルキーを押しても何も結果が返されません。

手軽に使える関数の中でゲームに使えるものとしてはgetch()関数があります。使い方はgetchar()関数とほとんど同じです。 次のプログラムを実行してgetch()関数の動作を観察してみましょう。また、カーソルキーを押すとどのような値が返されるかも観察しておきましょう。

main()
{
        int     ch;

        for(;;){
                ch = getch();
                if(ch == 0x1B)
                        break;
                printf(">>>%x\n", ch);
        }
}

Study Cで実行し、カーソルキーを押すとgetch()関数が5、6、7、8の数値を返してきます。

※Study C以外の環境ではインクルードファイルやライブラリを指定しないとコンパイルエラーになると思います。 エラーになるようなら、無料で使えるStudy Cをインストールして試してみてください。

カーソルキーが押されたときにキャラクターが移動するようにするには次のようなプログラムの骨格となります(実際のキャラクター移動は次回のケーススタディで説明します)。

main()
{
        int     ch;

        for(;;){
                ch = getch();
                switch(ch){
                case 5: /*上*/
                        printf("上へ移動\n");
                        break;
                case 6: /*下*/
                        printf("下へ移動\n");
                        break;
                case 7: /*左*/
                        printf("左へ移動\n");
                        break;
                case 8: /*右*/
                        printf("右へ移動\n");
                        break;
                case 0x1B:
                        return;
                }
        }
}