返回信息流我是编程方面的菜鸟,现在不知道怎么改了,各位大侠帮忙看看,不胜感激!
控制台程序,方向的移动有问题,按键不管作用,一旦按键就停止不动
#include <iostream>
#include <iomanip>
#include <ctime>
#include <conio.h> //just for _kbhit()
using namespace std;
struct position
{
int x;
int y;
}fd,sk[200];
int direct;
int len;
//int mark;
char screen[23][80];//存储整个屏幕,23行80列
void food();
void draw();
void xytoscreen();
void eat();
void movesnake();
void die();
void main()
{
direct=0;
len=3;
sk[0].x=2;
sk[1].x=1;
sk[2].x=0;
sk[0].y=sk[1].y=sk[2].y=0;
food();
xytoscreen();
//draw();
loop:movesnake();
eat();
xytoscreen();
draw();
for(int n=0;n<50;n++)
{
if (_kbhit())
{
if (cin.get()==0x26)//up
{
direct=1;
break;
}
if (cin.get()==0x28)//down
{
direct=2;
break;
}
if (cin.get()==0x25)//left
{
direct=3;
break;
}
if (cin.get()==0x27)//right
{
direct=4;
break;
}
}
_sleep(10);
}
system("cls");
goto loop;
}
void food()//随机出现的食物坐标
{
int x,y;
srand((unsigned)time(NULL));
x=rand()%78;
y=rand()%22;
fd.x=x;
fd.y=y;
}
void draw()//一行一行的画出整个屏幕
{
for(int j=0;j<23;j++)
cout<<screen[j]<<endl;
}
void xytoscreen()//将出项的食物以及蛇的坐标存储到screen数组中
{
for(int i=0;i<23;i++)
{
for(int j=0;j<79;j++)
screen[i][j]=' ';
}
for(int k=0;k<23;k++)
screen[k][79]='\0';
for(int m=0;m<len;m++)
{
screen[sk[m].y][sk[m].x]='*';
}
screen[fd.y][fd.x]='#';
}
void eat()//蛇吃食物
{
if(sk[0].x==fd.x && sk[0].y==fd.y)
{
//system("cls");
food();
len=len+1;
//mark=1;
}
}
void movesnake()//蛇的移动
{
switch(direct)
{
case 0:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x+1;
sk[0].y=sk[0].y;
die();
break;
}
case 1:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x;
sk[0].y=sk[0].y-1;
die();
break;
}
case 2:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x;
sk[0].y=sk[0].y+1;
die();
break;
}
case 3:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x-1;
sk[0].y=sk[0].y;
die();
break;
}
case 4:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x+1;
sk[0].y=sk[0].y;
die();
break;
}
default:
break;
}
}
void die()
{
if((sk[0].x<0||sk[0].x>=79)||(sk[0].y<0||sk[0].y>=23))
{
_sleep(9999999);
cout<<"Game Over!"<<endl;
}
for(int i=0;i<len-1;i++)
{
if(sk[0].x==sk[i+1].x&&sk[0].y==sk[i+1].y)
{
_sleep(9999999);
cout<<"Game Over!"<<endl;
}
}
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #7025同步于 2008/5/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
大侠们帮帮忙,我做的贪吃蛇
langzi
2008/5/18镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
我改了一下,给位再帮忙给看看
for(int n=0;n<50;n++)
{
if (_kbhit())
{
int k;
k=_getch();
if (k==0x26)//up
{
direct=1;
break;
}
if (k==0x28)//down
{
direct=2;
break;
}
if (k==0x25)//left
{
direct=3;
break;
}
if (k==0x27)//right
{
direct=4;
break;
}
}
_sleep(10);
}
蛇每隔0.5秒动一下,期间要检测是否有键盘消息来改变蛇的方向,我用for循环,每隔0.01秒检测一下,不过再整个程序运行时有键盘消息根本检测不到,这是什么问题呢?
#include <iostream>
#include <iomanip>
#include <ctime>
#include <conio.h> //just for _kbhit()
using namespace std;
struct position
{
int x;
int y;
}fd,sk[200];
int direct;
int len;
//int mark;
char screen[23][80];//存储整个屏幕,23行80列
void food();
void draw();
void xytoscreen();
void eat();
void movesnake();
void die();
void main()
{
direct=0;
len=3;
sk[0].x=2;
sk[1].x=1;
sk[2].x=0;
sk[0].y=sk[1].y=sk[2].y=0;
food();
xytoscreen();
//draw();
loop:movesnake();
eat();
xytoscreen();
draw();
if (_kbhit())
{
char x = getch();
if (x < 0)
{
x = getch();
if (x==72)//up
{
direct=1;
}
if (x==80)//down
{
direct=2;
}
if (x==75)//left
{
direct=3;
}
if (x==77)//right
{
direct=4;
}
}
}
_sleep(100);
system("cls");
goto loop;
}
void food()//随机出现的食物坐标
{
int x,y;
srand((unsigned)time(NULL));
x=rand()%78;
y=rand()%22;
fd.x=x;
fd.y=y;
}
void draw()//一行一行的画出整个屏幕
{
for(int j=0;j<23;j++)
cout<<screen[j]<<endl;
}
void xytoscreen()//将出项的食物以及蛇的坐标存储到screen数组中
{
for(int i=0;i<23;i++)
{
for(int j=0;j<79;j++)
screen[i][j]=' ';
}
for(int k=0;k<23;k++)
screen[k][79]='\0';
for(int m=0;m<len;m++)
{
screen[sk[m].y][sk[m].x]='*';
}
screen[fd.y][fd.x]='#';
}
void eat()//蛇吃食物
{
if(sk[0].x==fd.x && sk[0].y==fd.y)
{
//system("cls");
food();
len=len+1;
//mark=1;
}
}
void movesnake()//蛇的移动
{
switch(direct)
{
case 0:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x+1;
sk[0].y=sk[0].y;
die();
break;
}
case 1:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x;
sk[0].y=sk[0].y-1;
die();
break;
}
case 2:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x;
sk[0].y=sk[0].y+1;
die();
break;
}
case 3:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x-1;
sk[0].y=sk[0].y;
die();
break;
}
case 4:
{
for(int i=0;i<len-1;i++)
{
sk[i+1].x=sk[i].x;
sk[i+1].y=sk[i].y;
}
sk[0].x=sk[0].x+1;
sk[0].y=sk[0].y;
die();
break;
}
default:
break;
}
}
void die()
{
if((sk[0].x<0||sk[0].x>=79)||(sk[0].y<0||sk[0].y>=23))
{
_sleep(9999999);
cout<<"Game Over!"<<endl;
}
for(int i=0;i<len-1;i++)
{
if(sk[0].x==sk[i+1].x&&sk[0].y==sk[i+1].y)
{
_sleep(9999999);
cout<<"Game Over!"<<endl;
}
}
}
改成这样可以走了,不过你的吃食物好像还有问题
非常感谢!!
已经可以了 吃食物那个循环条件有点问题 已经改过了
再次感谢!!【 在 xiaochao 的大作中提到: 】
: #include <iostream>
: #include <iomanip>
: #include <ctime>
: ...................