基于51单片机的小游戏
#define MQ 5//进入下一关的加速,pace=pace-MQ
sbit P3_0=P3^0;sbit P3_2=P3^2;sbit P3_3=P3^3;
//蜂鸣器位外部中断0外部中断1
sbit P3_7=P3^7;sbit P3_6=P3^6;sbit P3_1=P3^1;//指示灯位
sbit P0_7=P0^7;sbit P0_6=P0^6;sbit P0_5=P0^5;sbit P0_4=P0^4;
while(1)
{wait=0;//游戏已开始,wait置0
if(knock()){pace=SPEED;break;} //判断是否碰撞
/*************显示部分************************/
if(P0_6&P0_4)display(pace); //判断是否速度运动
sbit P2_3=P2^3;sbit P2_2=P2^2;sbit P2_1=P2^1;sbit P2_0=P2^0;
uchar x[SNAKE+1];//蛇身的坐标行
uchar y[SNAKE+1]; //蛇身的坐标列
uchar n,i,pace,xz;//当前蛇长,通用变量,当前速度,选择游戏标志
判断是否碰撞,是则返回1,否则返回0
**************************************************************/
bit knock()
{bit k=0;
if(x[1]>7||y[1]>7)k=1; //撞墙
for(i=2;i<n;i++)
ห้องสมุดไป่ตู้if((x[1]==x[i])&(y[1]==y[i]))k=1; //撞自己
//暂停增关卡,加速减关卡,退出加速
//doruaimifa
sbit P0_2=P0^2;sbit P0_1=P0^1;sbit P0_3=P0^3;sbit P0_0=P0^0;
//左下右上
// saolaxi退出
sbit P2_7=P2^7;sbit P2_6=P2^6;sbit P2_5=P2^5;sbit P2_4=P2^4;
for(i=3;i<SNAKE+1;i++)y[i]=100;//初始化虚拟蛇身
}
do
{x[0]=rand()%8;y[0]=rand()%8;//产生随机果实
again=0;
for(i=1;i<n;i++)//判断是否与蛇身重叠
case 5:if(addx!=1||addy!=-1){addx=-1;addy=1;}break;//左上
case 9:if(addx!=-1||addy!=-1){addx=1;addy=1;}break;//右上
case 6:if(addx!=1||addy!=1){addx=-1;addy=-1;}break;//左下
/*************选关******************************************/
if(~P0_6)//增关卡
{delay10ms(2);//去抖动
if(~P0_6)
{if(++guanqia<=7)//最大到7关
{P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;
P2=~mux(y[i]);P1=~mux(x[i]);//按点依次显示
delay1ms(1);//显示延时1ms
}
}
}
/*****外部中断1,用于切换游戏,xz=0为贪吃蛇,xz=1为电子琴******/
void my_int1(void) interrupt 2
{delay10ms(2); //去抖动
{switch(~P0)
{case 1:addx=0;addy=addy==-1?-1:1;break;//上
case 2:addx=0;addy=addy==1?1:-1; break;//下
case 4:addy=0;addx=addx==1?1:-1; break;//左
case 8:addy=0;addx=addx==-1?-1:1;break;//右
仿真图:
PCB图:
#include <reg52.h>
#include<stdlib.h>
#include"ours.h"
#define uchar unsigned char
#define SNAKE 20 //最长蛇身
#define SPEED 50 //运动速度控制,值越大,则扫描整个蛇
//身的时间越长,即表现为移动速度慢
else display(10);//当P0^4或P0^6被按下时加速运动
if(~P0_5)break;//判断是否退出
/*************判断是否吃东西,及进入下一关**************/
if((y[0]==y[1]+addx)&&(x[0]==x[1]+addy)) //如果吃到
char bdata guanqia;//定义关卡,可谓寻址,便于控制指示灯
sbit guanqia_0=guanqia^0;sbit guanqia_1=guanqia^1;sbit guanqia_2=guanqia^2;
char addx,addy; //移动方向,同直角坐标系,addx为横向,addy为纵向
return k;
}
/**************************************************************
键位处理
**************************************************************/
void key_press()
{n++;//蛇身加1
if(n==SNAKE+1)//如果进入下一关
{n=3;//蛇身长从2开始
pace=pace-MQ; guanqia++;//运动加速,关卡加1
P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;
//将关卡的值用三个指示灯显示出来
for(i=3;i<SNAKE+1;i++)x[i]=100;//初始化虚拟蛇身
*******主程序***************************************
***************************************************************/
void main(void)
{EA=1;//开总中断
EX0=1;//开外部中断0
TCS:while(1)
{/**************初始化游戏**********************/
for(i=3;i<SNAKE+1;i++)x[i]=100;//初始化虚拟蛇身
for(i=3;i<SNAKE+1;i++)y[i]=100;//初始化虚拟蛇身
n=3; //初始蛇身长为n-1
//将其值用发光二极管以二进制的形式显示出来
pace=pace-MQ; //加速
}else --guanqia;
while(~P0_6)display_p(1);
//直到松开按键才跳出,以防连续增加关卡
}
}
if(~P0_5)//减关卡
{delay10ms(2);
if(~P0_5)
{if(--guanqia>=1)
{P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;
pace=pace+MQ;
}else ++guanqia;
while(~P0_5)display_p(1);
}
}
}
/*************贪吃蛇游戏正在运行**************************/
P3_7=~guanqia_2;P3_6=~guanqia_1;P3_1=~guanqia_0;//显示关卡
while(1)//等待选择游戏
{wait=1;//等待选择游戏
if(xz) goto DZQ;//如果xz=1,则进入电子琴
display_p(1);//显示贪吃蛇初始位置
if(~P0_3|~P0_0)break;//如果按上或右键,则开始游
EX1=1;//开外部中断1
/***********************************************************************
*****************贪吃蛇****************************************
************************************************************************/
again=0;
for(i=1;i<n;i++)//判断是否与蛇身重叠
if((x[0]==x[i])&&(y[0]==y[i]))again=1;
}while(again);//若重叠则再次产生
/************等待开始游戏,贪吃蛇开始前可选关****************/
guanqia=1;//第一关
}