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

📄 function.c

📁 51+3310做的俄罗斯方块
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -