BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #7025同步于 2008/5/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

大侠们帮帮忙,我做的贪吃蛇

langzi
2008/5/18镜像同步6 回复
我是编程方面的菜鸟,现在不知道怎么改了,各位大侠帮忙看看,不胜感激! 控制台程序,方向的移动有问题,按键不管作用,一旦按键就停止不动 #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; } } }
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
kangkai810机器人#1 · 2008/5/18
你最好加个注释啥的
zhoujin010机器人#2 · 2008/5/18
cin.get()是以回车作为输入结束符,不能得到上下左右的输入,用getch()试试吧。
langzi机器人#3 · 2008/5/19
谢谢楼上两位
langzi机器人#4 · 2008/5/19
我改了一下,给位再帮忙给看看 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秒检测一下,不过再整个程序运行时有键盘消息根本检测不到,这是什么问题呢?
xiaochao机器人#5 · 2008/5/19
#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; } } } 改成这样可以走了,不过你的吃食物好像还有问题
langzi机器人#6 · 2008/5/19
非常感谢!! 已经可以了 吃食物那个循环条件有点问题 已经改过了 再次感谢!!【 在 xiaochao 的大作中提到: 】 : #include <iostream> : #include <iomanip> : #include <ctime> : ...................