?? badgerbash.c
字號:
/*
*文件說明:打地鼠程序
*時 間:2009-05-01
*作 者:小樹
*修改時間:
*修改人 :
*/
#include <reg52.h>
#include <stdlib.h>
#include "badgerbash_header.h"
#include "LCD1602.h"
/**添加還需要的頭文件**/
/**********************函數(shù)聲明區(qū)**********************/
/**函數(shù):void delay_ms(uchar num)
* 參數(shù):num----延時時間
* 功能:延時程序
* 返回:無
*/
void delay_ms(uchar num)
{
uchar i=200;
while(num--)
{
while(--i);
}
}
void initial(void);
/**函數(shù):int creatbadger(int num);
* 參數(shù):num----產(chǎn)生地鼠的個數(shù)
* 功能:生成地鼠隨機位置
* 返回:
*/
void creatbadger(uchar num, uint p[posNum][2]);
/**函數(shù):void showbadger(uchar p[posNum]);
* 參數(shù):p[posNum][2]----地鼠位置、時間數(shù)組
* 功能:在相應(yīng)位置上顯示地鼠
* 返回:無
*/
void showbadger(uint p[posNum][2]);
/**函數(shù):void bash(uchar key);
* 參數(shù):key----按下的鍵號
* 功能:打地鼠處理函數(shù),打中與否處理,積分處理
* 返回:無
*/
void bashPro(uchar key, uint p[posNum][2]);
/**函數(shù):uchar keyscan(void);
* 參數(shù):無
* 功能:按鍵掃描
* 返回:按鍵編號
*/
uchar keyscan(void);
/**函數(shù):void modeControl(uchar m);
* 參數(shù):m----游戲模式
* 功能:模式設(shè)置
* 返回:無
*/
void modeControl(uchar m);
/**函數(shù):void setMode(void);
* 參數(shù):無
* 功能:游戲設(shè)置
* 返回:無
*/
void set_Mode(void);
/**函數(shù):void monitor(void);
* 參數(shù):無
* 功能:系統(tǒng)監(jiān)控
* 返回:無
*/
void monitor(void);
void setgrade(uchar g);
/**********************定義全局變量**********************/
uint showTime; /*地鼠出現(xiàn)時間*/
uchar badgerNum; /*地鼠同時出現(xiàn)數(shù)目*/
uchar badgerNow; /*已經(jīng)出現(xiàn)的數(shù)目,通過該數(shù)與badgerNum的差,立即再產(chǎn)生(badgerNum-badgerNow)個*/
uchar grade; /*游戲難度等級*/
uint levelscore[LEVEL] = {0, 50, 150, 350, 650, 1050, 1550, 2150, 2850}; /*進入各關(guān)卡所需的分數(shù)*/
uchar newlevel;
uint showPos[posNum][2]; /*地鼠出現(xiàn)位置,出現(xiàn)所在位置為1,第二位表示出現(xiàn)的時間*/
uchar keyNum; /*按鍵編號*/
uint sc; uchar score[5]; /*游戲積分*/
uint gain; /*每打中一個的得分*/
uchar showEn; /*顯示控制*/
uchar start, run; /*游戲開始*/
uchar setsound,set_mod; /*聲音、模式設(shè)置標志。0:未設(shè)置,1:允許/模式1,2:禁止/模式2 ***/
uint count, count2;
/**********************程序入口點,main函數(shù)**********************/
int main(void)
{
/*系統(tǒng)初始化*/
initial();
/*循環(huán)處理*/
while(1)
{
//LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH);
if (run == 1) /*設(shè)置完成,游戲開始*/
{
keyNum = keyscan();
bashPro(keyNum, showPos);
if (showEn > 9) /*為了更準確掃描鍵盤,控制顯示刷新頻率,500ms刷新一次*/
{
monitor();
showbadger(showPos);
showEn = 0;
}
}
else /*剛進入系統(tǒng),進行游戲設(shè)置*/
set_Mode();
}
}
void initial(void)
{
uchar i = 50;
/*定時器初始化*/
TMOD = 0x01; /*設(shè)置定時器0為工作方式1*/
TH0 = 0x3c; /*定時50ms*/
TL0 = 0xb0;
EA = 1;
ET0 = 1; /*開定時器0中斷*/
TR0 = 1; /*啟動T0*/
/*地鼠顯示清空*/
showPort = 0xff;
showbit = 1;
/*清空按鍵號,無鍵按下*/
keyNum = 254;
/*設(shè)置打地鼠相關(guān)參數(shù)*/
/*改為在模式中設(shè)定*/
/*生成地鼠*/
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);
/*產(chǎn)生隨機種子*/
srand(0);
while(i--)
rand();
/*其他初始化操作*/
}
void creatbadger(uchar num, uint p[posNum][2])
{
uchar i,temp;
i = num;
/*參數(shù)范圍檢查*/
if((num < 0) || (num > posNum - 1))
return;
while(i > 0)
{
temp = rand()%posNum; /*產(chǎn)生0~posNum之間的隨機數(shù)*/
if (p[temp][0] == 0) /*該位置沒出現(xiàn)地鼠*/
{
p[temp][0] = 1; /*在相應(yīng)的位置上置1,即產(chǎn)生地鼠*/
p[temp][1] = showTime;
}
else /*該位置已有地鼠,重新產(chǎn)生*/
continue;
i--;
}
}
void showbadger(uint p[posNum][2])
{
uchar i;
uchar showdata;
showdata = 0xff;showbit = 1; /*顯示數(shù)據(jù)清零*/
/*將地鼠所在位置數(shù)組-->轉(zhuǎn)換成-->直接輸出端口的數(shù)據(jù)*/
for (i = 0;i < posNum-1; i++)
{
/*低8位*/
if (p[i][0] == 1 && p[i][1] > 0)
showdata &=~(0x01<<i);
}
/*將數(shù)據(jù)輸出,顯示地鼠*/
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(); 發(fā)出聲效*/
//right = ~right;
sc += gain; /*積分增加*/
/*只有在模式1下,進入新關(guān)卡*/
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; /*行輸?shù)碗娖剑休敵龈唠娖?/
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:/*關(guān)卡1*/
showTime = 3000; /*單位ms*/
badgerNum = 5;
gain = 1;
break;
case 1:/*關(guān)卡2*/
showTime = 2500; /*單位ms*/
badgerNum = 4;
gain = 2;
break;
case 2:/*關(guān)卡3*/
showTime = 2000; /*單位ms*/
badgerNum = 4;
gain = 4;
break;
case 3:/*關(guān)卡4*/
showTime = 1500; /*單位ms*/
badgerNum = 3;
gain = 6;
break;
case 4:/*關(guān)卡5*/
showTime = 1000; /*單位ms*/
badgerNum = 3;
gain = 8;
break;
case 5:/*關(guān)卡6*/
showTime = 900; /*單位ms*/
badgerNum = 2;
gain = 10;
break;
case 6:/*關(guān)卡7*/
showTime = 800; /*單位ms*/
badgerNum = 1;
gain = 12;
break;
case 7:/*關(guān)卡8*/
showTime = 600; /*單位ms*/
badgerNum = 1;
gain = 14;
break;
default:/*關(guān)卡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';
/*顯示關(guān)卡*/
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)
{
/*模式設(shè)置
* 1、關(guān)卡模式:
* 2、挑戰(zhàn)模式:
*/
/*顯示提示*/
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); /*延時穩(wěn)定,防抖動*/
if (start != 0) /*進入聲音設(shè)置*/
{
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) /*聲音設(shè)置*/
{
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) /*模式設(shè)置*/
{
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);
/*設(shè)置完成,游戲開始*/
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;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -