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+\信号,游戏结束后恢复信号

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

    分。。。。割。。。。线

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

 #include <stdio.h>

 #include <stdlib.h>

 #include <string.h>

 #include <curses.h>

 #include <signal.h>

 #include "bounce.h"

 #include <sys/time.h>

 bool set_up( bool );

 void wrap_up();

 void ball_move();

 void show_baffle();

 void in_bound( struct BallInfo * );

 int set_ticker( int );

 bool judge_in_bound( int ,int );

 void show_baffle();

 void try_move_my_moving_baffle( char );

 void show_my_moving_baffle();

 void cover_my_moving_baffle();

 void show_score_gameon();

 void show_score_gameoff();

 void clear_up();

 void solve_sigint();

 void solve_sigquit();

 bool ball_crash_brick();

 void show_my_moving_brick( int ,int );

 void cover_my_moving_brick( int ,int );

 struct BallInfo my_moving_ball;

 struct BaffleInfo my_moving_Baffle;

 struct Brick my_moving_brick[];

 int score;

 void clear_up(){

        int i,j;

        for( i=;i<;i++ ){

               for( j=;j<;j++ ){

                      mvaddch( i,j,BLANK );

               }

        }

        return ;

 }

 /********************************************************

        clear up the whole screen

 *********************************************************/

 bool set_up( bool flag ){

        char od;

        my_moving_ball.x_pos = startX;

        my_moving_ball.y_pos = startY;

        my_moving_ball.x_Time1 = my_moving_ball.x_Time2 = X_Time;

        my_moving_ball.y_Time1 = my_moving_ball.y_Time2 = Y_Time;

        my_moving_ball.x_dir = ;

        my_moving_ball.y_dir = ;

        my_moving_ball.ball_symbol = BALL;

        my_moving_Baffle.len = BaffleLen;

        my_moving_Baffle.baffle_symbol = BaffleSymbol;

        my_moving_Baffle.x = startX_;

        my_moving_Baffle.y = startY_;

        my_moving_brick[].x = TopRow+DELTA;

        my_moving_brick[].y = LeftCol+;

        my_moving_brick[].speed = speed1;

        my_moving_brick[].dir = ;

        my_moving_brick[].flag = true;

        score = ;

        initscr();

        noecho();

        crmode();

        keypad( stdscr,true );

        //attroff( A_BLINK );

        if( flag==true ){

               mvaddstr( startX-,startY,"Do you want play game (y/n)?" );

               mvaddstr( startX-,startY,"Press 's' to slow (x-axis)");

               mvaddstr( startX-,startY,"Press 'f' to fast (x-axis)");

               mvaddstr( startX,startY,"Press 'S' to slow (y-axis)");

               mvaddstr( startX+,startY,"Press 'F' to slow (y-axis)");

               mvaddstr( startX+,startY,"Press '4' to the left");

               mvaddstr( startX+,startY,"Press '6' to the right");

               mvaddstr( startX+,startY,"(Please refer to the ReadMe.)");

               move( LINES-,COLS- );

               refresh();

               od = getch();

               if( od=='y'||od=='Y' ){ clear_up(); }

               else {

                      wrap_up();

                      return false;

               }

        }

        /* 游戏最开始进入界面 */      

        show_score_gameon();

        signal( SIGINT,solve_sigint );

        signal( SIGQUIT,solve_sigquit );

        mvaddch( my_moving_ball.y_pos, my_moving_ball.x_pos, my_moving_ball.ball_symbol );

        show_baffle();

        show_my_moving_baffle();

        show_my_moving_brick( my_moving_brick[].x,my_moving_brick[].y );

        refresh();

        signal( SIGALRM, ball_move );

        //signal( SIGALRM, brick_move );

        set_ticker(  / TICKS_PER_SEC );

        return true;

 }

 /********************************************************

        启动二维弹球

        set up the game

 *********************************************************/

 void wrap_up(){

        set_ticker(  );

        beep();

        endwin();

 }

 /********************************************************

        终止二维弹球

        end up the game

 *********************************************************/

 void solve_sigint(){

        mvaddstr( ,,"You enter ctrl+C");

        return ;

 }

 /********************************************************

        solve the signal :ctrl + C

 *********************************************************/

 void show_my_moving_brick( int x,int y ){

        if( my_moving_brick[].flag==true ){

               mvaddstr( x,y,BRICK );

               move( LINES-,COLS- );

        }

        return ;

 }

 void cover_my_moving_brick( int x,int y ){

        mvaddstr( x,y,"     " );

        move( LINES-,COLS- );

        return ;

 }

 /********************************************************

        show my moving brick

 *********************************************************/

 void solve_sigquit(){

        mvaddstr( ,,"You enter ctrl+\\");

        return ;

 }

 /********************************************************

        solve the signal :ctrl + \

 *********************************************************/

 void show_score_gameon(){

        move( , );

        addstr( Tip1 );

        char str1[  ],str2[  ];

        int cnt1 = ,cnt2 = ;

        int tp = score/;

        int i;

        while( tp ){

               str1[ cnt1++ ] = tp% + '';

               tp /= ;

        }

        for( i=cnt1-;i>=;i-- ){

               str2[ cnt2++ ] = str1[ i ];

        }

        if( cnt2== ) str2[ cnt2++ ] = '';

        str2[ cnt2 ] = '\0';

        addstr( "\nYour Score:" );

        addstr( str2 );

        move( LINES-,COLS- );

 }

 /********************************************************

        显示得分

        show the score

 *********************************************************/

 void show_score_gameoff(){

        move( , );

        addstr( Tip2 );

        char str1[  ],str2[  ];

        int cnt1 = ,cnt2 = ;

        int tp = score;

        int i;

        while( tp ){

               str1[ cnt1++ ] = tp% + '';

               tp /= ;

        }

        for( i=cnt1-;i>=;i-- ){

               str2[ cnt2++ ] = str1[ i ];

        }

        if( cnt2== ) str2[ cnt2++ ] = '';

        str2[ cnt2 ] = '\0';

        move( LINES/,COLS/ );

        addstr( Tip2 );

        mvaddstr( LINES/+,COLS/,"You can input 'P' to play again." );

        move( LINES-,COLS- );

 }

 /********************************************************

        show game over

 *********************************************************/

 void ball_move(){

        signal( SIGALRM,SIG_IGN );

        bool moved = false;

        int x_cur = my_moving_ball.x_pos;

        int y_cur = my_moving_ball.y_pos;

        bool crash_ed ;

        int yy_cur = my_moving_brick[].y;

        if( (my_moving_brick[].speed--)== ){

               my_moving_brick[].y +=my_moving_brick[].dir;

               if( my_moving_brick[].y+==RightCol||my_moving_brick[].y==LeftCol ) my_moving_brick[].dir *= (-);

               my_moving_brick[].speed = speed1;

        }

        cover_my_moving_brick( my_moving_brick[].x,yy_cur );

        show_my_moving_brick( my_moving_brick[].x,my_moving_brick[].y );

        move( LINES-,COLS- );

        refresh();

        //my_moving_brick

        if( my_moving_ball.x_Time1> && ((my_moving_ball.x_Time2--) == ) ){

               moved = true;

               my_moving_ball.x_pos += my_moving_ball.x_dir;

               my_moving_ball.x_Time2 = my_moving_ball.x_Time1;

        }

        if( my_moving_ball.y_Time1> && ((my_moving_ball.y_Time2--) == ) ){

               moved = true;

               my_moving_ball.y_pos += my_moving_ball.y_dir;

               my_moving_ball.y_Time2 = my_moving_ball.y_Time1;

        }

        if( moved == true ){

               crash_ed = ball_crash_brick();

               mvaddch( y_cur,x_cur,BLANK );

               mvaddch( my_moving_ball.y_pos,my_moving_ball.x_pos,my_moving_ball.ball_symbol );

               in_bound( &my_moving_ball );

               move( LINES-,COLS- );

               refresh();

        }

        signal( SIGALRM,ball_move );

        return ;

 }

 /********************************************************

        try move the ball

 *********************************************************/

 bool ball_crash_brick(){

        if( my_moving_ball.y_pos==my_moving_brick[].x ){

               if( my_moving_ball.x_pos>=my_moving_brick[].y&&my_moving_ball.x_pos<=my_moving_brick[].y+ ){

                      cover_my_moving_brick( my_moving_brick[].x,my_moving_brick[].y );

                      my_moving_brick[].flag = false;

                      return true;

               }

        }

        else

               return false;

 }

 /********************************************************

        when the ball crash with the brick

 *********************************************************/

 void in_bound( struct BallInfo *myballPoint ){

        bool return_dir = false;

        if( myballPoint->x_pos==LeftCol ){

               myballPoint->x_dir = ;

               return_dir = true;

        }//left

        else if( myballPoint->x_pos==RightCol ){

               myballPoint->x_dir = -;

               return_dir = true;

        }//right

        if( myballPoint->y_pos==TopRow ){

               myballPoint->y_dir = ;

               return_dir = true;

        }//up

        else if( myballPoint->y_pos==BotRow ){

               if( ((myballPoint->x_pos)>=my_moving_Baffle.y) && ((myballPoint->x_pos)<=my_moving_Baffle.y+my_moving_Baffle.len) ){

                      myballPoint->y_dir = -;

                      score ++;

                      show_score_gameon();

                      return_dir = true;

               }

               else{

                      show_score_gameoff();

                      wrap_up();

               }

        }//down

 }

 /********************************************************

        rebound the ball

 *********************************************************/

 int set_ticker( int n_msecs ){

        struct itimerval new_timeset;

        long n_sec, n_usecs;

        n_sec = n_msecs / ;

        n_usecs = ( n_msecs % ) * 1000L;

        new_timeset.it_interval.tv_sec = n_sec;

        new_timeset.it_interval.tv_usec = n_usecs;

        new_timeset.it_value.tv_sec = n_sec;

        new_timeset.it_value.tv_usec = n_usecs;

        return setitimer( ITIMER_REAL, &new_timeset, NULL );

 }

 /********************************************************

        set the timer

 *********************************************************/

 bool judge_in_bound( int x,int y ){

        if( x>=BotRow && x<=TopRow && y>=LeftCol && y<=RightCol )

               return true;

        else

               return false;

 }

 void show_baffle(){

        int i;

        for( i=TopRow-;i<=BotRow+;i++ ){

               mvaddch( i,LeftCol-,Baffle );

               mvaddch( i,RightCol+,Baffle );

        }

        for( i=LeftCol-;i<=RightCol+;i++ ){

               mvaddch( TopRow-,i,Baffle );

        }

        return ;

 }

 /********************************************************

        show the baffle

 *********************************************************/

 void try_move_my_moving_baffle( char od ){

        if( od==LEFT ){

               if( my_moving_Baffle.y- >= LeftCol ){

                      cover_my_moving_baffle();

                      my_moving_Baffle.y --;

                      show_my_moving_baffle();

               }

        }

        /* left */

        if( od==RIGHT ){

               if( my_moving_Baffle.y+my_moving_Baffle.len<=RightCol ){

                      cover_my_moving_baffle();

                      my_moving_Baffle.y ++;

                      show_my_moving_baffle();

               }

        }

        /* right */

 }

 /********************************************************

        solve my moving baffle's direction

 *********************************************************/

 void cover_my_moving_baffle(){

        int i;

        for( i=;i<my_moving_Baffle.len;i++ )

               mvaddch( my_moving_Baffle.x,my_moving_Baffle.y+i,BLANK );

        return ;

 }

 void show_my_moving_baffle(){

        int i;

        for( i=;i<my_moving_Baffle.len;i++ )

               mvaddch( my_moving_Baffle.x,my_moving_Baffle.y+i,my_moving_Baffle.baffle_symbol );

        return ;

 }

 /********************************************************

        show my moving baffle

 *********************************************************/

 int main(){

        char od;

        bool flag = set_up( true );

        /* start the game */

        if( flag==false )

               return ;

        /* the user dont want to play the game */

        while( ( od=getch() )!='Q' ){

               if( od=='f'&&my_moving_ball.x_Time1>Min ) my_moving_ball.x_Time1 --;

               else if( od=='s'&&my_moving_ball.x_Time1<Max ) my_moving_ball.x_Time1 ++;

               else if( od=='F'&&my_moving_ball.y_Time1>Min ) my_moving_ball.y_Time1 --;

               else if( od=='S'&&my_moving_ball.y_Time1<Max ) my_moving_ball.y_Time1 ++;

               /* change the ball's speed */

               if( od=='J'&&my_moving_Baffle.len>= ) {

                      cover_my_moving_baffle();

                      my_moving_Baffle.len --;

                      show_my_moving_baffle();

               }

               else if( od=='L'&&my_moving_Baffle.y+my_moving_Baffle.len<RightCol ){

                      cover_my_moving_baffle();

                      my_moving_Baffle.len ++;

                      show_my_moving_baffle();

               }

               /* change my moving baffle's len */

               if( od=='P' ) {

                      clear_up();

                      set_up( false );

               }

               /* play again the game */

               if( od==LEFT||od==RIGHT ){

                      try_move_my_moving_baffle( od );

               }

               /* move my moving baffle */

        }

        wrap_up();

        /* end up the game */

        return ;

 }

bounce.h

 #include<stdio.h>
#include<curses.h>
#include<stdlib.h> #define BLANK ' '
#define BALL 'o'
#define Baffle '#'
#define BaffleSymbol '_' #define TopRow 5
#define BotRow 20
#define LeftCol 10
#define RightCol 70 #define startX 10
#define startY 10
/* ball start position */ #define startX_ 21
#define startY_ 10
#define BaffleLen 7
/* baffle start position */ #define scorePosx 1
#define scorePosy 1
#define Tip1 "GameOn:"
#define Tip2 "GameOver"
#define Tip3 "YourScore:" #define TICKS_PER_SEC 25 #define X_Time 5
#define Y_Time 8 #define LEFT '4'
#define RIGHT '6' #define Min 1
#define Max 12 #define foreground 34
#define background 0
#define colormode 0 #define speed1 3
#define speed2 3 #define BRICK "BRICK" #define DELTA 5 struct BallInfo{
int x_pos,y_pos;
int x_Time1,y_Time1;
int x_Time2,y_Time2;
int x_dir,y_dir;
char ball_symbol;
}; struct BaffleInfo{
int x,y,len;
char baffle_symbol;
}; struct Brick{
int x,y;
int speed;
int dir;
bool flag;
};

Linux---弹球游戏的更多相关文章

  1. 疯狂java实战演义 弹球游戏代码

    package org.crazyit.ball; import java.awt.Image; import java.io.File; import javax.imageio.ImageIO; ...

  2. 使用html+css+js实现弹球游戏

    使用html+css+js实现弹球游戏 效果图: 代码如下,复制即可使用: <!doctype html> <head> <style type="text/c ...

  3. Python 练习项目1 弹球游戏

    这几天学习了python的基础知识,然后参考了网上的一些资料,完成了一个自己的小游戏,弹球游戏比较简单,但却具备了一些游戏的普遍特征,对于初学者是一个比较合适的锻炼的项目. 下面是效果图: 完整程序: ...

  4. HTML5与Javascript 实现网页弹球游戏

    终于效果图: 1. 使用html 5 的canvas 技术和javascript实现弹球游戏 总体流程图: 1.1 html5 canvas技术的使用 首先在html页面中定义画布. <canv ...

  5. Scratch运动模块——有趣的弹球游戏(一)

    大家好!我是蓝老师,有了前几期Scratch的基础,相信大家早已摩拳擦掌,跃跃欲试了,甚至还有些小伙伴已经编写了非常不错的程序. 学习编程就是这样不断探索.主动思考.解决问题的过程. 本期内容: 课程 ...

  6. 【编程教室】PONG - 100行代码写一个弹球游戏

    大家好,欢迎来到 Crossin的编程教室 ! 今天跟大家讲一讲:如何做游戏 游戏的主题是弹球游戏<PONG>,它是史上第一款街机游戏.因此选它作为我这个游戏开发系列的第一期主题. 游戏引 ...

  7. 使用 Flutter 与 Firebase 制作 I/O 弹球游戏

    文/ Very Good Ventures 团队,5 月 11 日发表于 Flutter 官方博客 为了今年的 Google I/O 大会,Flutter 团队使用 Flutter 以及 Fireba ...

  8. 玩家福音:10款最佳Linux免费游戏

    “我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...

  9. Linux赛车游戏 SuperTuxKart 1.0 正式发布

    SuperTuxKart是一款受Mario Kart(马里奥赛车)启发并以Linux/Tux为主题的开源赛车游戏,经过12年多的开发,已经达到1.0版本.并且确定这个版本确实是一个重要的里程碑. Su ...

  10. 开源玩家福利:十大Linux免费游戏

    假如当你考虑从Windows平台迁移至Linux平台时,“我能在Linux平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是“快去Linux平台吧!”.感谢开源组织一直以来坚持不懈为Linu ...

