#include <curses.h>は する#include <STDLIB.H> の#include <signal.hに> する#include <SYS / TIME.H> の#define CHAR_BIRD 'O' の#define CHAR_STONE '*' の#define CHAR_BLANK '' のtypedef 構造体ノード{ int型X、Y。 構造体のノード* 次の; }ノード、 * ノード。 ノード頭、尾; int型bird_x、bird_y。 int型のティッカー。無効のinit(); 空init_bird(); 無効init_drawを(); 空init_wall(); 空init_head(); 空ドロップ(int型SIG)。 INT set_ticker(INT N)。 INT メイン() { チャーCH。 初期化(); 一方、(1 ) { CH = getchは()。 もし(CH == ' ' || CH == ' W ' || CH == ' W ' ) { 動き(bird_y、bird_x)。 addch(CHAR_BLANK)。 リフレッシュ(); bird_y - ; 移動(bird_y、bird_x)。 addch(CHAR_BIRD)。 リフレッシュ(); もし((CHAR)インチ()== CHAR_STONE) { set_ticker(0 )。 睡眠(1 )。 endwinを(); 出口(0 ); } } そう なら(CH == ' Z ' || CH == ' Z ' ) { set_ticker(0 )。 DO { CH = getchは(); } 一方、(CH =!' Z ' && CH =!' Z ' ); set_ticker(ティッカー)。 } そう なら(CH == ' Q ' || CH == ' Q ' ) { 睡眠(1 )。 endwinを(); 出口(0 ); } } 戻り 0 。 } INT set_ticker(INT n_msec) { ストラクトitimerval timeset; 長いn_sec、n_usec。 n_sec = n_msec / 1000年。 n_usec =(%n_msec 1000年)* 1000L 。 timeset.it_interval.tv_sec = n_sec。 timeset.it_interval.tv_usec = n_usec。 timeset.it_value.tv_sec = n_sec。 timeset.it_value.tv_usec = n_usec。 リターン setitimerが(ITIMER_REAL、&timeset、NULL); } ボイドドロップ(int型SIG) { int型J。 ノードTMP、P。 移動(bird_y、bird_x)。 addch(CHAR_BLANK)。 リフレッシュ(); bird_y ++ ; 移動(bird_y、bird_x)。 addch(CHAR_BIRD)。 リフレッシュ(); もし((CHAR)インチ()== CHAR_STONE) { set_ticker(0 )。 睡眠(1 )。 endwinを(); 出口(0 ); } P =頭部> 次。 もし(P-> X < 0 ) { ヘッド - >次= P-> 次。 無料(P); TMP =(ノード*)はmalloc(はsizeof (ノード))。 TMP - > X = 99 。 実行 { TMP > Y =ランド()% - 16 。 } 一方(tmp-> Y < 5 )。 テール - >次= TMP; TMP - >次= NULL; 尾 = TMP; ティッカー - = 10 。 set_ticker(ティッカー)。 } のために(P =頭部>次に、P->次= NULL;!P-> x--、P = P-> 次) { 用(j = 0 ; J <P-> yであり、j ++ ) { 移動(J、P - > X)。 addch(CHAR_BLANK)。 リフレッシュ(); } ため(J = P-> Y + 5 ; J <= 23 ; J ++ ) { 移動(J、P - > X)。 addch(CHAR_BLANK)。 リフレッシュ(); } であれば(P-> X- 10 > = 0 && P-> X < 80 ) { ため(J = 0 ; J <P-> yであり、j ++ ) { 移動(J、P - > X- 10 )。 addch(CHAR_STONE)。 リフレッシュ(); } ため(J = P-> Y + 5 ; J <= 23 ; J ++ ) { 移動(J、P - > X- 10 )。 addch(CHAR_STONE)。 リフレッシュ(); } } } 尾 - > x-- 。 } ボイドのinit() { initscrの()。 CBREAK(); NOECHO(); curs_set(0 )。 srand関数(時間(0 ))。 信号(SIGALRM、ドロップ); init_bird(); init_head(); init_wall(); init_draw(); 睡眠(1 )。 ティッカー = 500 ; set_ticker(ティッカー)。 } ボイドinit_bird() { bird_x = 5 。 bird_y = 15 。 移動(bird_y、bird_x)。 addch(CHAR_BIRD)。 リフレッシュ(); 睡眠(1 )。 } ボイドinit_head() { ノードTMP。 TMP =(ノード*)はmalloc(はsizeof (ノード))。 TMP - >次= NULL; ヘッド = TMP; 尾 = ヘッド。 } ボイドinit_wall() { int型のI。 ノードTMP、P。 P = ヘッド。 以下のために(私= 19 ; iは<= 99、I + = 20 ) { TMP =(ノード*)はmalloc(はsizeof (ノード))。 TMP - > X = I; やります{ TMP - > Y =ランド()%16 。 } 一方(tmp-> Y < 5 )。 P - >次= TMP; TMP - >次= NULL; P = TMP; } 尾 = P。 } ボイドinit_draw() { ノードp。 int型I、J。 用(P =頭部>次に、P->次= NULL;!P = P-> 次) { ための(I = P-> X; I> P-> X- 10 ; i-- ) { 用( J = 0; J <のp> Y; J ++ ) { ムーブ(j、i)に対して、 addch(CHAR_STONE)。 リフレッシュ(); } ため(J = P-> Y + 5 ; J <= 23 ; J ++ ) { ムーブ(j、i)に対して、 addch(CHAR_STONE)。 リフレッシュ(); } } 睡眠(1 )。 } }
main()関数は、最初の初期化のinit()を呼び出し、その後しばらく()ループに入ります。三つの部分のメインループ:
- 1.ユーザ操作の分析、またはwはスペースキーが押された場合、鳥は2行まで飛ぶ; Zを一時停止するために、キーはゲームQを終了するために押された場合。
- 2.鳥が再描画されるように移動します
- 3.ヒットコラム鳥かどうかを判断します
INIT()関数は、最初に提供される機能を呼び出し、サブルーチンを初期化するための各呼び出し、(ドロップを用いて受信信号の関数)、及び時間を設定する画面のncursesを初期化します
実験室の建物からのリンク:https://www.shiyanlou.com/courses/146