zoukankan      html  css  js  c++  java
  • Linux---弹球游戏

    ReadMe:

    弹球游戏按键说明(注意大小写):

    Q End Up Game 游戏停止
    P Play Again  再玩一次

    f 速度x轴方向减速
    s 速度x轴方向加速
    F 速度y轴方向减速
    S 速度y轴方向加速

    J 移动挡板变短
    L 移动挡板变长

    4 移动挡板向左移动
    6 移动挡板向右移动

    补充说明:
    游戏屏幕左上角显示当前得分和游戏状态( GameOn or GameOver )
    游戏过程中忽略ctrl+c和ctrl+信号,游戏结束后恢复信号

    /×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/

        分。。。。割。。。。线

    /×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/

      1 #include <stdio.h>
      2 
      3 #include <stdlib.h>
      4 
      5 #include <string.h>
      6 
      7 #include <curses.h>
      8 
      9 #include <signal.h>
     10 
     11 #include "bounce.h"
     12 
     13 #include <sys/time.h>
     14 
     15  
     16 
     17  
     18 
     19 bool set_up( bool );
     20 
     21 void wrap_up();
     22 
     23 void ball_move();
     24 
     25 void show_baffle();
     26 
     27 void in_bound( struct BallInfo * );
     28 
     29 int set_ticker( int );
     30 
     31 bool judge_in_bound( int ,int );
     32 
     33 void show_baffle();
     34 
     35 void try_move_my_moving_baffle( char );
     36 
     37 void show_my_moving_baffle();
     38 
     39 void cover_my_moving_baffle();
     40 
     41 void show_score_gameon();
     42 
     43 void show_score_gameoff();
     44 
     45 void clear_up();
     46 
     47 void solve_sigint();
     48 
     49 void solve_sigquit();
     50 
     51 bool ball_crash_brick();
     52 
     53 void show_my_moving_brick( int ,int );
     54 
     55 void cover_my_moving_brick( int ,int );
     56 
     57  
     58 
     59 struct BallInfo my_moving_ball;
     60 
     61 struct BaffleInfo my_moving_Baffle;
     62 
     63 struct Brick my_moving_brick[2];
     64 
     65 int score;
     66 
     67  
     68 
     69 void clear_up(){
     70 
     71        int i,j;
     72 
     73        for( i=0;i<24;i++ ){
     74 
     75               for( j=0;j<80;j++ ){
     76 
     77                      mvaddch( i,j,BLANK );
     78 
     79               }
     80 
     81        }
     82 
     83        return ;
     84 
     85 }
     86 
     87 /********************************************************
     88 
     89        clear up the whole screen
     90 
     91 *********************************************************/
     92 
     93  
     94 
     95  
     96 
     97 bool set_up( bool flag ){
     98 
     99        char od;
    100 
    101        my_moving_ball.x_pos = startX;
    102 
    103        my_moving_ball.y_pos = startY;
    104 
    105        my_moving_ball.x_Time1 = my_moving_ball.x_Time2 = X_Time;
    106 
    107        my_moving_ball.y_Time1 = my_moving_ball.y_Time2 = Y_Time;
    108 
    109        my_moving_ball.x_dir = 1;
    110 
    111        my_moving_ball.y_dir = 1;
    112 
    113        my_moving_ball.ball_symbol = BALL;
    114 
    115  
    116 
    117        my_moving_Baffle.len = BaffleLen;
    118 
    119        my_moving_Baffle.baffle_symbol = BaffleSymbol;
    120 
    121        my_moving_Baffle.x = startX_;
    122 
    123        my_moving_Baffle.y = startY_;
    124 
    125  
    126 
    127        my_moving_brick[0].x = TopRow+DELTA;
    128 
    129        my_moving_brick[0].y = LeftCol+1;
    130 
    131        my_moving_brick[0].speed = speed1;
    132 
    133        my_moving_brick[0].dir = 1;
    134 
    135        my_moving_brick[0].flag = true;
    136 
    137  
    138 
    139        score = 0;
    140 
    141  
    142 
    143        initscr();
    144 
    145        noecho();
    146 
    147        crmode();
    148 
    149        keypad( stdscr,true );
    150 
    151        //attroff( A_BLINK );
    152 
    153       
    154 
    155        if( flag==true ){
    156 
    157               mvaddstr( startX-3,startY,"Do you want play game (y/n)?" );
    158 
    159               mvaddstr( startX-2,startY,"Press 's' to slow (x-axis)");
    160 
    161               mvaddstr( startX-1,startY,"Press 'f' to fast (x-axis)");
    162 
    163               mvaddstr( startX,startY,"Press 'S' to slow (y-axis)");
    164 
    165               mvaddstr( startX+1,startY,"Press 'F' to slow (y-axis)");
    166 
    167               mvaddstr( startX+2,startY,"Press '4' to the left");
    168 
    169               mvaddstr( startX+3,startY,"Press '6' to the right");
    170 
    171               mvaddstr( startX+4,startY,"(Please refer to the ReadMe.)");
    172 
    173               move( LINES-1,COLS-1 );
    174 
    175               refresh();
    176 
    177               od = getch();
    178 
    179               if( od=='y'||od=='Y' ){ clear_up(); }
    180 
    181               else {
    182 
    183                      wrap_up();
    184 
    185                      return false;
    186 
    187               }
    188 
    189        }
    190 
    191        /* 游戏最开始进入界面 */      
    192 
    193       
    194 
    195        show_score_gameon();
    196 
    197  
    198 
    199        signal( SIGINT,solve_sigint );
    200 
    201        signal( SIGQUIT,solve_sigquit );
    202 
    203       
    204 
    205        mvaddch( my_moving_ball.y_pos, my_moving_ball.x_pos, my_moving_ball.ball_symbol );
    206 
    207        show_baffle();
    208 
    209        show_my_moving_baffle();
    210 
    211        show_my_moving_brick( my_moving_brick[0].x,my_moving_brick[0].y );
    212 
    213        refresh();
    214 
    215  
    216 
    217        signal( SIGALRM, ball_move );
    218 
    219        //signal( SIGALRM, brick_move );
    220 
    221        set_ticker( 1000 / TICKS_PER_SEC );
    222 
    223        return true;
    224 
    225 }
    226 
    227 /********************************************************
    228 
    229        启动二维弹球
    230 
    231        set up the game
    232 
    233 *********************************************************/
    234 
    235  
    236 
    237  
    238 
    239 void wrap_up(){
    240 
    241        set_ticker( 0 );
    242 
    243        beep();
    244 
    245        endwin();
    246 
    247 }
    248 
    249 /********************************************************
    250 
    251        终止二维弹球
    252 
    253        end up the game
    254 
    255 *********************************************************/
    256 
    257  
    258 
    259  
    260 
    261 void solve_sigint(){
    262 
    263        mvaddstr( 2,0,"You enter ctrl+C");
    264 
    265        return ;
    266 
    267 }
    268 
    269 /********************************************************
    270 
    271        solve the signal :ctrl + C
    272 
    273 *********************************************************/
    274 
    275  
    276 
    277  
    278 
    279 void show_my_moving_brick( int x,int y ){
    280 
    281        if( my_moving_brick[0].flag==true ){
    282 
    283               mvaddstr( x,y,BRICK );
    284 
    285               move( LINES-1,COLS-1 );
    286 
    287        }
    288 
    289        return ;
    290 
    291 }
    292 
    293 void cover_my_moving_brick( int x,int y ){
    294 
    295        mvaddstr( x,y,"     " );
    296 
    297        move( LINES-1,COLS-1 );
    298 
    299        return ;
    300 
    301 }
    302 
    303 /********************************************************
    304 
    305        show my moving brick
    306 
    307 *********************************************************/
    308 
    309  
    310 
    311  
    312 
    313 void solve_sigquit(){
    314 
    315        mvaddstr( 2,0,"You enter ctrl+\");
    316 
    317        return ;
    318 
    319 }
    320 
    321 /********************************************************
    322 
    323        solve the signal :ctrl + 
    324 
    325 *********************************************************/
    326 
    327  
    328 
    329  
    330 
    331 void show_score_gameon(){
    332 
    333        move( 0,0 );
    334 
    335        addstr( Tip1 );
    336 
    337        char str1[ 105 ],str2[ 105 ];
    338 
    339        int cnt1 = 0,cnt2 = 0;
    340 
    341        int tp = score/2;
    342 
    343        int i;
    344 
    345        while( tp ){
    346 
    347               str1[ cnt1++ ] = tp%10 + '0';
    348 
    349               tp /= 10;
    350 
    351        }
    352 
    353        for( i=cnt1-1;i>=0;i-- ){
    354 
    355               str2[ cnt2++ ] = str1[ i ];
    356 
    357        }
    358 
    359        if( cnt2==0 ) str2[ cnt2++ ] = '0';
    360 
    361        str2[ cnt2 ] = '';
    362 
    363        addstr( "
    Your Score:" );
    364 
    365        addstr( str2 );
    366 
    367        move( LINES-1,COLS-1 );
    368 
    369 }
    370 
    371 /********************************************************
    372 
    373        显示得分
    374 
    375        show the score
    376 
    377 *********************************************************/
    378 
    379  
    380 
    381  
    382 
    383 void show_score_gameoff(){
    384 
    385        move( 0,0 );
    386 
    387        addstr( Tip2 );
    388 
    389        char str1[ 105 ],str2[ 105 ];
    390 
    391        int cnt1 = 0,cnt2 = 0;
    392 
    393        int tp = score;
    394 
    395        int i;
    396 
    397        while( tp ){
    398 
    399               str1[ cnt1++ ] = tp%10 + '0';
    400 
    401               tp /= 10;
    402 
    403        }
    404 
    405        for( i=cnt1-1;i>=0;i-- ){
    406 
    407               str2[ cnt2++ ] = str1[ i ];
    408 
    409        }
    410 
    411        if( cnt2==0 ) str2[ cnt2++ ] = '0';
    412 
    413        str2[ cnt2 ] = '';
    414 
    415        move( LINES/2,COLS/3 );
    416 
    417        addstr( Tip2 );
    418 
    419        mvaddstr( LINES/2+1,COLS/3,"You can input 'P' to play again." );
    420 
    421        move( LINES-1,COLS-1 );
    422 
    423 }
    424 
    425 /********************************************************
    426 
    427        show game over
    428 
    429 *********************************************************/
    430 
    431  
    432 
    433  
    434 
    435 void ball_move(){
    436 
    437        signal( SIGALRM,SIG_IGN );
    438 
    439       
    440 
    441        bool moved = false;
    442 
    443        int x_cur = my_moving_ball.x_pos;
    444 
    445        int y_cur = my_moving_ball.y_pos;
    446 
    447        bool crash_ed ;
    448 
    449  
    450 
    451        int yy_cur = my_moving_brick[0].y;
    452 
    453        if( (my_moving_brick[0].speed--)==1 ){
    454 
    455               my_moving_brick[0].y +=my_moving_brick[0].dir;
    456 
    457               if( my_moving_brick[0].y+5==RightCol||my_moving_brick[0].y==LeftCol ) my_moving_brick[0].dir *= (-1);
    458 
    459               my_moving_brick[0].speed = speed1;
    460 
    461        }
    462 
    463        cover_my_moving_brick( my_moving_brick[0].x,yy_cur );
    464 
    465        show_my_moving_brick( my_moving_brick[0].x,my_moving_brick[0].y );
    466 
    467        move( LINES-1,COLS-1 );
    468 
    469        refresh();
    470 
    471        //my_moving_brick
    472 
    473        if( my_moving_ball.x_Time1>0 && ((my_moving_ball.x_Time2--) == 1) ){
    474 
    475               moved = true;
    476 
    477               my_moving_ball.x_pos += my_moving_ball.x_dir;
    478 
    479               my_moving_ball.x_Time2 = my_moving_ball.x_Time1;
    480 
    481        }
    482 
    483  
    484 
    485        if( my_moving_ball.y_Time1>0 && ((my_moving_ball.y_Time2--) == 1) ){
    486 
    487               moved = true;
    488 
    489               my_moving_ball.y_pos += my_moving_ball.y_dir;
    490 
    491               my_moving_ball.y_Time2 = my_moving_ball.y_Time1;
    492 
    493        }
    494 
    495  
    496 
    497        if( moved == true ){
    498 
    499               crash_ed = ball_crash_brick();
    500 
    501               mvaddch( y_cur,x_cur,BLANK );
    502 
    503               mvaddch( my_moving_ball.y_pos,my_moving_ball.x_pos,my_moving_ball.ball_symbol );
    504 
    505               in_bound( &my_moving_ball );
    506 
    507               move( LINES-1,COLS-1 );
    508 
    509               refresh();
    510 
    511        }
    512 
    513        signal( SIGALRM,ball_move );
    514 
    515        return ;
    516 
    517 }
    518 
    519 /********************************************************
    520 
    521        try move the ball
    522 
    523 *********************************************************/
    524 
    525  
    526 
    527  
    528 
    529 bool ball_crash_brick(){
    530 
    531        if( my_moving_ball.y_pos==my_moving_brick[0].x ){
    532 
    533               if( my_moving_ball.x_pos>=my_moving_brick[0].y&&my_moving_ball.x_pos<=my_moving_brick[0].y+5 ){
    534 
    535                      cover_my_moving_brick( my_moving_brick[0].x,my_moving_brick[0].y );
    536 
    537                      my_moving_brick[0].flag = false;
    538 
    539                      return true;
    540 
    541               }
    542 
    543        }
    544 
    545        else
    546 
    547               return false;
    548 
    549 }
    550 
    551 /********************************************************
    552 
    553        when the ball crash with the brick
    554 
    555 *********************************************************/
    556 
    557  
    558 
    559  
    560 
    561 void in_bound( struct BallInfo *myballPoint ){
    562 
    563        bool return_dir = false;
    564 
    565        if( myballPoint->x_pos==LeftCol ){
    566 
    567               myballPoint->x_dir = 1;
    568 
    569               return_dir = true;
    570 
    571        }//left
    572 
    573        else if( myballPoint->x_pos==RightCol ){
    574 
    575               myballPoint->x_dir = -1;
    576 
    577               return_dir = true;
    578 
    579        }//right
    580 
    581        if( myballPoint->y_pos==TopRow ){
    582 
    583               myballPoint->y_dir = 1;
    584 
    585               return_dir = true;
    586 
    587        }//up
    588 
    589        else if( myballPoint->y_pos==BotRow ){
    590 
    591               if( ((myballPoint->x_pos)>=my_moving_Baffle.y) && ((myballPoint->x_pos)<=my_moving_Baffle.y+my_moving_Baffle.len) ){
    592 
    593                      myballPoint->y_dir = -1;
    594 
    595                      score ++;
    596 
    597                      show_score_gameon();
    598 
    599                      return_dir = true;
    600 
    601               }
    602 
    603               else{
    604 
    605                      show_score_gameoff();
    606 
    607                      wrap_up();
    608 
    609               }
    610 
    611        }//down
    612 
    613 }
    614 
    615 /********************************************************
    616 
    617        rebound the ball
    618 
    619 *********************************************************/
    620 
    621  
    622 
    623  
    624 
    625 int set_ticker( int n_msecs ){
    626 
    627        struct itimerval new_timeset;
    628 
    629        long n_sec, n_usecs;
    630 
    631  
    632 
    633        n_sec = n_msecs / 1000;
    634 
    635        n_usecs = ( n_msecs %1000 ) * 1000L;
    636 
    637       
    638 
    639        new_timeset.it_interval.tv_sec = n_sec;
    640 
    641        new_timeset.it_interval.tv_usec = n_usecs;
    642 
    643        new_timeset.it_value.tv_sec = n_sec;
    644 
    645        new_timeset.it_value.tv_usec = n_usecs;
    646 
    647       
    648 
    649        return setitimer( ITIMER_REAL, &new_timeset, NULL );
    650 
    651 }
    652 
    653 /********************************************************
    654 
    655        set the timer
    656 
    657 *********************************************************/
    658 
    659  
    660 
    661  
    662 
    663 bool judge_in_bound( int x,int y ){
    664 
    665        if( x>=BotRow && x<=TopRow && y>=LeftCol && y<=RightCol )
    666 
    667               return true;
    668 
    669        else
    670 
    671               return false;
    672 
    673 }
    674 
    675 void show_baffle(){
    676 
    677        int i;
    678 
    679        for( i=TopRow-1;i<=BotRow+1;i++ ){
    680 
    681               mvaddch( i,LeftCol-1,Baffle );
    682 
    683               mvaddch( i,RightCol+1,Baffle );
    684 
    685        }
    686 
    687        for( i=LeftCol-1;i<=RightCol+1;i++ ){
    688 
    689               mvaddch( TopRow-1,i,Baffle );
    690 
    691        }
    692 
    693        return ;
    694 
    695 }
    696 
    697 /********************************************************
    698 
    699        show the baffle
    700 
    701 *********************************************************/
    702 
    703  
    704 
    705  
    706 
    707 void try_move_my_moving_baffle( char od ){
    708 
    709        if( od==LEFT ){
    710 
    711               if( my_moving_Baffle.y-1 >= LeftCol ){
    712 
    713                      cover_my_moving_baffle();
    714 
    715                      my_moving_Baffle.y --;
    716 
    717                      show_my_moving_baffle();
    718 
    719               }
    720 
    721        }
    722 
    723        /* left */
    724 
    725        if( od==RIGHT ){
    726 
    727               if( my_moving_Baffle.y+my_moving_Baffle.len<=RightCol ){
    728 
    729                      cover_my_moving_baffle();
    730 
    731                      my_moving_Baffle.y ++;
    732 
    733                      show_my_moving_baffle();
    734 
    735               }
    736 
    737        }
    738 
    739        /* right */
    740 
    741 }
    742 
    743 /********************************************************
    744 
    745        solve my moving baffle's direction
    746 
    747 *********************************************************/
    748 
    749  
    750 
    751  
    752 
    753 void cover_my_moving_baffle(){
    754 
    755        int i;
    756 
    757        for( i=0;i<my_moving_Baffle.len;i++ )
    758 
    759               mvaddch( my_moving_Baffle.x,my_moving_Baffle.y+i,BLANK );
    760 
    761        return ;
    762 
    763 }
    764 
    765 void show_my_moving_baffle(){
    766 
    767        int i;
    768 
    769        for( i=0;i<my_moving_Baffle.len;i++ )
    770 
    771               mvaddch( my_moving_Baffle.x,my_moving_Baffle.y+i,my_moving_Baffle.baffle_symbol );
    772 
    773        return ;
    774 
    775 }
    776 
    777 /********************************************************
    778 
    779        show my moving baffle
    780 
    781 *********************************************************/
    782 
    783  
    784 
    785  
    786 
    787 int main(){
    788 
    789        char od;
    790 
    791       
    792 
    793        bool flag = set_up( true );
    794 
    795        /* start the game */
    796 
    797        if( flag==false )
    798 
    799               return 0;
    800 
    801        /* the user dont want to play the game */
    802 
    803       
    804 
    805        while( ( od=getch() )!='Q' ){
    806 
    807               if( od=='f'&&my_moving_ball.x_Time1>Min ) my_moving_ball.x_Time1 --;
    808 
    809               else if( od=='s'&&my_moving_ball.x_Time1<Max ) my_moving_ball.x_Time1 ++;
    810 
    811               else if( od=='F'&&my_moving_ball.y_Time1>Min ) my_moving_ball.y_Time1 --;
    812 
    813               else if( od=='S'&&my_moving_ball.y_Time1<Max ) my_moving_ball.y_Time1 ++;
    814 
    815               /* change the ball's speed */
    816 
    817               if( od=='J'&&my_moving_Baffle.len>=2 ) {
    818 
    819                      cover_my_moving_baffle();
    820 
    821                      my_moving_Baffle.len --;
    822 
    823                      show_my_moving_baffle();
    824 
    825               }
    826 
    827               else if( od=='L'&&my_moving_Baffle.y+my_moving_Baffle.len<RightCol ){
    828 
    829                      cover_my_moving_baffle();
    830 
    831                      my_moving_Baffle.len ++;
    832 
    833                      show_my_moving_baffle();
    834 
    835               }
    836 
    837               /* change my moving baffle's len */
    838 
    839               if( od=='P' ) {
    840 
    841                      clear_up();
    842 
    843                      set_up( false );
    844 
    845               }
    846 
    847               /* play again the game */
    848 
    849               if( od==LEFT||od==RIGHT ){
    850 
    851                      try_move_my_moving_baffle( od );
    852 
    853               }
    854 
    855               /* move my moving baffle */
    856 
    857        }
    858 
    859       
    860 
    861        wrap_up();
    862 
    863        /* end up the game */
    864 
    865        return 0;
    866 
    867 }
    View Code

    bounce.h

     1 #include<stdio.h>
     2 #include<curses.h>
     3 #include<stdlib.h>
     4 
     5 #define BLANK ' '
     6 #define BALL 'o'
     7 #define Baffle '#'
     8 #define BaffleSymbol '_'
     9 
    10 #define TopRow 5
    11 #define BotRow 20
    12 #define LeftCol 10
    13 #define RightCol 70
    14 
    15 #define startX 10
    16 #define startY 10
    17 /* ball start position */
    18 
    19 #define startX_ 21
    20 #define startY_ 10
    21 #define BaffleLen 7
    22 /* baffle start position */
    23 
    24 #define scorePosx 1
    25 #define scorePosy 1
    26 #define Tip1 "GameOn:"
    27 #define Tip2 "GameOver"
    28 #define Tip3 "YourScore:"
    29 
    30 #define TICKS_PER_SEC 25
    31 
    32 #define X_Time 5
    33 #define Y_Time 8
    34 
    35 #define LEFT '4'
    36 #define RIGHT '6'
    37 
    38 #define Min 1
    39 #define Max 12
    40 
    41 #define foreground 34
    42 #define background 0
    43 #define colormode 0
    44 
    45 #define speed1 3
    46 #define speed2 3
    47 
    48 #define BRICK "BRICK"
    49 
    50 #define DELTA 5
    51 
    52 struct BallInfo{
    53 int x_pos,y_pos;
    54 int x_Time1,y_Time1;
    55 int x_Time2,y_Time2;
    56 int x_dir,y_dir;
    57 char ball_symbol;
    58 };
    59 
    60 struct BaffleInfo{
    61 int x,y,len;
    62 char baffle_symbol;
    63 };
    64 
    65 
    66 struct Brick{
    67 int x,y;
    68 int speed;
    69 int dir;
    70 bool flag;
    71 };
    View Code
  • 相关阅读:
    paip.重装系统需要备份的资料总结..
    poj3078
    poj3009
    poj2151
    poj3274
    poj3436
    VC++:打开、保存文件对话框和浏览文件夹对话框
    目前所有的视频格式都有哪些?
    CMSHFlexGrid 类用法
    Matlab的ActiveX接口_百度文库
  • 原文地址:https://www.cnblogs.com/xxx0624/p/3456551.html
Copyright © 2011-2022 走看看