读书人

gcc停编译的小游戏有点小bug求大神

发布时间: 2013-09-05 16:02:06 作者: rapoo

gcc下编译的小游戏,有点小bug,求大神帮忙啊!!
linux下写的一个贪吃蛇游戏但有点小BUG
当蛇在末行(19,20行)运行时,显示不正确, 步长由1变为2,其他行显示都正确.print_snake调用时
并不显示蛇身,第二次调用时才显示,导致步长变为2。但测试时print_snake是被正确调用的
下面是源码:
snake.h


#ifndef _SNAKE_H
#define _SNAKE_H
#include <iostream>
#include <list>
#include <csetjmp>
#include <sys/time.h>
using namespace std;
#define p_x 10 //界面开始位置
#define p_y 5
#define X 50 //游戏界面大小
#define Y 20
#define LEVEL_SCORE 800 //每次升级所需要的分数
typedef struct Node{
int y;
int x;
Node(int y,int x):y(y),x(x){}
}Snake;
list<Snake> L; //保存每个射节点的坐标
jmp_buf env;
static int x,y; //游戏中目标出现的坐标
static int matirx[Y][X]={1,1,1,1};
static int level =1; //游戏等级
static int score =0; //游戏分数
typedef struct itimerval LEVEL;
//每个不同等级间歇计时器的值,用于改变游戏速度
static LEVEL level_01 = { {0, 400000}, {0, 400000} };
static LEVEL level_02 = { {0, 300000}, {0, 300000} };
static LEVEL level_03 = { {0, 250000}, {0, 250000} };
static LEVEL level_04 = { {0, 210000}, {0, 210000} };
static LEVEL level_05 = { {0, 180000}, {0, 180000} };
static LEVEL level_06 = { {0, 150000}, {0, 150000} };
static LEVEL level_07 = { {0, 120000}, {0, 120000} };
static LEVEL level_08 = { {0, 100000}, {0, 100000} };
static LEVEL level_09 = { {0, 80000}, {0, 80000} };
void print_start_interface();
void print_snake();
void print_goal();
void print_score();
void move_up(int);
void move_down(int);
void move_left(int);
void move_right(int);
void Init_matirx();
void snake_control();
bool eat_goal();
void print_level();
void change_level();
void game_over();
#endif

snake.cpp

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <unistd.h>
#include <signal.h>
#include <termios.h>


#include "snake.h"
//打印游戏界面
void print_start_interface(){
int x,y;
printf("\33[2J");//清屏
printf("\33[%d;%dH\33[32m分数:\33[0m", p_y -2, p_x+20);
printf("\33[%d;%dH\33[32m等级:\33[0m", p_y -3, p_x+20);
for(x=p_x,y=p_y;x<=62;x++)
printf("\33[%d;%dH\33[44m==\33[0m",y,x);
for(x=p_x,y=p_y+1;y<=25;y++)
printf("\33[%d;%dH\33[44m||\33[0m",y,x);
for(x=p_x,y=p_y+21;x<=62;x++)
printf("\33[%d;%dH\33[44m==\33[0m",y,x);
for(x=p_x+52,y=p_y+1;y<=25;y++)
printf("\33[%d;%dH\33[44m||\33[0m",y,x);
}
//打印蛇身
void print_snake(){
int x1=p_x+2,y1=p_y+1;
for(int i=0;i<Y;i++){
for(int j=0;j<X;j++){
if(matirx[i][j]==1){
printf("\33[%d;%dH\33[41m[]\33[0m",y1,x1+j);
//在19,20运行时进入这个条件时,printf未被实行,求问大神是为什么?其他行都正确执行,我把蛇身打印到文件中,也是显示正确的,但输出到屏幕就有问题。
j++;
}
else if(i==y&&j==x)
j++;
else
printf("\33[%d;%dH \33[0m",y1,x1+j);
}
y1++;
}
}
//将蛇身放如数组中
void Init_matirx(){
memset(matirx,0,sizeof(matirx));
list<Snake>::iterator it=L.begin();
while(it!=L.end()){
matirx[it->y][it->x]=1;
matirx[it->y][it->x+1]=1;
it++;
}
}
//打印目标
void print_goal(){
printf("\33[%d;%dH\33[43m[]\33[0m",y+p_y+1,x+p_x+2);
}
//是否吃掉目标
bool eat_goal(){
int x1=L.front().x;


int y1=L.front().y;
if(x1==x&&y1==y){
srand(time(0));
do{
x=(rand()%25)*2;
y=rand()%20;
}while(matirx[y][x]==1);
score+=100;//分数+100
if(score%LEVEL_SCORE==0){
level+=1;
if(level>=9)
level=9;
change_level();
}
print_score();
print_level();
return true;
}
else
return false;
}
void move_down(int n=0){
int x1=L.front().x;
int y1=L.front().y;
int x2=L.back().x;
int y2=L.back().y;
L.pop_front();
int x3=L.front().x;
int y3=L.front().y;
L.push_front(Snake(y1,x1));
if(y1<y3&&x1==x3)
return;
L.pop_back();
L.push_front(Snake(y1+1,x1));
Init_matirx();
game_over();
if(eat_goal()){
L.push_back(Snake(y2,x2));
matirx[y2][x2]=1;
}
print_snake();
print_goal();
signal(SIGALRM,move_down);
}
void move_up(int n=0){
int x1=L.front().x;
int y1=L.front().y;
int x2=L.back().x;
int y2=L.back().y;
L.pop_front();
int x3=L.front().x;
int y3=L.front().y;
L.push_front(Snake(y1,x1));


if(y1>y3&&x1==x3)
return;
L.pop_back();
L.push_front(Snake(y1-1,x1));
Init_matirx();
game_over();
if(eat_goal()){
L.push_back(Snake(y2,x2));
matirx[y2][x2]=1;
}
print_snake();
print_goal();
signal(SIGALRM,move_up);
}
void move_right(int n=0){
int x1=L.front().x;
int y1=L.front().y;
int x2=L.back().x;
int y2=L.back().y;
L.pop_front();
int x3=L.front().x;
int y3=L.front().y;
L.push_front(Snake(y1,x1));
if(y1==y3&&x1<x3)
return;
L.pop_back();
L.push_front(Snake(y1,x1+2));
Init_matirx();
game_over();
if(eat_goal()){
L.push_back(Snake(y2,x2));
matirx[y2][x2]=1;
}
print_snake();
print_goal();
signal(SIGALRM,move_right);
}
void move_left(int n=0){
int x1=L.front().x;
int y1=L.front().y;
int x2=L.back().x;
int y2=L.back().y;
L.pop_front();
int x3=L.front().x;
int y3=L.front().y;
L.push_front(Snake(y1,x1));
if(y1==y3&&x1>x3)
return;
L.pop_back();
L.push_front(Snake(y1,x1-2));
Init_matirx();
game_over();
if(eat_goal()){
L.push_back(Snake(y2,x2));
matirx[y2][x2]=1;
}
print_snake();
print_goal();
signal(SIGALRM,move_left);
}
//根据输入信号控制射身运动方向
void snake_control(){


int ch, flag = 1;
struct termios save, raw;
tcgetattr(0, &save);//取终端属性
cfmakeraw(&raw);
//cfmakeraw将终端设置为原始模式,该模式下所有输入数据以字节为单位被处理
//在原始模式下,终端是不可回显的,而已所有特定的终端输入/输出
//模式不可以用
tcsetattr(0, 0, &raw);//设置终端为原始模式
if(setjmp(env)==0){
while(flag){
ch=getchar();
if(ch=='\33'){
ch=getchar();
if(ch=='['){
ch=getchar();
switch(ch){
case 'A':
move_up();break;
case 'B':
move_down();break;
case 'C':
move_right();break;
case 'D':
move_left();break;
}
}
}
if(ch=='q'||ch=='Q')


flag=0;
}
printf("\33[%d;%dH\33[31m-----game interrupt exit!- ----\33[0m",
p_y + Y + 3, p_x+15);
//显示光标
printf("\33[%d;0H\33[?25h", p_y + Y + 4);
}
tcsetattr(0, 0, &save);//恢复终端原来属性
}
//不同等级的速度
void change_level(){
switch (level) {
case 1:
setitimer(ITIMER_REAL, &level_01, NULL);
break;
case 2:
setitimer(ITIMER_REAL, &level_02, NULL);
break;
case 3:
setitimer(ITIMER_REAL, &level_03, NULL);
break;
case 4:
setitimer(ITIMER_REAL, &level_04, NULL);
break;
case 5:
setitimer(ITIMER_REAL, &level_05, NULL);
break;
case 6:
setitimer(ITIMER_REAL, &level_06, NULL);
break;
case 7:
setitimer(ITIMER_REAL, &level_07, NULL);
break;
case 8:
setitimer(ITIMER_REAL, &level_08, NULL);
break;


case 9:
setitimer(ITIMER_REAL, &level_09, NULL);
break;
default:
break;
}
}
//打印等级
void print_level(){
printf("\33[%d;%dH\33[31m%d\33[0m", p_y -2, p_x +30,score);
printf("\33[?25l");
}
//打印分数
void print_score(){
printf("\33[%d;%dH\33[31m%d\33[0m", p_y -3, p_x +30,level);
printf("\33[?25l");
}
//判断游戏是否结束
void game_over(){
int x1=L.front().x;
int y1=L.front().y;
if(y1<0||y1>=20||x1<0||x1>=50){
printf("\n\33[31m\33[%d;%dH-------game over!--------\33[0m",p_y + Y + 3, p_x+15);
printf("\33[0m\33[?25h\33[%d;0H", p_y + Y + 4);
longjmp(env,2);
}
else{
list<Snake>::iterator it=L.begin();
it++;
while(it!=L.end()){
if(it->x==x1&&it->y==y1){
printf("\n\33[31m\33[%d;%dH-------game over!--------\33[0m",p_y + Y + 3, p_x+15);
printf("\33[0m\33[?25h\33[%d;0H", p_y + Y + 4);
longjmp(env,2);
}
it++;
}
}
}
int main(){
srand(time(0));
do{
x=(rand()%25)*2;
y=rand()%20;
}while(matirx[y][x]==1);


L.push_front(Snake(0,0));
L.push_front(Snake(0,2));
print_start_interface();
print_score();
print_level();
print_snake();
print_goal();
setitimer(ITIMER_REAL, &level_01, NULL);
signal(SIGALRM,move_right);
snake_control();
return 0;
}


问题在cpp文件的第33行,求问这是怎么回事..... GCC bug 程序
[解决办法]
看看判断条件是否正确

读书人网 >C++

热点推荐