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

📄 brick.c

📁 单片机控制实现几个小游戏:贪吃蛇、俄罗斯方块、推箱子
💻 C
字号:
#ifndef __brick_C__
#define __brick_C__
#include "brick.h"

void brick(void)
{//keywords_delay=SHORT_PUSH;
uint8_t i;
currspeed=BRICK_SPEED;	//初始化速度
LED_UEN_0123;//LED显示所有位
total_NO=0;				//分数初始化;
display_LED_total_NO();
//databuffer_clr();		//清空显示缓冲区
INTE=0;
for(i=0;i<16;i++)BG_display_16mux16[i]=NULL;//清空背景层
INTE=1;
renew_brick();			//生成新的砖块
while(1)
{uint8_t conflict_down,k,del_line;  int8_t i,j;
	connect(brick_x,brick_y,brick_shape_turn);//生成显示
	for(i=0;i<16;i++)displaybuffer_16mux16[i]=BG_display_16mux16[i]|ROLE_display_16mux16[i];//显示
	delay_very_long(currspeed);//游戏速度控制和连击
	while(stop_game);									//停止
	INTE=0;//关键盘中断防止test_conflict()和connect()出错
	k=0;for(i=0;i<4;i++)if((brick_y+brick_shape_y[brick_shape][brick_shape_turn][i])==0){k=1;break;}//是否到底层
	conflict_down=test_conflict(0,-1,brick_shape_turn);//下落冲突
	if(conflict_down&&(brick_y>14))break;	//如果在16层叠加则退出游戏
	if(conflict_down||k)
		{
		fast_down=NO;	//不启动快速落下
		connect(brick_x,brick_y,brick_shape_turn);
		for(i=15;i>=0;i--)
			{
			BG_display_16mux16[i]|=ROLE_display_16mux16[i];//合并准备判断消行
			if(BG_display_16mux16[i]==0xffff)//是否消行
				{				
				total_NO++;//消1行加分
				if(del_line>0)total_NO++;//消2行额外加分
				if(del_line>1)total_NO++;//消3行额外加分
				if(del_line>2)total_NO++;//消4行额外加分
				del_line++;
				//make_sound();//发声
				//display_LED_total_NO(total_NO);//显示分数
				display_LED_total_NO();
				currspeed=BRICK_SPEED-(total_NO/30)*10000;	//速度控制
				for(j=i;j<15;j++)BG_display_16mux16[j]=BG_display_16mux16[j+1];
				BG_display_16mux16[15]=0;
				}
			}
		renew_brick();
		}
	else 
		(brick_y)--;		//下落
	INTE=1;//重新开中断
}
//当前游戏结束执行
INTE=1;//游戏结束时,重新开中断
fast_down=NO;	//游戏结束时,不启动快速落下
display_cmd(DISPLAY_CMD_OVER,0);	//显示游戏结束
Current_game=DEFAULTS;		//等待游戏选择
stop_game=GANE_BEGIN;	//游戏不停止
LED_UEN_0123;//LED显示所有位//main_display();
keywords=0;
}

void delay_very_long(uint16_t delay_time)//游戏速度控制,键盘连击控制
{/*static*/uint16_t push_no;//连击计数
uint8_t i;
	while(delay_time--)
	{	if(fast_down==YES)delay_time=0;	 //控制快速落下
		if(keyenable)			 //如果键盘长按
			{
			push_no=0;keywords=0;//若不长按清除键值和连击计数
			}
		else
			{
			if(push_no>SHORT_PUSH/*keywords_delay*/)//到连击时间进入连击
				{
					switch(keywords)//对应键连击
					{
					case LEFT :
						if(!test_conflict(-1,0,brick_shape_turn))(brick_x)--;break;
					case RIGHT:
						if(!test_conflict(1,0,brick_shape_turn))(brick_x)++;break;
					default:
						break;
					}
					push_no=0;		//清空 准备下次连击
					//keywords_delay=SHORT_PUSH;//送连击延时时间						
					connect(brick_x,brick_y,brick_shape_turn);
			 		for(i=0;i<16;i++)displaybuffer_16mux16[i]=BG_display_16mux16[i]|ROLE_display_16mux16[i];
				}
			else
				push_no++;
			}
	}
}

void key_brick(void)  		//键盘处理
{uint8_t i;
if(stop_game==NO)
	{	
		switch(keywords)
		{	
		case LEFT:			//无冲突则移动
			if(!test_conflict_int(-1,0,brick_shape_turn))(brick_x)--;break;
		case RIGHT:
			if(!test_conflict_int(1,0,brick_shape_turn))(brick_x)++;break;
		case OK:	//无冲突则旋转	 OK
			{uint8_t brick_shape_turn_temp;	
			if(brick_shape_turn==3)brick_shape_turn_temp=0; else brick_shape_turn_temp=brick_shape_turn+1;		
			if(!test_conflict_int(0,0,brick_shape_turn_temp))brick_shape_turn=brick_shape_turn_temp;break;
			}
		case DOWN :	//快速落下
			fast_down=YES;//启动快速落下
			break;
		case STOP://停止
			stop_game=~stop_game;
			break;
		default:
			break;
		}
		connect_int(brick_x,brick_y,brick_shape_turn);
		for(i=0;i<16;i++)displaybuffer_16mux16[i]=BG_display_16mux16[i]|ROLE_display_16mux16[i];
	//	n=SHORT_LONG;//,类似看门狗判断连击,若判断延时未到按下另一按键,则喂狗重新判断连击
	}
	else
	{if(keywords==STOP)stop_game=~stop_game;}
}

int1_t test_conflict(int8_t x,int8_t y,int8_t z)	//判断冲突
{uint8_t i,temp_x,temp_y;
	connect(brick_x+x,brick_y+y,z);			//在缓冲区生成方块形状
	for(i=0;i<16;i++)if((BG_display_16mux16[i]&ROLE_display_16mux16[i])>0){/*EA=1;*/return 1;}//是否叠加冲突
	for(i=0;i<4;i++)
	{
		temp_x=brick_x+x+brick_shape_x[brick_shape][z][i];
		temp_y=brick_y+y+brick_shape_y[brick_shape][z][i];
		if(temp_x>15){return 1;}//是否超显示器范围冲突	 
	}
	return 0;
}

int1_t test_conflict_int(int8_t x,int8_t y,int8_t z)	//判断冲突
{uint8_t i,temp_x,temp_y;
	connect_int(brick_x+x,brick_y+y,z);			//在缓冲区生成方块形状
	for(i=0;i<16;i++)if((BG_display_16mux16[i]&ROLE_display_16mux16[i])>0){/*EA=1;*/return 1;}//是否叠加冲突
	for(i=0;i<4;i++)
	{
		temp_x=brick_x+x+brick_shape_x[brick_shape][z][i];
		temp_y=brick_y+y+brick_shape_y[brick_shape][z][i];
		if(temp_x>15){return 1;}//是否超显示器范围冲突	 
	}
	return 0;
}


void connect(int8_t x,int8_t y,int8_t z)	//在缓冲区生成方块形状
{
	uint8_t i,temp_x,temp_y;						//清空显示缓冲区
	for(i=0;i<16;i++)ROLE_display_16mux16[i]=NULL;//清空角色层
	for(i=0;i<4;i++)
	{
		temp_x=x+brick_shape_x[brick_shape][z][i];temp_y=y+brick_shape_y[brick_shape][z][i];
		if((temp_x<16)&&(temp_y<16))//增加稳定性防止显示出错
		ROLE_display_16mux16[temp_y]|=mux_int[temp_x];//生成形状
	}
}

void connect_int(int8_t x,int8_t y,int8_t z)	//在缓冲区生成方块形状
{
	uint8_t i,temp_x,temp_y;						//清空显示缓冲区
	for(i=0;i<16;i++)ROLE_display_16mux16[i]=NULL;//清空角色层
	for(i=0;i<4;i++)
	{
		temp_x=x+brick_shape_x[brick_shape][z][i];temp_y=y+brick_shape_y[brick_shape][z][i];
		if((temp_x<16)&&(temp_y<16))//增加稳定性防止显示出错
		ROLE_display_16mux16[temp_y]|=mux_int[temp_x];//生成形状
	}
}

void renew_brick(void)	//生成新的方块
{	static brick_shape_tmp; 
	brick_x=7;brick_y=15;
	brick_shape=brick_shape_tmp;
	brick_shape_tmp=rand()%7;
	//write7279(LED_1_F, display_shape[brick_shape_tmp]);//显示方块
	seg_7_led_buffer[3]=display_shape[brick_shape_tmp];
	brick_shape_turn=0;
}

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -