专栏中心

EEPW首页 > 专栏 > 基于AT89S52的贪吃蛇游戏程序

基于AT89S52的贪吃蛇游戏程序

发布人:0750long 时间:2009-07-08 来源:工程师 发布文章
基于AT89S52的贪吃蛇游戏程序

 

这是我经过测试通过的程序

#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define N 45
uchar count="0",time=0,ct=0,flag=0,speed=100,gg=0;
sbit up="P2"^0;       //down
sbit down="P3"^6;
sbit right="P2"^1;
sbit left="P3"^7;
sbit chose="P3"^4;
sbit st="P3"^3;
sbit P32=P3^2;
uchar start="0";  
uchar code xx[10]={11,13,9,7,6,15,2,1,7,9};
uchar code yy[10]={10,2,8,13,7,5,2,7,6,14};
uchar code x0[]={1,1,1,1,1,2,2,3,3,4,4,5,5,5,5,5};  //16
uchar code y0[]={5,6,7,8,9,4,10,4,10,4,10,5,6,7,8,9};
uchar code x1[]={2,2,3,3,3,3,3,3,3,4};  //10
uchar code y1[]={4,9,4,5,6,7,8,9,10,4};
uchar code x2[]={2,2,2,3,3,3,4,5,4,4,5,5,5};//13
uchar code y2[]={4,5,9,4,6,10,4,8,7,10,4,9,10};
uchar code x3[]={2,2,2,3,3,3,4,4,4,5,5,5,5};  //13
uchar code y3[]={4,7,10,4,7,10,4,7,10,5,6,8,9};
uchar code x4[]={1,1,2,2,3,3,4,4,4,4,4,5,4};//13a
uchar code y4[]= {6,7,6,8,6,9,4,5,6,7,10,6,8};
uchar code x5[]={2,2,2,2,2,3,3,4,4,4,5,5,3}; //13
uchar code y5[]={4,7,8,9,10,7,9,4,7,9,5,6,4};
uchar code x6[]={2,2,2,2,2,2,3,3,4,4,4,5,5,3,5};//15
uchar code y6[]={7,8,5,6,9,5,4,7,4,7,10,5,6,10,10};
uchar code x7[]={2,4,4,4,4,3,5,4,5};//9 
uchar code y7[]={9,4,5,6,7,9,8,9,9}; 
uchar code x8[]={1,1,2,1,2,2,3,3,3,4,5,4,4,5,5,1,5};//17
uchar code y8[]={5,9,4,6,7,10,4,7,10,4,6,7,10,5,9,8,8};
uchar code x9[]={1,1,2,2,3,3,4,4,4,5,5,5,5,5,3,2}; //17
uchar code y9[]={8,9,7,10,7,10,7,10,4,7,9,5,6,8,4,4};
uchar code xy[]={16,10,13,13,13,13,15,9,17,17};
uchar remx;
uchar remy;
struct Snake
{
   uchar  x[N];
   uchar y[N];
   uchar node;/*蛇的节数*/
   uchar direction;/*蛇移动方向*/
   uchar life;/* 蛇的生命,0活着,1死亡*/
}snake;
struct Food
{
   uchar x;/*食物的横坐标*/
   uchar y;/*食物的纵坐标*/
   uchar yes;/*判断是否要出现食物的变量*/
}food;/*食物的结构体*/
void Init(void)
{
 P32=1;
 EA=1;//开总中断
 ET0=1;//开定时器0中断
 IT0=1;//开定时器1中断
 EX0=1;//外部中断1中断允许
 TMOD=0x11;//设置定时器0为工作方式1
 TH0=0xec;
 TL0=0x78;
 P2=0x03;
 right=1;
 left=1;
 TR0=1;//定时器0 开始运行
 //TCON|=0x01;//外部中断0下降沿出发
 food.x=11;
 food.y=7;
 food.yes=0;
 snake.x[0]=11;
 snake.y[0]=5;
 snake.x[1]=11;
 snake.y[1]=4;
 snake.node=2;
 snake.direction=4;
 snake.life=0; 
}
void delay(unsigned char t)
{
    while(--t);
}
int mux(uchar temp)
{
 if(temp==7)return 128;
 if(temp==6)return 64;
 if(temp==5)return 32;
 if(temp==4)return 16;
 if(temp==3)return 8;
 if(temp==2)return 4;
 if(temp==1)return 2;
 if(temp==0)return 1;
 return 0;
}
void autorun(void)//贪吃蛇的日常运转
{
 uint i;
 remx=snake.x[snake.node-1];
 remy=snake.y[snake.node-1];
 for(i=snake.node-1;i>0;i--)/*移动算法*/
  {
     snake.x[i]=snake.x[i-1];
     snake.y[i]=snake.y[i-1];
  }
  switch(snake.direction)//蛇头前进
  {
    case 1:snake.x[0]+=1;break;
       case 2:snake.x[0]-=1;break;
       case 3:snake.y[0]-=1;break;
       case 4:snake.y[0]+=1;break;
  }
  for(i=3;i<snake.node;i++)//检测是否追尾
  {
    if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
    {
     snake.life=1;
    break;
    }
  }     
  if(snake.x[0]<0||snake.x[0]>15||snake.y[0]<0||snake.y[0]>15)//检测是否撞墙
  {
   snake.life=1;
  }
  //if(snake.life==1)//检测蛇是死是活
  // break;
  if(snake.x[0]==food.x&&snake.y[0]==food.y)//是否吃到食物
  {
   snake.node+=1;
   snake.x[snake.node-1]=remx;
   snake.y[snake.node-1]=remy;
   food.yes=1;
  }
  while(food.yes==1)//食物没有了,重新创建一个食物
  {
   //randomize();
   //food.x=rand()%16+1;
   //food.y=rand()%16+1;
   food.x=xx[ct];
   food.y=yy[ct];
   ct++;
   if(ct==9)
   {
   ct=0;
   }
   food.yes=0;
   for(i=0;i<snake.node;i++)
   {
    if(food.x==snake.x[i]&&food.y==snake.y[i])
    {
     food.yes=1;
    }
   }
   
  }
}
void turnkey()// 键盘扫描
{
  if(!left)
  {
   delay(10);
    if(!left)
    {
     snake.direction=2;
    }
  }
  if(!right)
  {
   delay(10);
   if(!right)
   {
    snake.direction=1;
   }
  }
  if(!up)
  {
   delay(10);
   if(!up)
   {
    snake.direction=3;
   }
  }
  if(!down)
  {
   delay(10);
   if(!down)
   { 
     snake.direction=4;
   }
  }


}
void show(uchar x,uchar y) //显示一个点
{
 int i;
 P0=0xff;
 P1=0xff;
 P2=4*y;
 if(x<8)
 {
 i=mux(x);
 P0=~i;
 }
 else
 {
 i=mux(x-8);
 P1=~i;
 }
 P2|=0x03;
 
}
void display()//显示函数
{ uint i;
 show(food.x,food.y);
 for(i=0;i<snake.node;i++)
 {
  show(snake.x[i],snake.y[i]);
 }
 
 
}
void scoredisplay(uchar s)
{
   uchar x,y,z;
   uint i;
   x="s/100";
  y="s"%100/10;
  z="s"%10;
  for(i=0;i<xy[x];i++)
 {
   switch(x)
   {
   case 0:show(x0[i],y0[i]);break;
   case 1:show(x1[i],y1[i]);break;
   case 2:show(x2[i],y2[i]);break;
   case 3:show(x3[i],y3[i]);break;
   case 4:show(x4[i],y4[i]);break;
   case 5:show(x5[i],y5[i]);break;
   case 6:show(x6[i],y6[i]);break;
   case 7:show(x7[i],y7[i]);break;
   case 8:show(x8[i],y8[i]);break;
   case 9:show(x9[i],y9[i]);break;
   }
  
 }
 for(i=0;i<xy[y];i++)
 {
   switch(y)
   {
   case 0:show(x0[i]+5,y0[i]);break;
   case 1:show(x1[i]+5,y1[i]);break;
   case 2:show(x2[i]+5,y2[i]);break;
   case 3:show(x3[i]+5,y3[i]);break;
   case 4:show(x4[i]+5,y4[i]);break;
   case 5:show(x5[i]+5,y5[i]);break;
   case 6:show(x6[i]+5,y6[i]);break;
   case 7:show(x7[i]+5,y7[i]);break;
   case 8:show(x8[i]+5,y8[i]);break;
   case 9:show(x9[i]+5,y9[i]);break;
   }
  
 }
 for(i=0;i<xy[z];i++)
 {
   switch(z)
   {
   case 0:show(x0[i]+10,y0[i]);break;
   case 1:show(x1[i]+10,y1[i]);break;
   case 2:show(x2[i]+10,y2[i]);break;
   case 3:show(x3[i]+10,y3[i]);break;
   case 4:show(x4[i]+10,y4[i]);break;
   case 5:show(x5[i]+10,y5[i]);break;
   case 6:show(x6[i]+10,y6[i]);break;
   case 7:show(x7[i]+10,y7[i]);break;
   case 8:show(x8[i]+10,y8[i]);break;
   case 9:show(x9[i]+10,y9[i]);break;
   }
  
 }

}
void main()
{
 uchar i;
 Init();
 while(1)
 { 
  if(start==1) 
  { 
   if(snake.life==0)
   {
   if(time==1)
   {
     autorun();
    time=0;
   }
   else
   {
    for(i=0;i<20;i++)
    {
    display();
    }
   
     turnkey();
 
   }
   }
   else
    scoredisplay(snake.node);
  }
  else if(start==2)
  {
   scoredisplay(snake.node); 
  }
 }


 
}
void time0() interrupt 1
{
 TH0=0xec;
 TL0=0x78;
 count++;
 if(count==100)
 {
  time=1;
   
 } 
}
void int0() interrupt 0
{
 EA=0;
 start=1;
 while(1)
 {
  if(!chose)
  {
   if(!chose)
   {
    flag++;
   }
  }
  switch(flag%3)
  {}
  gg=flag%3;
  scoredisplay(gg);
  if(!st)
  {
   if(!st)
   {
   // goto:end1;
   }
  }
 }
 //end1:EA=1;

}   

专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词:

相关推荐

运动控制系列芯片HCTL-1100的原理及应用

JFS宣布氮化镓动力模块取得新突破,准备进行试点规模验证

据报道,苹果计划在2026年推出AI眼镜——包括摄像头、Siri升级等

消费电子 2025-12-15

据报道,中国在50%规则下推动国内芯片工具的采用,给韩国供应商施加压力

瞬态电子:会退化和消失的器件

在5V系统中使用SoC C8051Fxxx

瑞萨杯2011全国大学生电子设计竞赛现场报道

Melexis将微功率技术引入线性霍尔器件,拓展游戏、物联网及工业领域

飞思卡尔董事长兼首席执行官Rich Beyer在开幕式的主题演讲

视频 2011-09-02

恩智浦将关闭ECHO Fab晶圆厂,退出氮化镓5G PA芯片制造

莱迪思MachXO4:为持久耐用而设计,为创新突破而打造

嵌入式系统 2025-12-12

在AVR Studio里使用AVR-GCC

Virtex-7 485T功耗演示

视频 2011-09-21

由P87LPC764单片机组成的最小仪表系统(液晶显示)

瑞萨杯全国大学生电子设计竞赛开赛

由ADuC812与K9S6408V0A构成的便携式数据采集系统

飞思卡尔半导体销售和市场副总裁兼亚太区总经理汪凯在FTF2011中国站开幕式的主题演讲

视频 2011-09-02

美国代工厂首个真正制造的3D芯片,采用碳纳米管晶体管和内存集成于单芯片上——未来器件的能量延迟产物性能有望提升多达1000倍

中国苹果供应商镜头科技转向人工智能,收购NVIDIA认证的服务器机架制造商

消费电子 2025-12-15

5D玻璃存储“记忆晶体”承诺可提供长达138亿年的数据存储韧性,这大致相当于宇宙的年龄——将360TB的数据压缩到5英寸玻璃光盘中,配备飞秒激光

更多 培训课堂
更多 焦点
更多 视频

技术专区