C言語ケーススタディ 文字表示で作ったゲームの基礎(カーソルキーで移動する「+」文字)




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



今回は「+」文字をカーソルキーを押した方向に移動するプログラムを作ってみます。カーソルキーの方向に応じて文字を表示する座標を増減させれば文字を移動させることができます。 「+」文字の座標は変数x、yに保持し初期値は(40,10)とします。

座標(x,y)は(0,0)からとした方が計算しやすいのですで、この章以降は(0,0)からの座標系とします。 また、エスケープシーケンス(表示の時の)での座標は(1,1)からなので表示の際(printf関数で)に+1しています。

main()
{
        int     ch;
        int     x, y;

        x = 40;
        y = 10;
        for(;;){
                printf("\033[%d;%dH+", y+1, x+1);
                ch = getch();
                switch(ch){
                case 5: /*上*/
                        y--;
                        break;
                case 6: /*下*/
                        y++;
                        break;
                case 7: /*左*/
                        x--;
                        break;
                case 8: /*右*/
                        x++;
                        break;
                case 0x1B:
                        return;
                }
        }
}

前のプログラムでは、「+」文字を消す機構がないため移動すると言うよりは軌跡を表示するものになっています。 前に表示した文字を消すには、一つ前の表示した座標を記憶しておき新たに'+'文字を表示する前にそれを消去する必要があります。 直前の表示座標は変数ox、oyに記憶させておきます。

main()
{
        int     ch;
        int     x, y, ox, oy;

        x = ox = 40;
        y = oy = 10;
        for(;;){
                printf("\033[%d;%dH ", oy+1, ox+1);
                ox = x;
                oy = y;
                printf("\033[%d;%dH+", y+1, x+1);
                ch = getch();
                switch(ch){
                case 5: /*上*/
                        y--;
                        break;
                case 6: /*下*/
                        y++;
                        break;
                case 7: /*左*/
                        x--;
                        break;
                case 8: /*右*/
                        x++;
                        break;
                case 0x1B:
                        return;
                }
        }
}

前のプログラムで'+'文字が動き回るようになりましたが、画面からはみ出すような操作を行うと正常に動作しなくなってしまいます。 これを防ぐためにx、yの座標を増減させる前に移動後も画面内に収まるかをチェックするようにします。 また、最初に画面をきれいにしておかないと見づらいので新しい制御コード("\033[2J")を表示することで画面をクリアします。 さらに位置が移動していない場合は描画をおこなわない処理と初回は消去が行われないようにもします。

main()
{
        int     ch;
        int     x, y, ox, oy;

        ox = oy = -1;
        x = 40;
        y = 10;
        printf("\033[2J");      /*画面消去*/
        for(;;){
                /*位置が変更されていなければ表示しない*/
                if(ox != x || oy != y){
                        /*初回は消去しない*/
                        if(ox != -1 && oy != -1)
                                printf("\033[%d;%dH ", oy+1, ox+1);
                        ox = x;
                        oy = y;
                        printf("\033[%d;%dH+", y+1, x+1);
                }
                ch = getch();
                switch(ch){
                case 5: /*上*/
                        if(y <= 0)
                                break;
                        y--;
                        break;
                case 6: /*下*/
                        if(y >= 24)
                                break;
                        y++;
                        break;
                case 7: /*左*/
                        if(x <= 0)
                                break;
                        x--;
                        break;
                case 8: /*右*/
                        if(x >= 79)
                                break;
                        x++;
                        break;
                case 0x1B:
                        return;
                }
        }
}