本帖最后由 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; //移动
}
}
} |