单片机源程序如下:
//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 for(j=0;j<10;j++); } /********************************* 初始化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;//获得随机数 whil
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』