📄 function.c
字号:
Black_Ground[Block_Y]=0;
Black_Ground[Block_Y+1]=0;
Black_Ground[Block_Y+2]=0;
Black_Ground[Block_Y+3]=0;//将当前模块从数组中清除,防止和新方块和现在的方块重叠
pic=Pic[I][J];
if(Block_X>=8)
{
Black_Ground[Block_Y]=_irol_((((pic>>6)&0x03c0)),Block_X-8);
Black_Ground[Block_Y+1]=_irol_((((pic>>2)&0x03c0)),Block_X-8);
Black_Ground[Block_Y+2]=_irol_((((pic<<2)&0x03c0)),Block_X-8);
Black_Ground[Block_Y+3]=_irol_((((pic<<6)&0x03c0)),Block_X-8);
for(i=0;i<4;i++)
{
horiz=horiz|(Black_Ground[Block_Y+i]&0x0001);
horiz=horiz<<1;
}
}
else
{
Black_Ground[Block_Y]=_iror_((((pic>>6)&0x03c0)),8-Block_X);
Black_Ground[Block_Y+1]=_iror_((((pic>>2)&0x03c0)),8-Block_X);
Black_Ground[Block_Y+2]=_iror_((((pic<<2)&0x03c0)),8-Block_X);
Black_Ground[Block_Y+3]=_iror_((((pic<<6)&0x03c0)),8-Block_X);
for(i=0;i<4;i++)
{
horiz=horiz|(Black_Ground[Block_Y+i]&0x8000);
horiz=horiz>>1;
}
}
}
///////////////////////////////////////////////////////////////////
void Change()
{
uchar i;
uint16 temp;
////////////////////////////////////////////////////
//得到方块数点
for(i=0;i<16;i++)
{
Black_Ground[i]=(~Map[i])&Black_Ground[i];//Black_Ground数组中只有方块数点
}
//得到方块数点
///////////////////////////////////////////////////////
//////////////////////////////////////////////////
if(keyvalue==9) //按键向左
{
for(i=0;i<4;i++)
{
Black_Ground[Block_Y+i]=_irol_(Black_Ground[Block_Y+i],1);
horiz=horiz|(Black_Ground[Block_Y+i]&0x0001);
horiz=horiz<<1;
}
Block_X++;
if(Attack_Frame()|Attack_Block())//如果接触了左边框
{ //就不能向左移动
for(i=0;i<4;i++)
{
Black_Ground[Block_Y+i]=_iror_(Black_Ground[Block_Y+i],1);
}
Block_X--;
}
}
if(keyvalue==11) //按键向右
{
for(i=0;i<4;i++)
{
Black_Ground[Block_Y+i]=_iror_(Black_Ground[Block_Y+i],1);
horiz=horiz|(Black_Ground[Block_Y+i]&0x8000);
horiz=horiz>>1;
}
Block_X--;
if(Attack_Frame()|Attack_Block())//如果接触了右边框
{ //就不能向右移动
for(i=0;i<4;i++)
{
Black_Ground[Block_Y+i]=_irol_(Black_Ground[Block_Y+i],1);
}
Block_X++;
}
}
///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
if(keyvalue==14) //如果按了变形按键
{
Transformer(); //变换了方块
if(Attack_Frame()|Attack_Block()|Attack_Bottom())
{
J=(J+2)%4;//变回到原来的方块
Transformer(); //变换了方块
}
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
if(keyvalue==8) //如果按下了快速下落
{Quick_Down=1;} //改变定时时间的初值
if(Quick_Down==1)
keyvalue=10;
/////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
if((keyvalue==10)|(keyvalue1==2)) //按键向下或定时时间到
{
temp=Black_Ground[15];
for(i=15;i>0;i--)
{
Black_Ground[i]=Black_Ground[i-1];
}
Black_Ground[0]=temp;
Draw_Block_To_BG_Flag=Down;
Block_Y++;
if(Attack_Bottom()|Attack_Block())
{
temp=Black_Ground[0];
for(i=0;i<15;i++)
{
Black_Ground[i]=Black_Ground[i+1];
}
Black_Ground[15]=temp;
for(i=0;i<16;i++)
Map[i]=Map[i]|Black_Ground[i];
NewBlock=1; //一个方块下落完毕,要求重新加载新方块
Quick_Down=0; //方块快速下落完毕,清除快速下落标志
Block_Y--;
I=I1; //将预览中的方块换成下一次要放的方块
J=J1;
}//向下处理 ,将方块加到背景地图中
}
keyvalue=keyvalue1=0xff;//查询到没有按键赋值为ff,不要方块以之前的方向一直移动
//////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
//把变形的方块和背景一起画到Black_Ground数组中
for(i=0;i<16;i++)
{
Black_Ground[i]=Black_Ground[i]|Map[i];
}
//把变形的方块和背景一起画到Black_Ground数组中
}
uchar Keyscan()
{
temp0=(~temp0)&0xf0;
temp1=(~temp1)&0x0f;
temp0=temp0|temp1;
switch (temp0)
{
case 0x11: keyvalue=0;break;
case 0x21: keyvalue=1;break;
case 0x41: keyvalue=2;break;
case 0x81: keyvalue=3;break;
case 0x12: keyvalue=4;break;
case 0x22: keyvalue=5;break;
case 0x42: keyvalue=6;break;
case 0x82: keyvalue=7;break;
case 0x14: keyvalue=8;break;
case 0x24: keyvalue=9;break;
case 0x44: keyvalue=10;break;
case 0x84: keyvalue=11;break;
case 0x18: keyvalue=12;break;
case 0x28: keyvalue=13;break;
case 0x48: keyvalue=14;break;
case 0x88: keyvalue=15;break;
default : keyvalue=0xff;break;
}
return keyvalue;
}
void Init_Timer0()
{
EA=1; //开启总中断
ET0=1; //开定时器0中断
TMOD=0X01; //定时器0工作与16位的模式一
TH0=0X77; //定时10MS
TL0=0Xff;
TR0=1; //定时器0开启
TR1=1; //定时器1开启
}
void Key()
{
P2=0xf0;
temp0=P2;
if(temp0!=0xf0)
{
Delay(9);
P2=0xf0;
temp0=P2;
if(temp0!=0xf0)
{
P2=0x0f;
temp1=P2;
keyvalue=Keyscan();
}
}
}
void Score()
{
uchar baiwei,shiwei,gewei;
gewei=score1%10;
shiwei=(score1/10)%10;
baiwei=(score1/100);
LCD_set_XY(60,4);
LCD_write_char(baiwei+48);
LCD_write_char(shiwei+48);
LCD_write_char(gewei+48);
}
void Cancel_Line()
{
uchar i,z;
uint16 j=0;
if(NewBlock) //一个方块下落完毕
{
for(i=0;i<16;i++)
{
if(Map[i]==0xffff)
{j=j|1;j=1;score1++;}
}
if(j!=0)
{
for(i=1;i<16;i++)
{
if(Map[i]==0xffff)
{
for(z=i;z>0;z--)
{
Map[z]=Map[z-1];
}
}
}
for(i=0;i<16;i++)
{
Black_Ground[i]=0;
Black_Ground[i]=Black_Ground[i]|Map[i];
}
LCD_write_CMD(0x20); // 使用基本命令,采用水平模式
Score();
LCD_write_CMD(0x22); // 使用基本命令,采用垂直模式
LCD_DrawBlackGround();
}
}
}
void Next()
{
uchar i;
uint16 next,temp0,temp1;
next=Pic[I1][J1];
LCD_write_CMD(0x22);
LCD_set_XY(62,1);
for(i=0;i<4;i++)
{
if(next&(0x8000>>i))
{temp0=0x000e;temp1=0x000a;}
else {temp0=0;temp1=0;}
if(next&(0x0800>>i))
{temp0=temp0|0x0070;temp1=temp1|0x0050;}
else {temp0=temp0|0;temp1=temp1|0;}
if(next&(0x0080>>i))
{temp0=temp0|0x0380;temp1=temp1|0x0280;}
else {temp0=temp0|0;temp1=temp1|0;}
if(next&(0x0008>>i))
{temp0=temp0|0x5c00;temp1=temp1|0x5400;}
else {temp0=temp0|0x2000;temp1=temp1|0x2000;}
LCD_write_Data((uchar)temp0);
LCD_write_Data((uchar)(temp0>>8));
LCD_set_XY(63+i*3,1);
LCD_write_Data((uchar)temp1);
LCD_write_Data((uchar)(temp1>>8));
LCD_set_XY(64+i*3,1);
LCD_write_Data((uchar)temp0);
LCD_write_Data((uchar)(temp0>>8));
LCD_set_XY(65+i*3,1);
}
}
void Pause()
{
Key();
if(keyvalue==12)
{
LCD_write_CMD(0x20); // 使用基本命令,采用水平模式
LCD_write_english_string(10,2,"PAUSE!");
Delay(250);
keyvalue=0xff;
while(1)
{
Key();
if(keyvalue==12)
{keyvalue=0xff;break;}
}
LCD_write_CMD(0x22); // 使用基本命令,采用垂直模式
}
}
/////////////////////////////////////////////////////////
/////////////////游戏结束
/*void Game_Over()
{
if(Attack_Block())
{
LCD_write_CMD(0x20); // 使用基本命令,采用水平模式
//LCD_write_CMD(0x0d); // 设定显示模式,c正常显示,d反白显示
LCD_write_english_string(13,2,"GAME");
LCD_write_english_string(12,3,"OVER!");
while(1); //游戏结束,不再运行
}
}*/
/////////////////////////////////////////////////////////
/////////////////游戏结束
void Game_Over()
{
if(NewBlock)
{
if(Block_Y==0)
{
LCD_write_CMD(0x20); // 使用基本命令,采用水平模式
LCD_write_english_string(13,2,"GAME");
LCD_write_english_string(12,3,"OVER!");
LCD_write_CMD(0x0d); // 设定显示模式,c正常显示,d反白显示
while(1); //游戏结束,不再运行
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -