コンソールでリズムゲーム?
「C言語+標準関数オンリーなCUIアプリでリアルタイム性の高いゲームって組めるの?」って突然頭の中に浮かんだもので、チョット考えて作ってみました。リズムゲームとか大層な事言ってますが、それっぽく動作するかな?って程度で止めてます。(130stepで2時間くらい)
まあ最近遊びプログラミングやってなかったので、良い練習テーマかなって事で、
以下ソースコードのコピペ
// コンソールだけでリズムゲーみたいなの作れるか // ncursesで組む前に検証 #include#include #include // 1コマ辺りのミリ秒 #define TIME_BAR_ONE 50 // バー全体のマス数 #define TIME_BAR 20 // 当たり判定を許すミリ秒 #define TIME_DIV1 40 //#define TIME_DIV2 30 //#define TIME_DIV3 20 //#define TIME_DIV4 10 // コードデータ構造体 typedef struct{ unsigned long time; int key; }code_t; // コードデータ実体とその長さ code_t code_line = {{5000, 0},{7000, 0},{8000, 0},{9000, 0},{10000, 0},{11000, 0}}; int code_line_len; // 現在のコード位置 int now_code; // プログラム開始時間と現在時間 unsigned long start_time, now_time; int score;// 現在の得点 unsigned int hit_f;// ヒット状態(0で何もない、1で失敗、2で) unsigned long getmilisec(void) { struct timeb sec; ftime(&sec); return ((unsigned long)sec.time*1000) + sec.millitm;// バグ過ぎる } int init(void) { // コードデータ読み込み code_line_len=6; now_code = 0; start_time = now_time = getmilisec();// 開始時刻の読み込み score = 1000;// スコアを初期化する return 0; } int display(void) { int disp_code; int i; putc('\r', stdout); printf("[score:%8d] ", score); if (hit_f & 0x00000001){ putc('-', stdout); } else { putc(' ', stdout); } if (hit_f & 0x00000002){ putc('x', stdout); } else { putc('#', stdout); } // 50ミリ秒単位で' 'を入れてみよう disp_code = now_code; for(i=0; i = code_line_len){ putc(' ', stdout); }else{ if ((((now_time-start_time)+i*TIME_BAR_ONE)-code_line[disp_code].time) < TIME_BAR_ONE){ putc('o', stdout); disp_code++; }else{ putc(' ', stdout); } } } putc('|', stdout); return 0; } int destroy(void) { // なにもすることがねえ、得点記録とか? putc('\n', stdout); return 0; } int main(int argc, char *argv ) { init(); while(1){ hit_f = 0; // 時間を取得 now_time = getmilisec(); // 制限時間を越えてしまったコードは読み飛ばす for(; now_code*1 < TIME_DIV1){ // キーが範囲内なら+300とする score += 300; hit_f |= 0x00000002; now_code++; } } // 表示する display(); if (now_code>=code_line_len) break; // 全コード読んだ // コンソールだとsleepしてられない // usleep(100); // 少しスリープする } destroy(); return 0; }
「作ってみました」とか言ってましたが作れませんでした(だらしねえな)。リアルタイム性はある程度問題ないんですが、ボタンイベント処理がどうしようもない。
まあそのうち解決方法が思いついたら再挑戦。
*1:now_time - start_time) < code_line[now_code].time) break; // 読み飛ばされたコードがある場合は-100とする score -= 100; hit_f |= 0x00000001; } // キーを押されているか確認する、コンソールで出来るのかな if(0){ if((code_line[now_code].time - (now_time - start_time