ゆるい、鳥

 

#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

おすすめ

転載: www.cnblogs.com/wanghao-boke/p/11582320.html