「Windows のコマンドプロンプト上で動くゲーム」のC言語スケルトンコード

教育用の覚書(のつもり)。「イベントドリブン」と「(画面の再描画のための)一定間隔での動作」をやらせるための Windows 用コンソールプログラムの骨格として試作したもの。ANSI C の標準ではない関数 kbhit(), getch() と windows.h の Sleep() を利用している。

  • 「迫りくるインベーダー」の描画
    およそ 1000[msec] (= sleepDuration_msec × sleepEventCounterMax ) で timerEventProc() が走るので、ここで記述。
  • 「ビームの発射」「ビームの軌跡」などの描画
    kbhit() で keyEventProc() が走るので、ここで記述
  • 時間の測定
    適宜、sleepEvent()を呼ぶ。これを1回呼ぶ毎に「 10[msec] 経過」とみなす。各関数でのデータ処理、描画処理などの時間は勘定に入れてない。
「入力待ち」を無限ループで実現すること、「メッセージ」と呼ばれるデータ(keyData, exitFlag, timerFlag)で処理分岐を行うことくらいが理解できればいいかな。多分、現在の入門的なC言語の講義内容から考えると「構造化」の勉強の初歩になるかもしれない。

#include <conio.h>
#include <windows.h>

int sleepDuration_msec=10
   ,sleepEventCounter=0
   ,sleepEventCounterMax=100
   ,exitFlag=1
;

int  checkExitCond (void);
int  checkTimer (void);
void exitProc(void);
void initProc (void);
void keyEventProc (int keyData);
void sleepEvent (void);
void timerEventProc (void);

int main(void) {
    initProc();
    while ( checkExitCond() ) {
        if ( kbhit() ) {
            keyEventProc(getch());
        } else {
            if ( checkTimer() ) {
                timerEventProc();
            }
            sleepEvent();
        }
    }
    exitProc();
}

void initProc (void) {
    // プログラム開始時の処理をここに書く
}

int  checkExitCond (void) {
    if ( exitFlag ) {
        // プログラム終了判定の処理をここに書く
    }   // 「終了」なら exitFlag=0; とする。
    return exitFlag;
}

void keyEventProc (int keyData) {
    switch ( keyData ) {
    case 27: // 'ESC'
        exitFlag= 0; // ESCが押されたら「終了」
        break;
    //case X:
    //    ASCIIコード X のキーが押されたときの処理をここに書く
    //    break;
    default:
        break;
    }
}

int  checkTimer (void) {
    int timerFlag=0;
    if ( sleepEventCounter > sleepEventCounterMax ) {
        sleepEventCounter= 1;
        timerFlag= 1;
    }
    return timerFlag;
}

void timerEventProc (void) {
    // 定時の処理(画面の再描画など)をここに書く
}

void sleepEvent (void) {
    Sleep(sleepDuration_msec);
    sleepEventCounter++;
}

void exitProc (void) {
    // プログラム終了時の処理をここに書く
}