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

📄 ptgame.c

📁 多功能MP3代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	POINT_COLOR=RED;//画笔颜色
	BACK_COLOR=WHITE;	   
	TFT_ShowNum(121,258,PT_Step,4,16,0x00);//显示步数
	TFT_ShowNum(121,274,PT_Time,4,16,0x00);//显示时间	  		  
}
//获得RTC内的秒钟计数器	
u32 Get_PTG_Time(void)
{
	u32 temp;
	temp=RTC->CNTH;
	temp<<=16;
	temp=RTC->CNTL;  
	return temp; 
}
//拼图游戏胜利时的界面
//包括是否创纪录检查
//CHECK OK 09/05/30
void PTG_Win_Msg(void)
{		   
	u8 BEST=0;
	u16 timex,stepx;  
	u16 minx=0;	   
	//开始判断是不是创纪录了
	Read_PTG_Best(PT_Size-3,&stepx,&timex);//读取该级别的最纪录	
	if(timex==0)BEST=1;				       //第一次
	if(timex<stepx)minx=timex;			   //去最小的值
	else minx=stepx;      
	if(PT_Time<minx||PT_Step<minx)BEST=1;//时间/步数小于先前最佳值,记录被破  
	else if(PT_Time==timex&&PT_Step<stepx)BEST=1;//时间相等,步数较少,也破纪录
	 
	TFT_Fill(40,80,200,160,GRAY);//填充空白域
	POINT_COLOR=BROWN;
	TFT_DrawRectangle(39,79,201,161);//画空的方框
	TFT_DrawRectangle(40,80,200,160);//画空的方框
	TFT_DrawRectangle(41,81,199,159);//画空的方框	 
	BACK_COLOR=GRAY;
	POINT_COLOR=RED;
	if(BEST)
	{	
		Save_PTG_Best(PT_Size-3,PT_Step,PT_Time);//保存最佳纪录
		Show_Str_Mid(40,82,"创记录了!",0X01,160);//叠加模式,非自动换行						 
	}
	else Show_Str_Mid(40,82,"恭喜过关!",0X01,160);//叠加模式,非自动换行
	POINT_COLOR=BLACK;	
	Show_Str(44,100,"您的成绩:",0X01);//叠加模式,非自动换行
	Show_Str(44,118,"步数:",0X01);//叠加模式,非自动换行	  
	Show_Str(124,118,"时间:",0X01);//叠加模式,非自动换行
	POINT_COLOR=RED;
	TFT_ShowNum(84,118,PT_Step,4,16,0x00);//显示步数
	TFT_ShowNum(164,118,PT_Time,4,16,0x00);//显示时间   
	BACK_COLOR=LGRAY;
    Show_Str(104,139,"确定",0X00);//叠加模式,非自动换行		   
	POINT_COLOR=BROWN;	   
	TFT_DrawRectangle(104,139,136,155);//画空的方框
	
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	timex=0;
	while(1)//等待按键退出
	{
		if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)timex=Touch_Key_Pro(1);//得到按键值	  
		if(PEN)//按键松开了,状态改变(状态机)
		{
			Pen_Point.Key_LSta=1;	 
			Pen_Point.Key_Sta=Key_Up;
		}   
		if(timex&CLICK_POINT) //有单点按键按下
		{  	 
			Pen_Point.Key_LSta=0;	
			if(Is_In_Area(104,139,136,155))return;//确定键被按下了  
			timex=0;
		}
	}
}	
//显示最佳纪录
void PTG_Best_Show(void)
{	
	u8 temp;
	u16 timex,stepx;												  
    TFT_CLEAR(WHITE);//清屏  
	TFT_Fill(0,0,239,20,Bro_TOP);   //填充顶部颜色
	TFT_Fill(0,21,239,41,Bro_MID);  //填充中部部颜色
	TFT_Fill(0,298,239,319,Bro_BTM);//填充底部颜色	
	//显示标题
	POINT_COLOR=RED;
	Show_Str_Mid(0,2,"最佳纪录",0x01,240); //叠加模式,非自动换行 
	Show_Str(5,300,"确定",0x01);   //叠加模式,非自动换行
    //显示信息	   
	POINT_COLOR=BLUE;
	Show_Str_Mid(0,50,"简单",0x01,240);   
	Show_Str_Mid(0,114,"一般",0x01,240); 
	Show_Str_Mid(0,178,"困难",0x01,240); 
		  
	TFT_Fill(0,74,239,106,LGRAY);   //填充颜色
	TFT_Fill(0,138,239,170,LGRAY);  //填充颜色
	TFT_Fill(0,202,239,234,LGRAY);  //填充颜色
	
	BACK_COLOR=LGRAY;//假定没有选中,原背景 
	POINT_COLOR=BLUE;    
	for(temp=0;temp<3;temp++)
	{
		Show_Str(32,82+temp*64,"步数:",0x01);   //叠加模式,非自动换行 
		Show_Str(136,82+temp*64,"时间:",0x01);  //叠加模式,非自动换行 
	}
	POINT_COLOR=BLACK; 
	for(temp=0;temp<3;temp++)
	{
		Read_PTG_Best(temp,&stepx,&timex);//读取最佳值	 
		TFT_ShowNum(72,82+temp*64,stepx,4,16,0x00);//显示步数
		TFT_ShowNum(176,82+temp*64,timex,4,16,0x00);//显示时间 	   
	}
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	temp=0;
	while(1)//等待按键退出
	{
		if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)temp=Touch_To_Num(4);//得到按键值  
		if(PEN)//按键松开了,状态改变(状态机)
		{
			Pen_Point.Key_LSta=1;	 
			Pen_Point.Key_Sta=Key_Up;
		}   
		if(temp) //有单点按键按下
		{  	
			Pen_Point.Key_LSta=0;
			if(temp==9)break;//确定按键按下了
			temp=0; 
		}
	}	  						   	   
}   
//玩拼图游戏									   
void PTGame_Play(void)
{
	u8 key,temp;
	u8 size;		  
	u32 game_time;		    

	//首先得到游戏的图片文件
	temp=SysInfoGet(0x80+PT_Size);//查找图片
	if(temp==0)
	{
	    TFT_CLEAR(WHITE);//清屏  		  
		POINT_COLOR=RED;
		Show_Str_Mid(0,144,"拼图游戏数据丢失",0x01,240); //叠加模式,非自动换行
		Show_Str_Mid(0,160,"请检查系统文件的完整性!",0x01,240); //叠加模式,非自动换行
		delay_ms(1500);
		return;
	}			    		 
	//第一步要得到缩放因子
	if(PT_Size==3)Xscal=77;
	else if(PT_Size==4)Xscal=58;
	else if(PT_Size==5)Xscal=46;    
	size=PT_Size*PT_Size; 
	if(PT_New)
	{
		PT_Time=0;//时间清空
		PT_Step=0;//步数清空		
		PT_Map_Init();//需要重新打乱图片
	}else Read_PTG_Info(PT_TABLE);//读取列表信息		 

	Load_Game_ICO(PT_Size);//装载X*X界面
	Load_Game_PIC();//装载图片
	//得到游戏开始时间
	game_time=Get_PTG_Time();//得到时间
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	key=0;		  
	PTGame_Show_Msg();//显示时间,步数  
	while(1)//等待按键
	{
		if((Pen_Point.Key_Sta==Key_Down||NPEN)&&Pen_Point.Key_LSta)key=Touch_Key_Pro(1);//得到按键值	  
		if(PEN)//按键松开了,状态改变(状态机)
		{
			Pen_Point.Key_LSta=1;	 
			Pen_Point.Key_Sta=Key_Up;
		}   
		if(key&CLICK_POINT) //有单点按键按下
		{  	 
			Pen_Point.Key_LSta=0;	
			key=PTGame_Key_To_Num();  
			 
			if(key==0XFF)
			{
				PT_New=0;//游戏没有结束,下次可以不更新
				Save_PTG_Info(PT_BASIC);//保存基本信息
				Save_PTG_Info(PT_TABLE);//保存列表信息
				return;//选择了退出	 
			}else
			{
				key-=1;//返回值为1~10,减少1,匹配
				temp=Need_Move(key);//级别1		  
				if(temp<=size)
				{
					Move_Pic(key,temp);//把key那里的图片,调换到temp那里
					PT_Step++;         //步骤增加
					PTGame_Show_Msg(); //显示时间,步数   
					if(PT_Win_Chk())//游戏结束,拼图成功了
					{								 	 
						PT_New=1;//游戏结束,下次必须更新
						Save_PTG_Info(PT_BASIC);//保存基本信息
						PTG_Win_Msg();//成功时的界面现实
						return; 
					}
				}
			}
			key=0;
		}
		if(game_time!=Get_PTG_Time())//秒钟增加了1s
		{
			game_time=Get_PTG_Time();
			PT_Time++;//时间增加
			PTGame_Show_Msg();//显示时间,步数
		}
	}	 
}	    
//游戏 界面
void Game_Play(void)
{			    
	u8 selx=0;	 
	while(1)
	{
		selx=Load_Fun_Sel(PTGmenu_F1,"游戏选择","确定",1,0);
		if(selx==8)return;//返回
		else if(selx==0)//选中了拼图游戏,暂时只有这一个游戏
		{
		 	Read_PTG_Info(PT_BASIC);//读取基本信息
			if(PT_Size>5||PT_Size<3)//信息非法,重新保存信息
			{
				PT_Size=3;PT_New=0;
				PT_Step=0;PT_Time=0;
				Save_PTG_Info(PT_BASIC);//保存基本信息	   
				for(selx=0;selx<26;selx++)Cur_Table[selx]=0;
				Save_PTG_Info(PT_TABLE);//保存图标信息
				Save_PTG_Best(0,0,0);
				Save_PTG_Best(1,0,0);
				Save_PTG_Best(2,0,0);
			}else if(!PT_New)Read_PTG_Info(PT_TABLE);//读取图标信息

			while(1)
			{	    
				if(PT_New)selx=Load_Fun_Sel(PTGmenu_S1+1,"拼图游戏","确定",3,0);//不显示继续按钮
				else selx=Load_Fun_Sel(PTGmenu_S1,"拼图游戏","确定",4,0);//显示继续按钮
				if(selx==8)break;//返回上一层目录
				if(PT_New)selx+=1;//偏移一下
				switch(selx)
				{
					case 0://选择了继续
						PTGame_Play();
						break;
					case 1://选择了新游戏
						PT_New=1;//
						PTGame_Play();
						break;
					case 2://最佳排行
						PTG_Best_Show();
						break;
					case 3://难度设置
						selx=Load_Fun_Sel(PTGmenu_S2,"难度选择","确定",3,PT_Size-3);//选择难度
						if(selx<3)//选中了有效按键
						{
							PT_Size=3+selx; 				
							PT_New=1;//必须要更新随机序列 
						}
						break;
				}
			}
		}	 
	} 
}






























⌨️ 快捷键说明

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