#include <signal.h>
#include <sys/time.h>
#include <stdio.h>
#include <sys/time.h>
void init();
void wrap_up();
void ball_move();
struct Ball ball; // 小球
struct Baffle baffle; // 挡板
int matrix[5][15]; // 记录砖块区域信息的矩阵
int main()
{
int ch;
init();
while(1)
{
}
}
void init()
{
/*
该函数主要完成初始化的工作
*/
int i,j;
initscr();
crmode();
noecho();
// 初始矩阵
for(i = 0; i < 5; i++)
{
for(j = 0; j < 15; j++)
{
matrix[i][j] = 0;
}
}
initscr();
box(stdscr, ACS_VLINE, ACS_HLINE);
noecho();
crmode();
// 初始小球信息
ball.x_poi = X_INIT_BALL;
ball.y_poi = Y_INIT_BALL;
ball.x_speed = X_SPEED_INIT;
ball.y_speed = Y_SPEED_INIT;
ball.symbol = 'O';
// 初始挡板信息
baffle.x_left = X_INIT_LEFT;
baffle.y_right = Y_INIT_LEFT;
baffle.speed = SPEED_INIT_BAFFLE;
// 绘制砖块,并修改矩阵的值(左上到右下的部分)
attron(A_REVERSE);
for(i = BRICK_TOP, j = BRICK_LEFT; i <= BRICK_BOTTOM; i++, j += 3)
{
move(i, j);
addstr(BRICK_SYMBOL);
matrix[i - BRICK_TOP][j - BRICK_LEFT] = matrix[i - BRICK_TOP][j - BRICK_LEFT + 1] = matrix[i - BRICK_TOP][j - BRICK_LEFT + 2] = 1;
}
// 左下到右上的部分
for(i = BRICK_BOTTOM, j = BRICK_LEFT; i >= BRICK_TOP; i--, j+= 3)
{
move(i. j);
addstr(BRICK_SYMBOL);
matrix[i - BRICK_TOP][j - BRICK_LEFT] = matrix[i - BRICK_TOP][j - BRICK_LEFT + 1] = matrix[i - BRICK_TOP][j - BRICK_LEFT + 2] = 1;
}
// 中间横向的部分
for(i = (BRICK_TOP + BRICK_BOTTOM) / 2, j = BRICK_LEFT; j <= BRICK_RIGHT; j += 6)
{
move(i, j);
addstr(BRICK_SYMBOL);
matrix[i - BRICK_TOP][j - BRICK_LEFT] = matrix[i - BRICK_TOP][j - BRICK_LEFT + 1] = matrix[i - BRICK_TOP][j - BRICK_LEFT + 2] = 1;
}
attroff(A_REVERSE);
refresh();
// 绘制小球和挡板
move(ball.y_poi, ball.x_poi);
addch(SYMBOL_BALL);
move(BOTTOM, baffle.x_left);
addstr(SYMBOL_BAFFLE);
move(BOTTOM, 0);
refresh();
signal(SIGALRM, ball_move);
set_ticker(100);
}
int set_ticker(int n_msecs){
struct itimerval new_timeset;
long n_sec,n_usecs;
n_sec=n_msecs/1000;
n_usecs=(n_msecs%1000)*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);
}
#include <curses.h>
/*
关于游戏区域的常量定义
*/
#define TOP 0 // 游戏区域的上边界
#define BOTTOM LINES - 1 // 游戏区域的下边界
#define LEFT 0 // 游戏区域的左边界
#define RIGHT COLS - 1; // 游戏区域的右边界
/*
* 关于挡板的常量定义
*/
#define BLANK_BAFFLE " " // 用于擦除使用
#define SYMBOL_BAFFLE "========" // 挡板的字符化表示
#define X_INIT_LEFT COLS / 2 - 4 // 挡板左部 X 坐标的初始值
#define X_INIT_RIGHT COLS / 2 + 3 // 挡板右部 X 坐标的初始值
#define SPEED_BAFFLE_INIT 1
/*
关于球的常量定义
*/
#define BLANK_BALL ' ' // 用于擦除使用
#define SYMBOL_BALL 'O' // 球的字符化表示
#define X_INIT_BALL COLS / 2 // 球 X 坐标的初始值
#define Y_INIT_BALL LINES - 1 // 球 Y 坐标的初始值
#define X_INIT_SPEED 1 // 球 X 坐标上的速度初始值
#define Y_INIT_SPEED 1 // 球 Y 坐标上的速度初始值
/*
关于砖块区域的常量定义
*/
#define BRICK_LEFT = COLS / 2 - 6;
#define BRICK_RIGHT = COLS / 2 + 8;
#define BRICK_TOP = 1;
#define BRICK_BOTTOM = 5;
#define BRICK_SYMBOL " ";
struct Ball
{
int x_poi, y_poi; // 球的 X,Y 坐标
int x_speed, y_speed; // 球在 X,Y 方向的速度
char symbol; // 球的字符化表示
};
struct Baffle
{
int x_left, x_right; // 挡板的 X,Y 坐标
int length; // 挡板的长度
int speed; // 挡板的速度(仅在 X 方向上)
char *symbol; // 挡板的字符化表示
};
#include <curses.h>
#include <sys/time.h>
#include <signal.h>
#include <stdlib.h>
#define LEFT 0
#define RIGHT COLS-1
#define TOP 0
#define BOTTOM LINES-1
#define WIDE RIGHT-LEFT+1
#define BOARD_LENGTH 10
char BALL= 'O';
char BLANK= ' ';
int hdir;
int vdir;
int pos_X ;
int pos_Y;
int left_board;
int right_board;
int is_lose=0;
int delay=100;
int ndelay;
void moveBall();
void init(){
int i,j;
clear();
//初始球
pos_X =20;
pos_Y = BOTTOM-1;
hdir=1;
vdir=-1;
//初始挡板
left_board=20;
right_board=left_board+BOARD_LENGTH;
for(i=left_board;i<=right_board;i++){
move(BOTTOM,i);
addch('=');
}
//初始刷新时间
ndelay=2;
signal(SIGALRM,moveBall);
set_ticker(delay*ndelay);
keypad(stdscr,TRUE);
attroff(A_BLINK);
is_lose=0;
move(pos_Y,pos_X);
addch(BALL);
move(LINES-1, COLS-1);
refresh();
usleep(100000);
move(LINES-1,COLS-1);
refresh();
}
void moveBall(){
if(is_lose) return;
signal(SIGALRM,moveBall);
move(pos_Y,pos_X);
addch(BLANK);
pos_X += hdir;
pos_Y += vdir;
//改变方向
if(pos_X >= RIGHT)
hdir = -1;
if(pos_X <= LEFT)
hdir = 1;
if(pos_Y <= TOP)
vdir = 1;
//当球在底部的时候进行额外的处理
if(pos_Y >= BOTTOM-1){
if(pos_X>=left_board&&pos_X<=right_board)
vdir=-1;
else{
is_lose=1;
move(pos_Y,pos_X);
addch(BALL);
move(LINES-1, COLS-1);
refresh();
usleep(delay*ndelay*1000);
move(pos_Y,pos_X);
addch(BLANK);
pos_X += hdir;
pos_Y += vdir;
move(pos_Y,pos_X);
addch(BALL);
move(LINES-1, COLS-1);
refresh();
}
}
move(pos_Y,pos_X);
addch(BALL);
move(LINES-1, COLS-1);
refresh();
}
void control(){
init();
int cmd;
while (1)
{
if(!is_lose){
cmd=getch();
if(cmd==27) break;//退出
//挡板左移
else if(cmd==KEY_LEFT){
if(left_board>0){
move(BOTTOM,right_board);
addch(' ');
right_board--;
left_board--;
move(BOTTOM,left_board);
addch('=');
move(BOTTOM,RIGHT);
refresh();
}
}
//挡板右移
else if(cmd==KEY_RIGHT){
if(right_board<RIGHT){
move(BOTTOM,left_board);
addch(' ');
right_board++;
left_board++;
move(BOTTOM,right_board);
addch('=');
move(BOTTOM,RIGHT);
refresh();
}
}
else if(cmd==KEY_UP){
delay=delay/2;
if(delay<10)delay=delay*2;
}
else if(cmd==KEY_DOWN){
delay=delay*2;
if(delay>200)delay=delay/2;
}
}
else{
//输掉球后的处理
int flag=1;
char choice;
move(6,10);
addstr("You failed,try again?(y/n):");
refresh();
choice=getch();
while(flag){
if(choice=='y'||choice=='Y'||choice=='n'||choice=='N')
flag=0;
else choice=getch();
}
if(choice=='y'||choice=='Y'){
init();
continue;
}
else if(choice=='n'||choice=='N'){
break;
}
}
}
}
int set_ticker(int n_msecs){
struct itimerval new_timeset;
long n_sec,n_usecs;
n_sec=n_msecs/1000;
n_usecs=(n_msecs%1000)*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);
}
int main()
{
initscr();
crmode();
noecho();
control();
endwin();
return 0;
}