⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 badgerbash.c

📁 打地鼠程序游戏
💻 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 + -