完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
原程序如下: #include #include #define uchar unsigned char #define TRUE 1 #define FALSE 0 //#define MAX_LENGTH 33 /* max length of snake nodess */ //#define GAME_SPEED 100 /* game speed */ #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 #define qian 5 #define hou 6 ***it KEY_UP=P2^3; /*定义按键*/ ***it KEY_DOWN=P2^1; ***it KEY_LEFT=P2^6; ***it KEY_RIGHT=P2^2; ***it KEY_qian=P2^4; ***it KEY_hou=P2^5; ***it START=P2^7; unsigned char zong[8]={0x1,0x2,0x4,0x8,0x10,0x20,0x40,0x80}; //点阵 P0=zong[k]就能让k位为高 unsigned char green[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; unsigned char red[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; struct Point { //点阵**1-1 uchar x,y,z; }; struct Snake { struct Point nodes[50]; uchar len; uchar dir; uchar live; } snake; struct Food { struct Point pos; //**1-1 uchar exist; } food; int lastx,lasty,lastz,keyCode,keyCode2,sp=10,l; void init(void); //初始化 void gamePlay(void); void drawWall(void); void createFood(void); void drawFood(void); void drawSnake(void); uchar touchWall(void); //碰到墙 uchar touchSelf(void); //碰到自己 void gameOver(void); //游戏结束 void moveSnake(void); //移动蛇 int oppositeDirection(int keyCode); //键盘输入方向 int foodEat(void); //吃食物 void expandSnake(void); // void select(void); uchar getKey(void); //主函数 void delay_50us(unsigned char t) //延迟函数 { unsigned char j; for(;t>0;t--) for(j=19;j>0;j--); } void delay(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--) ; } void main() { init(); l=1; while(l) { gamePlay(); } gameOver(); } //随机产生食物 void createFood() { int i; label: food.pos.x=((int)rand()%8); food.pos.y=((int)rand()%8); food.pos.z=((int)rand()%8); for(i=0;i<=snake.len-1;i++){ if(snake.nodes.x==food.pos.x&&snake.nodes.y==food.pos.y&&snake.nodes.z==food.pos.z) goto label; } } uchar getKey() //键盘输入 消抖 { if(!KEY_UP) { delay_50us(2); if(!KEY_UP) { return UP; } } if(!KEY_DOWN) { delay_50us(2); if(!KEY_DOWN) { return DOWN; } } if(!KEY_LEFT) { delay_50us(2); if(!KEY_LEFT) { return LEFT; } } if(!KEY_RIGHT) { delay_50us(2); if(!KEY_RIGHT) { return RIGHT; } } if(!KEY_qian) { delay_50us(2); if(!KEY_qian) { return qian; } } if(!KEY_hou) { delay_50us(2); if(!KEY_qian) { return qian; } } return snake.dir;//什么都没按 } //检测方向与按键输入是否冲突 int oppositeDirection(int keyCode) { if(keyCode==UP&&snake.dir==DOWN){ return 1; } else if(keyCode==DOWN&&snake.dir==UP) { return 1; } else if(keyCode==LEFT&&snake.dir==RIGHT){ return 1; } else if(keyCode==RIGHT&&snake.dir==LEFT){ return 1; } else if(keyCode==qian&&snake.dir==hou){ return 1; } else if(keyCode==hou&&snake.dir==qian) { return 1; } else return 0; } //食物是否可以吃到 int foodEat() { if(snake.nodes[0].x==food.pos.x&&snake.nodes[0].y==food.pos.y&&snake.nodes[0].z==food.pos.z) return 1; else return 0; } void moveSnake() { //移动蛇 int k; lastx=snake.nodes[snake.len-1].x; lasty=snake.nodes[snake.len-1].y; lasty=snake.nodes[snake.len-1].z; for(k=snake.len-2;k>=0;k--) { snake.nodes[k+1].x=snake.nodes[k].x; snake.nodes[k+1].y=snake.nodes[k].y; snake.nodes[k+1].y=snake.nodes[k].z; } if(snake.dir==UP) snake.nodes[0].y-=1; else if(snake.dir==DOWN) snake.nodes[0].y+=1; else if(snake.dir==LEFT) snake.nodes[0].x-=1; else if(snake.dir==RIGHT) snake.nodes[0].x+=1; else if(snake.dir==hou) snake.nodes[0].z-=1; else if(snake.dir==qian) snake.nodes[0].z+=1; else ; } uchar touchSelf() { //判定是否碰到自身 uchar i; for (i=3;i if(snake.nodes[0].x==snake.nodes.x&&snake.nodes[0].y==snake.nodes.y&&snake.nodes[0].y==snake.nodes.z) return TRUE; } return FALSE; } uchar touchWall() { //判断是否碰到墙 uchar x1=snake.nodes[0].x; uchar y1=snake.nodes[0].y; uchar z1=snake.nodes[0].z; if(x1<0||x1>7||y1<0||y1>7||z1<0||z1>7) return TRUE; else return FALSE; } void gamePlay() { int d; uchar keyCode; while(START); //等待按开始键 while(TRUE) { if (touchWall() || touchSelf()) { gameOver(); //跳到游戏结束子函数 return; } if (!food.exist) createFood(); food.exist=1; for(d=0;d<(sp*36);d++) { drawFood(); drawSnake(); } keyCode = getKey(); lastx=snake.nodes[snake.len-1].x; lasty=snake.nodes[snake.len-1].y; lastz=snake.nodes[snake.len-1].z; if (!oppositeDirection(keyCode)) { snake.dir = keyCode; } moveSnake(); if (foodEat()) { food.exist = FALSE; expandSnake(); } } } void init() { //初始化 snake.nodes[0].x=1; snake.nodes[0].y=1; snake.nodes[0].z=1; snake.nodes[1].x=1; snake.nodes[1].y=2; snake.nodes[1].z=1; snake.len=2; snake.live=1; snake.dir=UP; food.exist=0; srand(5); /*sui ji shu fa sheng qi随机数发生器*/ } void drawFood() { //??? P0=zong[food.pos.x]; P1=green[food.pos.y]; P3=green[food.pos.z]; delay(2); P0=0; P1=0xff; } void gameOver() { //??? while(1) { P3=0xff; P0=0xff; P1=0x0; } } void expandSnake() { //???增长蛇 if(keyCode==UP){ lastx-=1; } else if(keyCode==DOWN) { lastx+=1; } else if(keyCode==LEFT){ lasty-=1; } else if(keyCode==RIGHT){ lasty+=1; } else if(keyCode==qian){ lastz-=1; } else if(keyCode==hou){ lastz+=1; } else {} snake.nodes[snake.len].x=lastx; snake.nodes[snake.len].y=lasty; snake.len++; } 编译错误如下: |
|
相关推荐
3个回答
|
|
配置选择大容量模式
|
|
|
|
本帖最后由 bj2008wyou 于 2014-4-9 16:57 编辑
你知不知道51可用的RAM是很有限的,你倒好,定义了这么个变量 struct Snake { struct Point nodes[50]; uchar len; uchar dir; uchar live; } snake; 单单是snake变量,就占用了应该是至少50 *4 + 1 + 1 + 1 = 203字,想知道确切结果,就sizeof(变量)看看。然后你还有其他变量的定义,你想想占用了多少字节,回去翻下51书本,看看51可用的RAM有多大,你都超出了,编译当然报错了…… |
|
|
|
bj2008wyou 发表于 2014-4-9 16:55 非常感谢 我知道了 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11990 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 15:17 , Processed in 0.461022 second(s), Total 42, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号