随机推荐

  1. RNN-theano代码解析

    import theano import numpy import os import pdb from theano import tensor as T from collections impo ...

  2. java新手笔记33 多线程、客户端、服务器

    1.Mouse package com.yfs.javase; public class Mouse { private int index = 1; private boolean isLive = ...

  3. Item47

    STL迭代器分类:input迭代器.output迭代器.forward迭代器.bidirectional迭代器.random access迭代器. Input迭代器:只能向前移动,一次一步,客户只读取 ...

  4. 函数 swap

    1,default swap namespace std { template<typename T> void swap( T& a, T& b) { T temp(a) ...

  5. 算法 replace,replace_copy,back_inserter

    replace (list.begin(), list.end(), , ); // replace any elements with value of 0 by 42 replace算法对输入序列 ...

  6. 深度探索C++对象模型读书笔记(2)

    以下测试平台均为vs 2012 指向Data Member的指针测试(1) #include <stdio.h> class Base1 { public: int val1; int v ...

  7. 登堂入室——java流

    ——文章出自PeterYe,不得私自转载 我所知道的 java.io里面的[流],就仿佛太平洋里面的水一样,浩浩荡荡,横无际涯... -----2016/7/16--------公寓处记录------ ...

  8. Java使用基本JDK操作ZIP文件以及zip文件的加密、解密等功能

    Java使用基本JDK操作ZIP文件 http://blog.csdn.net/zhyh1986/article/details/7723649 Java解压和压缩带密码的zip文件 http://b ...

  9. bower——库管理工具

    bower了解: 随着网页功能的复杂化,各种网页效果的实现,现在单一的一个或两个库文件或许已经不能够满足我们的需要,但当有很多的库文件的时候,手动编辑已经不能胜任,对于引入的库文件而言,往往都是牵一发 ...

  10. python学习之socket创建html服务器

    #coding:utf-8 import socket def process_request(request): request.recv(1024)#读取接受的字节 request.send(&q ...