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 ...
随机推荐
- 第七篇、使用UIView的animateWithDuration方法制作简易动画
import UIKit class LolitaCircleButton: UIButton { private var color: UIColor private var imageURL: S ...
- TTTAttributedLabel 如何将多个字符串高亮显示
TTTAttributedLabel进行多个字符串的高亮显示. 需要对每个字符串进行匹配,从而得到所有需要高亮的NSRange,然后利用NSMutableAttributedString对每个NSRa ...
- Bugzilla+MySql+IIS+ActivePerl搭建指南
头在忙着他的技术研究,对团队建设.测试管理.流程规范都不怎么理会,眼见着产品进入后期整合阶段,在测试过错中出现很多Bug,单靠着我一个人用txt来收集整理bug需求,然后整理成word,放在svn上面 ...
- 利用AVL树实现搬箱问题的best fit策略
//my.h //定义两个数据类型,货物Goods,箱子Box #include <vector> #include <cstddef> #include <iostre ...
- JS 框架
<html xmlns=”http://www.w3.org/1999/xhtml”> <head> <title>Untitled Page</title& ...
- iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存
iOS 基本内存管理-多对象内存管理(2)中可以看到涉及到对象的引用都要手动管理内存:每个对象都需要写如下代码 // 1.对要传入的"新车"对象car和目前Person类对象所拥有 ...
- position containing block原点
如果元素有属性 'position:absolute',containing block 由最近的 position 不是 static 的祖先建立,按下面的步骤: 1.如果祖先是块级元 ...
- 使用spring手动控制事务
http://kiral.iteye.com/blog/92742 使用spring手动控制事务 Spring事务配置的五种方式 (1) http://www.cnblogs.com/hellojav ...
- maven增量编译
最近由于不清楚maven(2.2.x)增量编译的机制,导致应用出现了一个当时觉得非常诡异的一个问题.先描述一下问题. 背景是应用A有一个公用的base包,版本为1.6.6-SNAPSHOT,应 ...
- python--gevent协程及协程概念
何为协程 协程,又称微线程.英文名Coroutine. 协程最大的优势就是协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的 ...