📄 badgerbash.c
字号:
/*
*文件说明:打地鼠程序
*时 间:2009-05-01
*作 者:小树
*修改时间:
*修改人 :
*/
#include <reg52.h>
#include <stdlib.h>
#include "badgerbash_header.h"
#include "LCD1602.h"
/**添加还需要的头文件**/
/**********************函数声明区**********************/
/**函数:void delay_ms(uchar num)
* 参数:num----延时时间
* 功能:延时程序
* 返回:无
*/
void delay_ms(uchar num)
{
uchar i=200;
while(num--)
{
while(--i);
}
}
void initial(void);
/**函数:int creatbadger(int num);
* 参数:num----产生地鼠的个数
* 功能:生成地鼠随机位置
* 返回:
*/
void creatbadger(uchar num, uint p[posNum][2]);
/**函数:void showbadger(uchar p[posNum]);
* 参数:p[posNum][2]----地鼠位置、时间数组
* 功能:在相应位置上显示地鼠
* 返回:无
*/
void showbadger(uint p[posNum][2]);
/**函数:void bash(uchar key);
* 参数:key----按下的键号
* 功能:打地鼠处理函数,打中与否处理,积分处理
* 返回:无
*/
void bashPro(uchar key, uint p[posNum][2]);
/**函数:uchar keyscan(void);
* 参数:无
* 功能:按键扫描
* 返回:按键编号
*/
uchar keyscan(void);
/**函数:void modeControl(uchar m);
* 参数:m----游戏模式
* 功能:模式设置
* 返回:无
*/
void modeControl(uchar m);
/**函数:void setMode(void);
* 参数:无
* 功能:游戏设置
* 返回:无
*/
void set_Mode(void);
/**函数:void monitor(void);
* 参数:无
* 功能:系统监控
* 返回:无
*/
void monitor(void);
void setgrade(uchar g);
/**********************定义全局变量**********************/
uint showTime; /*地鼠出现时间*/
uchar badgerNum; /*地鼠同时出现数目*/
uchar badgerNow; /*已经出现的数目,通过该数与badgerNum的差,立即再产生(badgerNum-badgerNow)个*/
uchar grade; /*游戏难度等级*/
uint levelscore[LEVEL] = {0, 50, 150, 350, 650, 1050, 1550, 2150, 2850}; /*进入各关卡所需的分数*/
uchar newlevel;
uint showPos[posNum][2]; /*地鼠出现位置,出现所在位置为1,第二位表示出现的时间*/
uchar keyNum; /*按键编号*/
uint sc; uchar score[5]; /*游戏积分*/
uint gain; /*每打中一个的得分*/
uchar showEn; /*显示控制*/
uchar start, run; /*游戏开始*/
uchar setsound,set_mod; /*声音、模式设置标志。0:未设置,1:允许/模式1,2:禁止/模式2 ***/
uint count, count2;
/**********************程序入口点,main函数**********************/
int main(void)
{
/*系统初始化*/
initial();
/*循环处理*/
while(1)
{
//LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH);
if (run == 1) /*设置完成,游戏开始*/
{
keyNum = keyscan();
bashPro(keyNum, showPos);
if (showEn > 9) /*为了更准确扫描键盘,控制显示刷新频率,500ms刷新一次*/
{
monitor();
showbadger(showPos);
showEn = 0;
}
}
else /*刚进入系统,进行游戏设置*/
set_Mode();
}
}
void initial(void)
{
uchar i = 50;
/*定时器初始化*/
TMOD = 0x01; /*设置定时器0为工作方式1*/
TH0 = 0x3c; /*定时50ms*/
TL0 = 0xb0;
EA = 1;
ET0 = 1; /*开定时器0中断*/
TR0 = 1; /*启动T0*/
/*地鼠显示清空*/
showPort = 0xff;
showbit = 1;
/*清空按键号,无键按下*/
keyNum = 254;
/*设置打地鼠相关参数*/
/*改为在模式中设定*/
/*生成地鼠*/
creatbadger(badgerNum, showPos);
badgerNow = badgerNum;
score[0] = 0 + '0';
score[1] = 0 + '0';
score[2] = 0 + '0';
score[3] = 0 + '0';
score[4] = '\0';
/*液晶初始化*/
LCD_Initial();
GotoXY(0,0);
Print(" Badger Inside! ");
GotoXY(0,1);
Print("Let's bash it..");
/*延时定格欢迎画面*/
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
/*产生随机种子*/
srand(0);
while(i--)
rand();
/*其他初始化操作*/
}
void creatbadger(uchar num, uint p[posNum][2])
{
uchar i,temp;
i = num;
/*参数范围检查*/
if((num < 0) || (num > posNum - 1))
return;
while(i > 0)
{
temp = rand()%posNum; /*产生0~posNum之间的随机数*/
if (p[temp][0] == 0) /*该位置没出现地鼠*/
{
p[temp][0] = 1; /*在相应的位置上置1,即产生地鼠*/
p[temp][1] = showTime;
}
else /*该位置已有地鼠,重新产生*/
continue;
i--;
}
}
void showbadger(uint p[posNum][2])
{
uchar i;
uchar showdata;
showdata = 0xff;showbit = 1; /*显示数据清零*/
/*将地鼠所在位置数组-->转换成-->直接输出端口的数据*/
for (i = 0;i < posNum-1; i++)
{
/*低8位*/
if (p[i][0] == 1 && p[i][1] > 0)
showdata &=~(0x01<<i);
}
/*将数据输出,显示地鼠*/
showPort = showdata;
/*最高位*/
if (p[i][0] == 1 && p[i][1] > 0)
showbit = 0;
}
void bashPro(uchar key, uint p[posNum][2])
{
uint t;
uchar i, l[2];
if (key > posNum-1) /*无按键按下*/
return;
if (p[key][0] == 1) /*打中地鼠*/
{
p[key][0] = 0; /*地鼠消失*/
p[key][1] = 0;
/*if (setsound == 1)*/
/*beep(); 发出声效*/
//right = ~right;
sc += gain; /*积分增加*/
/*只有在模式1下,进入新关卡*/
if (set_mod == 1)
{
for (i=0; i< LEVEL; i++)
if (sc == levelscore[i])
{
grade = i + 1;
setgrade(grade);
l[0] = grade + '0';
l[1] = '\0';
GotoXY(0,0);
Print("Level ");
GotoXY(6,0);
Print(l);
}
}
/*只有在击中的情况下才刷新LCD*/
score[0] = sc/1000 + '0';
t = sc % 1000;
score[1] = t/100 + '0';
t = t % 100;
score[2] = t/10 + '0';
t = t % 10;
score[3] = t + '0';
score[4] = '\0';
GotoXY(12,0);
Print(score);
key = 254; /*等待下一按键*/
}
}
/*** 键盘扫描程序 ***/
/*本键盘扫描程序只支持单键*/
uchar keyscan(void)
{
uchar row, col = 0, key = 254;
//uchar test[4];
row1 = row2 = row3 = 1; /*行输出高电平,列输出低电平*/
col1 = col2 = col3 = 0;
if ((row1 && row2 && row3) == 0)
{
//delay_ms(5);
if ((row1 && row2 && row3) == 0)
{
if(row1 == 0)
row = 0;
if(row2 == 0)
row = 1;
if(row3 == 0)
row = 2;
row1 = row2 = row3 = 0; /*行输低电平,列输出高电平*/
col1 = col2 = col3 = 1;
if(col1 == 0)
col = 0;
if(col2 == 0)
col = 1;
if(col3 == 0)
col = 2;
}
key = row * 3 + col;
/*测试按键扫描
test[0] = row + '0';
test[1] = col + '0';
test[2] = key + '0';
test[3] = '\0';
GotoXY(0,0);
Print(test);
*/
}
return key;
}
void setgrade(uchar g)
{
switch(g)
{
case 0:/*关卡1*/
showTime = 3000; /*单位ms*/
badgerNum = 5;
gain = 1;
break;
case 1:/*关卡2*/
showTime = 2500; /*单位ms*/
badgerNum = 4;
gain = 2;
break;
case 2:/*关卡3*/
showTime = 2000; /*单位ms*/
badgerNum = 4;
gain = 4;
break;
case 3:/*关卡4*/
showTime = 1500; /*单位ms*/
badgerNum = 3;
gain = 6;
break;
case 4:/*关卡5*/
showTime = 1000; /*单位ms*/
badgerNum = 3;
gain = 8;
break;
case 5:/*关卡6*/
showTime = 900; /*单位ms*/
badgerNum = 2;
gain = 10;
break;
case 6:/*关卡7*/
showTime = 800; /*单位ms*/
badgerNum = 1;
gain = 12;
break;
case 7:/*关卡8*/
showTime = 600; /*单位ms*/
badgerNum = 1;
gain = 14;
break;
default:/*关卡9:需要5600分进入*/
showTime = 500; /*单位ms*/
badgerNum = 1;
gain = 34;
break;
}
}
void modeControl(uchar m)
{
uchar l[2];
switch (m)
{
case 1: /*模式1*/
setgrade(0);
l[0] = 0 + '0';
l[1] = '\0';
/*显示关卡*/
GotoXY(0,0);
Print("Level ");
GotoXY(6,0);
Print(l);
break;
case 2: /*模式2*/
showTime = 3000; /*单位ms*/
badgerNum = 1;
gain = 1;
GotoXY(0,0);
Print("TRAINING");
Print(l);
break;
default:
break;
}
}
void set_Mode(void)
{
/*模式设置
* 1、关卡模式:
* 2、挑战模式:
*/
/*显示提示*/
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
delay_ms(50);
GotoXY(1,0);
Print("..Start Game..");
GotoXY(2,1);
Print("press 'MODE'");
while(1)
{
keyNum = keyscan(); /*扫描按键*/
if (start == 0) /*进入游戏*/
{
if (keyNum == 0)
{
start = 1;
}
keyNum = 254; /*等待下一按键*/
delay_ms(100); /*延时稳定,防抖动*/
if (start != 0) /*进入声音设置*/
{
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print(" UP: SOUND ON");
GotoXY(0,1);
Print("DOWN: SOUND OFF");
}
}
if (setsound == 0 && start == 1) /*声音设置*/
{
if (keyNum == 1)
setsound = 1;
else if (keyNum == 2)
setsound = 2;
keyNum = 254; /*等待下一按键*/
delay_ms(100);
if (setsound != 0)
{
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
GotoXY(0,0);
Print(" UP: TOURNANMENT");
GotoXY(0,1);
Print("DOWN: TRAINING");
}
}
if (set_mod == 0 && setsound != 0) /*模式设置*/
{
if (keyNum == 1)
set_mod = 1;
else if (keyNum == 2)
set_mod = 2;
else
set_mod = 0;
keyNum = 254; /*等待下一按键*/
delay_ms(100);
if (set_mod != 0)
{
LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
delay_ms(50);
modeControl(set_mod);
/*设置完成,游戏开始*/
run = 1;
break;
}
}
}
}
void monitor(void)
{
uchar i,temp = 0;
for (i = 0; i < posNum; i++)
{
if (showPos[i][0] == 1)
temp++;
}
badgerNow = temp;
creatbadger(badgerNum-badgerNow, showPos);
}
void timer0Int(void) interrupt 1 using 1
{
TH0 = 0x3c; /*定时50ms*/
TL0 = 0xb0;
/**********处理操作****************/
count++;
showEn++;
//RUN = ~RUN;
for (count2 = 0; count2 < posNum; count2++)
{
if (showPos[count2][1] > 0)
{
showPos[count2][1]-=50;
}
if (showPos[count2][0] == 1 && showPos[count2][1] <= 0)
{
showPos[count2][0] = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -