打印

参考了别人的8X8点阵贪吃蛇程序有问题请教

[复制链接]
3053|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gongmin611|  楼主 | 2009-8-14 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gongmin611 于 2009-8-14 16:02 编辑

我是一个单片机初学者,我在网上找到一个关于8x8点阵的c源的贪吃蛇程序,看了一天不大懂,那是用Proteus(最好7.4以上的版本) 仿真的,附上图和源程序,请哪位好心人帮我看看
我想问一下 x[],y[],在这个8X8点阵里是什么意思 有点看不大明白,还有这两条语句是什么意思:   
for(i=n-1;i>1;i--)
   {   x=x[i-1];
    y=y[i-1];
   }      

      x[1]=x[2]+addx;  
   y[1]=y[2]+addy;                    //移动
  
谢谢,还有 ,貌似这个程序不能随机的果子,请问各位大大,怎么产生随机数啊?
=================================================


=
C源程序:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define SNAKE 20                 //最大长度
#define TIME 50                 //显示延时时间
#define SPEED 71               //速度控制
sbit down=P3^1;
sbit right=P3^2;
sbit up=P3^3;
sbit left=P3^4;
sbit keyenable=P3^6;
uchar x[SNAKE+1];
uchar y[SNAKE+1];
     
char addx,addy;
uchar time,n,i,e;

//=====================================
//延时子程序
//=====================================
void delay(char MS)
{
char us,usn;
while(MS!=0)
{
  usn=0;
/* while(usn!=0)
  {
   us=0xff;
   while(us!=0)
    us--;               
    usn--;
  }*/
  MS--;
}
}
//=====================================
//碰壁子程序
//=====================================
bit knock()
{
bit k;
k=0;
if(x[1]>7||y[1]>7)
  k=1;       //这是撞墙
for(i=2;i<n;i++)
  if((x[1]==x)&(y[1]==y))
  k=1;
    return k;
}
//=====================================
//按键扫描子程序
//=====================================
void keyscan()
{
if(keyenable)
//向下键
{
if(down)
   {addy=0;
    if(addx!=1)
      addx=-1;
  else addx=1;
   }
//向上键     
if(up)
   {addy=0;
    if(addx!=-1)
      addx=1;
  else addx=-1;
   }
//向右键     
if(right)
   {addx=0;
    if(addy!=-1)
      addy=1;
  else addy=-1;
   }
//向左键     
if(left)
   {addx=0;
    if(addy!=1)
      addy=-1;
  else addy=1;
   }
  }
}
//=====================================
//乘方子程序
//=====================================
uchar 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 timer0(uchar k)
{
while(k--)
  {
    for(i=0;i<SNAKE+1;i++)
     {
      P2=mux(x);
   P1=255-mux(y);
   keyscan();
   delay(TIME);
   P2=0x00;
   P1=0xff;
     }  
   }
}
//=====================================
//主程序
//=====================================
void main(void)
{
e=SPEED;
P0=0x00;
P1=0xff;
P2=0x00;
P3=0x00;
while(1)
{
//初始化 ===========================
  for(i=3;i<SNAKE+1;i++)
   x=100;
  for(i=3;i<SNAKE+1;i++)
   y=100;
//果子==============================
  x[0]=4;y[0]=4;
//蛇长==============================
  n=3;
  x[1]=1;y[1]=0;   // 蛇头
  x[2]=0;y[2]=0;   // 蛇尾
  
  addx=0;addy=0;   //偏移量
  while(1)
  { if(keyenable)
    break;  //跳出循环
    timer0(1);
  
  }
  while(1)
  {
   timer0(e);
   if(knock())
    {e=SPEED;
     break;}
     
   if((x[0]==x[1]+addx)&(y[0]==y[1]+addy))
    {
     n++;                  
     if(n==SNAKE+1)
      {
       n=3;
       e=e-10;
       for(i=3;i<SNAKE+1;i++)
        x=100;
       for(i=3;i<SNAKE+1;i++)
        y=100;
      
      }
      x[0]=x[n-2];
      y[0]=y[n-2];
   
    }  
  
     for(i=n-1;i>1;i--)
   {   x=x[i-1];
    y=y[i-1];
   }      

      x[1]=x[2]+addx;  
   y[1]=y[2]+addy;                    //移动
  
  
  }
  
   
}

}

8X8点阵 贪吃蛇.rar

44.89 KB

相关帖子

沙发
aijuhua| | 2013-5-7 19:30 | 只看该作者
能不能把这个的原理图及源程序发到1184159921@qq.com 啊 谢谢了啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