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+\信号,游戏结束后恢复信号
/×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
分。。。。割。。。。线
/×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
#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---弹球游戏的更多相关文章
- 疯狂java实战演义 弹球游戏代码
package org.crazyit.ball; import java.awt.Image; import java.io.File; import javax.imageio.ImageIO; ...
- 使用html+css+js实现弹球游戏
使用html+css+js实现弹球游戏 效果图: 代码如下,复制即可使用: <!doctype html> <head> <style type="text/c ...
- Python 练习项目1 弹球游戏
这几天学习了python的基础知识,然后参考了网上的一些资料,完成了一个自己的小游戏,弹球游戏比较简单,但却具备了一些游戏的普遍特征,对于初学者是一个比较合适的锻炼的项目. 下面是效果图: 完整程序: ...
- HTML5与Javascript 实现网页弹球游戏
终于效果图: 1. 使用html 5 的canvas 技术和javascript实现弹球游戏 总体流程图: 1.1 html5 canvas技术的使用 首先在html页面中定义画布. <canv ...
- Scratch运动模块——有趣的弹球游戏(一)
大家好!我是蓝老师,有了前几期Scratch的基础,相信大家早已摩拳擦掌,跃跃欲试了,甚至还有些小伙伴已经编写了非常不错的程序. 学习编程就是这样不断探索.主动思考.解决问题的过程. 本期内容: 课程 ...
- 【编程教室】PONG - 100行代码写一个弹球游戏
大家好,欢迎来到 Crossin的编程教室 ! 今天跟大家讲一讲:如何做游戏 游戏的主题是弹球游戏<PONG>,它是史上第一款街机游戏.因此选它作为我这个游戏开发系列的第一期主题. 游戏引 ...
- 使用 Flutter 与 Firebase 制作 I/O 弹球游戏
文/ Very Good Ventures 团队,5 月 11 日发表于 Flutter 官方博客 为了今年的 Google I/O 大会,Flutter 团队使用 Flutter 以及 Fireba ...
- 玩家福音:10款最佳Linux免费游戏
“我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...
- Linux赛车游戏 SuperTuxKart 1.0 正式发布
SuperTuxKart是一款受Mario Kart(马里奥赛车)启发并以Linux/Tux为主题的开源赛车游戏,经过12年多的开发,已经达到1.0版本.并且确定这个版本确实是一个重要的里程碑. Su ...
- 开源玩家福利:十大Linux免费游戏
假如当你考虑从Windows平台迁移至Linux平台时,“我能在Linux平台上游戏吗?”这类疑问正困扰着你,那么对此这有一个答案就是“快去Linux平台吧!”.感谢开源组织一直以来坚持不懈为Linu ...
随机推荐
- LINQ(LINQ to Entities)
LINQ to Entities 是 LINQ 中最吸引人的部分.它让你可以使用标准的 C# 对象与数据库的结构和数据打交道.使用 LINQ to Entities 时,LINQ 查询在后台转换为 S ...
- Java集合源码分析
Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致可以分为如下五个部分:List列表.Set集合.Map映射.迭 ...
- IPointCollection转IPolyline
IPointCollection转线IPolyline: IPolyline pl = new PolylineClass(); IPointCollection ptc = pl as IPoint ...
- 解决backbone url请求中参数有中文,存入数据库是乱码
最近项目用到了backbone 做前后端的分离方案,遇见了中文乱码问题,解决方案总结如下: 假设需要存一条课程记录到后台 model定义如下: var AddCourse= Backbone.Mo ...
- asp.net导出Excel
注意这种方法,导出的excel没有网格线 当在导出Execl或Word的时候,会发生只能在执行 Render() 的过程中调用 RegisterForEventValidation的错误提示.下面的2 ...
- winform 与 html 交互 简单案例
本文主要简单的记录winform如何与html文件中的信息如何进行交互,即在winform中加载html界面,从而可以进行相互调用. 1.新建一个winform项目,若要在winform中加载html ...
- Cassandra1.2文档学习(11)—— 删除数据
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/dml/dml_about_ ...
- Spark机器学习 Day2 快速理解机器学习
Spark机器学习 Day2 快速理解机器学习 有两个问题: 机器学习到底是什么. 大数据机器学习到底是什么. 机器学习到底是什么 人正常思维的过程是根据历史经验得出一定的规律,然后在当前情况下根据这 ...
- Django工程读取mongodb并使用分页器
pycharm开发django工程(二) 项目需求: 1. 从mongodb中读取数据,并显示到网页中 2. 在网页显示的每一页加入分页符 首先使用pycharm的企业版新建一个django的虚拟工程 ...
- 1072. Gas Station (30)
先要求出各个加油站 最短的 与任意一房屋之间的 距离D,再在这些加油站中选出最长的D的加油站 ,该加油站 为 最优选项 (坑爹啊!).如果相同D相同 则 选离各个房屋平均距离小的,如果还是 相同,则 ...