C++编的贪食蛇游戏 #include<iostream.h>><windows.h><conio.h>

<time.h>
void show( );int changeModel( );

char tcsQipan[22][22]; int tcsZuobiao[2][20]; //蛇的坐标数组
int head,tail;
int direction=77; //方向

void main()
{
int i,j;
for(i=1;i<=20;i++)
for(j=1;j<=20;j++)
tcsQipan[i][j]=' ';
//初始化贪吃蛇棋盘上下墙壁
for(i=0;i<=21;i++) { tcsQipan[0][i]='-'; tcsQipan[21][i]='-';}
//初始化贪吃蛇棋盘左右墙壁
for(i=1;i<=20;i++) { tcsQipan[i][0]='|'; tcsQipan[i][21]='|';}
head=3;tail=0;
tcsZuobiao[0][head]=1;
tcsZuobiao[1][head]=4;
tcsZuobiao[0][tail]=1;
tcsZuobiao[1][tail]=1;

for(j=1;j<3;j++)
{
tcsZuobiao[0][j]=1;
}
for(j=1;j<3;j++)
{
tcsZuobiao[1][j]=j+1;
}

for(i=1;i<=3;i++)
tcsQipan[1][i]='*'; //蛇身
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#'; //蛇头

system("cls"); //清屏
show( );
long start;
int gamespeed=500;
int timeover;
timeover=1;
int DIRECTION=0;

while(1)
{
start = clock( );
while(!kbhit( ) && (timeover=clock()-start<=gamespeed)) ;
if(timeover) // 500毫秒内按下键的情形
{
DIRECTION=direction;
getch( ); //按一次键,可以连取两个
direction=getch();
}
else direction= direction;
if( DIRECTION==72 && direction==80)
direction=72;
else if(DIRECTION==80 && direction==72 )
direction=80;
else if(DIRECTION==75 && direction==77)
direction=75;
else if(DIRECTION==77 && direction==75)
direction=77;
if( changeModel( )==1 )
{
system("cls");
show( );
}
else
{
system("cls");
show( );
cout<<"Game Over!"<<endl;
break;
} } }

void show( )
{
for(int i=0;i<=21;i++)
{
for(int j=0;j<=21;j++)
cout<<tcsQipan[i][j];
cout<<endl;
}
}
int changeModel( )
{
int x=0,y=0;
if(direction==72)
{
x= tcsZuobiao[0][head]-1;
y= tcsZuobiao[1][head];
}
else if(direction==80)
{
x= tcsZuobiao[0][head]+1;
y= tcsZuobiao[1][head];
}
else if(direction==75)
{
x= tcsZuobiao[0][head];
y= tcsZuobiao[1][head]-1;
}
else if(direction==77)
{
x=tcsZuobiao[0][head];
y= tcsZuobiao[1][head]+1;
}
if(x==0 || x==21 ||y==0 || y==21)
{
tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' '; //原为蛇尾的"*"
tail=(tail+1)%20;
tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*'; //原为蛇头的"#"
head=(head+1)%20;
tcsZuobiao[0][head]=x;
tcsZuobiao[1][head]=y;
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
return 0 ;
}
if(tcsQipan[x][y]!=' ') /*若棋盘中不为空格,则为蛇自身*/
{
return 0 ;
}

tcsQipan [tcsZuobiao[0][tail]][tcsZuobiao[1][tail]]=' '; //原为蛇尾的"*"
tail=(tail+1)%20;
tcsQipan [tcsZuobiao[0][head]][tcsZuobiao[1][head]]='*'; //原为蛇头的"#"
head=(head+1)%20;
tcsZuobiao[0][head]=x;
tcsZuobiao[1][head]=y;
tcsQipan[tcsZuobiao[0][head]][tcsZuobiao[1][head]]='#';
return 1;
}
为什么有时蛇会突然加速不受控制?
程序不复杂的,在线等,谢谢。。。。

问题出在这句代码:
while(!kbhit()&&(timeover=clock()-start<=gamespeed));//记作“循环1”

首先要明确&&的运算法则,当它左边的表达式值为0时,就不会再计算右边的表达式而直接返回0。这是系统为了提高效率而规定的。

其次,kbhit()是非阻塞函数,也就是说只要按的键还没有被读取,该函数就会返回1。

基于以上两点,在下面叙述的这一种情况下,就会出现速度不受控制的现象。

当循环1中clock()-start<=gamespeed刚好不成立之时,即上一次循环还成立,这一次循环就超出了,方向键又恰好在此时按下,那么timeover的值为0,于是后面的两个getch();均不会执行。
那么在进入外层while的下一次循环时,由于循环1中kbhit()写在&&之前,根据kbhit()的非阻塞性,之前未被getch()读取的方向键此时就会使得kbhit()返回1
那么!kbhit()==0;&&后面的timeover=clock()-start<=gamespeed将不被执行,timeover的值依然是0,循环一次即结束,速度就是由此而加快的,接下来由于timeover还是等于0,之前的方向键依然没被读取,如此往复循环,速度就一直很快了。

修改的方法也很简单,把循环1中&&前后的表达式交换一下位置,就可以避免上述问题。也就是:
while((timeover=clock()-start<=gamespeed)&&(!kbhit()));
别的不用改,我运行就没有问题了。试试吧!
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-07-19
那是其中一段错拉。
第2个回答  2010-07-20
废话,,,
第3个回答  2010-07-20
你运行没有问题?这段代码复制下来自己改了半天还叫错,你得改多长时间才能运行?还没问题。。。。

...#include<iostream.h>><windows.h><conio.h>
while(!kbhit()&&(timeover=clock()-start<=gamespeed));\/\/记作“循环1”首先要明确&&的运算法则,当它左边的表达式值为0时,就不会再计算右边的表达式而直接返回0。这是系统为了提高效率而规定的。其次,kbhit()是非阻塞函数,也就是说只要按的键还没有被读取,该函数就会返回1。基于以上两点,...

c++编程小游戏代码
以下是贪吃蛇源代码: #include<iostream.h>#include<windows.h>#include<time.h>#include<stdlib.h>#include<conio.h>#define N 21void gotoxy(int x,int y)\/\/位置函数{COORD pos;pos.X=2*x;pos.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}void color(int a)\/\/...

求一个能在vs上运行的C++编写的贪食蛇游戏
include<iostream> include<windows.h> include<time.h> include<conio.h> using namespace std;\/\/ 刷新当前屏幕 inline void Refresh(char q[][22], int grade, int gamespeed){ system("cls"); \/\/ 清屏 int i,j;cout << endl;for(i=0;i<22;i++){ cout << "\\t";for(j=0...

求c++贪吃蛇的代码
贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++6.0 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015.3.16*\/#define DEBUG 0 \/\/当程序在调试阶段时 DEBUG为 1#include<iostream>#include<windows.h>#include<time.h>#include<conio.h>using...

c++ 中像素编写飞机类游戏如何编写暂停函数
使用C++编写游戏:这个在百度上看到的一个贪吃蛇游戏 include<iostream.h> include<windows.h> include<time.h> include<stdlib.h> include<conio.h> define N 21 void gotoxy(int x,int y)\/\/位置函数 { COORD pos;pos.X=2*x;pos.Y=y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE)...

求在VC++6.0中运行的贪吃蛇代码
贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++6.0 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015.3.16*\/#define DEBUG 0 \/\/当程序在调试阶段时 DEBUG为 1#include<iostream>#include<windows.h>#include<time.h>#include<conio.h>using...

C语言的贪吃蛇源代码
贪吃蛇游戏,由于是C++源码 且 用到Windows API ,是控制台界面不是图形界面,需要用VC++6.0 或 VC++2010 在windows环境编译运行。如果符合上述条件一定可以编译运行zjlj,2015.3.16*\/#define DEBUG 0 \/\/当程序在调试阶段时 DEBUG为 1#include<iostream>#include<windows.h>#include<time.h>#include<conio.h>using...

求经典小游戏(五子棋 贪吃蛇 俄罗斯方块等)c++ 源代码。最好能有软 ...
这有一个最简单的贪吃蛇的控制过程。一般对于此类的游戏,都分为控制算法,显示算法,判定算法等几个大部分。供参考:include <stdio.h> include <windows.h> include <stdlib.h> include <string.h> include <conio.h> include <time.h> \/\/使用当前时间做种子;enum dir{up,down,left,right};...

c语言贪吃蛇代码
include <conio.h> include <windows.h> define BEG_X2 define BEG_Y1 define WID20 define HEI20 HANDLE hout;typedef enum {UP, DOWN, LEFT, RIGHT} DIR;typedef struct Snake_body { COORD pos;\/\/蛇身的位置 struct Snake_body *next;\/\/下一个蛇身 struct Snake_body *prev;\/\/前一个...

dev-c++小游戏代码,急急急急!!!
dev-c++小游戏代码,急急急急!!!#include<iostream>#include<windows.h>#include<conio.h>#include<time.h>#include<string>using namespace std;/*=== all t

相似回答