📄 brick.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 + -