/*使用的说明
独立按键 k1,k2选择难度(改变循环次数来实现,因此数值越小移动越快)选完难度k3确定
按完k3矩阵的蛇才会出来,出来后蛇是暂停状态按任意方向键即可开始
当游戏结束重新开始的时候需要重新选难度在点开始有点麻烦,因此死后可以按k4直接重新开始次难度的游戏
矩阵的按键 中间的s11可以暂停游戏按任意方向键继续游戏
s7
s10 s11 s12
s15
数码管的第一个是难度,第八个是分数,
由于51单片机结构的限制设置成了结束才显示分数,也可能是我的代码才菜了。。
*/
#include "REG52.H"
typedef unsigned char uchar;
typedef unsigned int uint ;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit SER=P3^4;
sbit rCLK=P3^5;
sbit SRCLK=P3^6;
sbit K1=P3^1;
sbit K2=P3^0;
sbit K3=P3^2;
sbit K4=P3^3;
//我也不知道怎么解释,就是为了显示单个LED亮的数组。
uchar LED_x[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar LED_y[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
/*这里采用的是数组里面的内容存储坐标。
还有一个思路是用数组存储的内容代表坐标的内容。*/
uchar flag_x[32]={2,1,0};
uchar flag_y[32]={0};
//这个表示的是食物的坐标
uchar food_x=2;
uchar food_y=0;
//Long表示蛇的长度
uchar Long=3;
//move表示往哪个方向移动
uchar move=0;
//这个是调节速度用的可以根据按键修改flag_speed的值,改变循环的时间达到改变速度的目的
uchar flag_speed=40;
//为了方便大家查看每个函数是干嘛的我都在这里写了一下声明
void delay_10us(uint x);//10um延时函数
uchar key_move(uchar move);//检测是否有按键按下
void hc_595(uchar sum);//HC595芯片不用多解释了
void move_U();//蛇向上移(仅数据改变,led此时还没更新。)
void move_D();//蛇向下移
void move_L();//蛇向左移
void move_R();//蛇向右移
void LED_show();//LED显示函数
uchar validity();//检测是否结束游戏
void food();//生成食物
void key_speed();//调节速度
void display(uchar a);//LED显示
void main(){
uchar i=0;
uchar j=1;
uchar k=0;
// TMOD = 0x11;
// TH0 = 0xFC;
// TL0 = 0x67;
ET0 = 1;
TR0 = 1;
TR1 = 1;
hc_595(0);
while(K3){
key_speed();
display(1);
}
P0=0xFF;
while(!move){
LED_show();
move=key_move(0);
}
food();
while(1){
if(validity()){
uint t=3000;
while(1){
while(t--){
P2=0;
delay_10us(5);
P2=0xFF;
delay_10us(5);
}
t=0;
display(0);
if(!K4){
//长度复位
Long=3;
//将蛇的位置复位
for(t=0;t1;k--){
LED_show();
move=key_move(move);
if(!(k%4)){
P0=(LED_x[food_x]);
hc_595(LED_y[food_y]);
delay_10us(50);
hc_595(0);
}
}
switch(move){
case 'U':move_U();break;
case 'D':move_D();break;
case 'L':move_L();break;
case 'R':move_R();break;
}
//检测是否吃到了食物
if(flag_x[0]==food_x&&flag_y[0]==food_y){
Long++;
food();
}
}
}
void delay_10us(uint x) //@11.0592MHz
{
uchar i;
while(x--){
i = 2;
while (--i);
}
}
uchar key_move(uchar move){
uchar a=0xff;
P1=0xf0;
if(P1!=0xf0)delay_10us(10);
if(P1!=0xf0){
a=P1;
P1=0x0f;
if(P1!=0x0f)delay_10us(10);
if(P1!=0x0f){
P1+=a;
}
}
if(P1==0XBD)move='U';
if(P1==0XED)move='D';
if(P1==0XDB)move='L';
if(P1==0xDE)move='R';
if(P1==0xDD)move=0;
return move;
}
void hc_595(uchar sum){
uchar i;
rCLK=0;
for(i=0;i<8;i++){
SRCLK=0;
SER=sum>>7;
sum<<=1;
SRCLK=1;
}
rCLK=1;
}
void move_U(){
uchar i;
for(i=Long;i>0;i--){
flag_x[i]=flag_x[i-1];
flag_y[i]=flag_y[i-1];
}
flag_y[0]--;
}
void move_D(){
uchar i;
for(i=Long;i>0;i--){
flag_x[i]=flag_x[i-1];
flag_y[i]=flag_y[i-1];
}
flag_y[0]++;
}
void move_L(){
uchar i;
for(i=Long;i>0;i--){
flag_x[i]=flag_x[i-1];
flag_y[i]=flag_y[i-1];
}
flag_x[0]--;
}
void move_R(){
uchar i;
for(i=Long;i>0;i--){
flag_x[i]=flag_x[i-1];
flag_y[i]=flag_y[i-1];
}
flag_x[0]++;
}
void LED_show(){
uchar i;
P0=0xFF;
/*这个循环如果写成for(i=0;i=8||flag_y[0]>=8)return 1;
//检测是否与自身重合
for(i=1;i<=Long;i++){
if(flag_x[0]==flag_x[i]&&flag_y[0]==flag_y[i])return 1;
}
return 0;
}
void food(){
uchar i,k;
uchar food_flag=0;
food_flag=0;
while(1){
k=1;
food_x=TH1%8;
food_y=TL1%8;
for(i=0;i10&&!K1){
flag_speed-=10;
delay_10us(10);
while(1)
if(K1)break;
}
if(flag_speed<90&&!K2){
flag_speed+=10;
while(1)
if(K2)break;
}
}
}
}
void display(char a){
uchar gsmg_code[11]={0x3F,0x06,0x5B,0x4F,0x66,0x6D
,0x7D,0x07,0x7F,0x6F,0X00};
if(a){
P0=gsmg_code[flag_speed/10];
}else{
LSA=0;LSB=0;LSC=0;
P0=gsmg_code[Long%10];
delay_10us(10);
P0=0x00;
LSA=1;LSB=0;LSC=0;
P0=gsmg_code[Long/10];
delay_10us(12);
P0=0x00;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)