单片机源程序如下:
//12864并行接口参考程序,控制器st7920
#include "reg52.h"
#include "Lcd12864.h"
#include "Key.h"
#define uchar unsigned char
#define uint unsigned int
static unsigned long Seed = 1;
#define A 48271L
#define M 2147483647L
#define Q (M / A)
#define R (M % A)
/************************************
伪随机数发生器
*************************************/
double Random(void)
{
long TmpSeed;
TmpSeed=A*(Seed%Q)-R*(Seed/Q);
if(TmpSeed>=0)
Seed=TmpSeed;
else
Seed=TmpSeed+M;
return (double)Seed/M;
}
/**************************************
为伪随机数发生器播种
***************************************/
void InitRandom(unsigned long InitVal)
{
Seed=InitVal;
}
//延时子程序
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i } /********************************* 初始化MPU **********************************/ void InitCpu(void) { TMOD=0x0; TH0=0; TL0=0; TR0=1; ET0=1; EA=1; } #define N 25 struct Food { unsigned char x; unsigned char y; unsigned char yes; }food;//食物结构体 struct Snake { unsigned char x[N]; unsigned char y[N]; unsigned char node; unsigned char direction; unsigned char life; }snake;//蛇结构体 unsigned char Flag=0; unsigned char Score=0; unsigned char Speed=5; unsigned char KeyBuffer=0; #define FUNC 1 #define UP 2 #define DOWN 3 #define LEFT 4 #define RIGHT 5 #define PASSSCORE 20//预定义过关成绩 void Timer0Int(void) interrupt 1 { switch(OSReadKey()) { case 90: KeyBuffer=FUNC; if(++Speed>=10) Speed=1; Flag|=1<<1;//速度变化标志置1 break; case 13: KeyBuffer=DOWN; /*if(snake.direction!=2) snake.direction=1;*/ break; case 33: KeyBuffer=UP; /*if(snake.direction!=1) snake.direction=2;*/ break; case 23: KeyBuffer=RIGHT; /*if(snake.direction!=4) snake.direction=3;*/ break; case 43 : KeyBuffer=LEFT; /*if(snake.direction!=3) snake.direction=4;*/ break; default: break; } } /****************************** 画墙壁,初始化界面 *******************************/ void DrawBoard(void) { unsigned char n; for(n=0;n<31;n++) { Lcd_Rectangle(3*n,0,3*n+2,2,1); Lcd_Rectangle(3*n,60,3*n+2,62,1); } for(n=0;n<21;n++) { Lcd_Rectangle(0,3*n,2,3*n+2,1); Lcd_Rectangle(90,3*n,92,3*n+2,1); } Lcd_HoriLine(93,31,35,1); Lcd_HoriLine(93,63,35,1); } /*************************** 打印成绩 ****************************/ void PrintScore(void) { unsigned char Str[3]; Lcd_WriteStr(6,0,"成绩"); Str[0]=(Score/10)|0x30;//十位 Str[1]=(Score%10)|0x30;//个位 Str[2]=0; Lcd_WriteStr(7,1,Str); } /******************************** 打印速度级别 *********************************/ void PrintSpeed(void) { unsigned char Str[2]; Lcd_WriteStr(6,2,"级别"); Str[0]=Speed|0x30; Str[1]=0; Lcd_WriteStr(7,3,Str); } /*********************************** 游戏结束处理 ************************************/ void GameOver(void) { unsigned char n; Lcd_Rectangle(food.x,food.y,food.x+2,food.y+2,0);//消隐出食物 for(n=1;n Lcd_Rectangle(snake.x[n],snake.y[n],snake.x[n]+2,snake.y[n]+2,0);//消隐食物,蛇头已到墙壁内,故不用消去 } if(snake.life==0)//如果蛇还活着 Lcd_WriteStr(2,1,"过关"); else //如果蛇死了 Lcd_WriteStr(2,1,"输了"); Lcd_WriteStr(1,2,"游戏结束"); } /******************************** 游戏的具体过程,也是贪吃蛇算法的关键部分 *********************************/ void GamePlay(void) { unsigned char n; InitRandom(TL0); food.yes=1;//1表示需要出现新事物,0表示已经存在食物尚未吃掉 snake.life=0;//表示蛇还活着 snake.direction=DOWN; snake.x[0]=6;snake.y[0]=6; snake.x[1]=3;snake.y[1]=6; snake.node=2; PrintScore(); PrintSpeed(); while(1) { if(food.yes==1) { while(1) { food.x=Random()*85+3; food.y=Random()*55+3;//获得随机数 while(food.x%3!=0) food.x++; while(food.y%3!=0) food.y++;
上一篇:单片机红外热释报警器
下一篇:单片机编程里软件定时器使用技巧
推荐阅读最新更新时间:2024-11-17 11:53
设计资源 培训 开发板 精华推荐
- STM32F103C8T6
- AM1D-0512S-RZ 12V 1 瓦 DC-DC 转换器的典型应用
- stm32视频小车驱动板
- 用于微功率 A/D 转换器的 LT1634BCS8-1.25 电压基准的典型应用
- AM2S-2412SH30Z 12V 2瓦直流转直流转换器的典型应用
- MC33071DR2G 二阶高通有源滤波器的典型应用
- 使用 NXP Semiconductors 的 TDA8933B 的参考设计
- 具有电流、电压和温度保护的增强型隔离式三相逆变器参考设计
- 具有跟踪功能的 LTM4650AIY-1 2.5V 和 3.3V 输出的典型应用电路
- AD8601ARTZ-REEL 低侧运算放大器电流监视器的典型应用
- 兆易创新 GD32E231 DIY 大赛,百套超值型开发板免费申请+重磅豪礼!
- 抢先体验NUCLEO家族新贵,ST STM32 NUCLEO-F091RC开发板28元包邮!
- 直播:您的安全保护做到了吗?TI毫米波雷达直播给您答案
- 有奖直播:远近皆宜的无线连接方案 3月25日(周四)上午10:00 邀您观看!
- ADI 新一期《模拟对话》上线,免费下载ing!
- 【直播】恩智浦Thread/BLE双模技术讲座
- Littelfuse第2期 | 符合AEC-Q200 车规的保险丝/熔断器
- 【EEWORLD第六届社区明星人物】8月明星人物
- 看视频赢京东卡 PI电机驱动解决方案学习中心正式上线
- 电子工程师,如何更好地拥抱GaN?参与问卷有好礼!