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

📄 ptgame.c

📁 STM32不完全手册 例程源码 29个
💻 C
📖 第 1 页 / 共 2 页
字号:
		if(Is_In_Area(5+Xscal*t,5+Xscal*ytemp,Xscal,Xscal))return t+ytemp*PT_Size+1;
	}    
	if(PT_Size==3&&Is_In_Area(159,236,77,77))return 10;
	else if(PT_Size==4&&Is_In_Area(179,237,58,77))return 17;
	else if(PT_Size==5&&Is_In_Area(188,234,46,46))return 26;
	return 0;//按键无效
} 				    
//显示数据
//显示步骤和时间	 
void PTGame_Show_Msg(void)
{
	POINT_COLOR=RED;//画笔颜色
	BACK_COLOR=LGRAY;	   
	LCD_ShowNum(121,258,PT_Step,4,16);//显示步数
	LCD_ShowNum(121,274,PT_Time,4,16);//显示时间	  		  
}
//获得RTC内的秒钟计数器	
u32 Get_PTG_Time(void)
{
	u32 temp;
	temp=RTC->CNTH;
	temp<<=16;
	temp=RTC->CNTL;  
	return temp; 
}
//拼图游戏胜利时的界面
//包括是否创纪录检查    
void PTG_Win_Msg(void)
{		   
	u8 BEST=0;
	u16 timex,stepx;  
	u16 minx=0;	 
	u8 tkey;  
	//开始判断是不是创纪录了
	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;//时间相等,步数较少,也破纪录
	 
	LCD_Fill(40,80,200,160,GRAY);//填充空白域
	POINT_COLOR=BROWN;
	LCD_DrawRectangle(39,79,201,161);//画空的方框
	LCD_DrawRectangle(40,80,200,160);//画空的方框
	LCD_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,"创记录了!",16,160);//叠加模式,非自动换行						 
	}
	else Show_Str_Mid(40,82,"恭喜过关!",16,160);//叠加模式,非自动换行
	POINT_COLOR=BLACK;	
	Show_Str(44,100,"您的成绩:",16,0X01);//叠加模式,非自动换行
	Show_Str(44,118,"步数:",16,0X01);//叠加模式,非自动换行	  
	Show_Str(124,118,"时间:",16,0X01);//叠加模式,非自动换行
	POINT_COLOR=RED;
	LCD_ShowNum(84,118,PT_Step,4,16);//显示步数
	LCD_ShowNum(164,118,PT_Time,4,16);//显示时间   
	BACK_COLOR=LGRAY;
    Show_Str(104,139,"确定",16,0X00);//叠加模式,非自动换行		   
	POINT_COLOR=BROWN;	   
	LCD_DrawRectangle(104,139,136,155);//画空的方框
	
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	timex=0;
	while(1)//等待按键退出
	{
		tkey=AI_Read_TP(30);
		if(tkey==2)Pen_Point.Key_Reg|=0X80;//标记按键已经按下了 	   
		if(tkey==0&&(Pen_Point.Key_Reg&0X80))//按键松开了
		{
			Pen_Point.Key_Reg=0;
  			if(Is_In_Area(104,139,32,16))return;//确定键被按下了  

		}   
	}
}	
//显示最佳纪录
void PTG_Best_Show(void)
{	
	u8 temp;
	u16 timex,stepx;

    LCD_Clear(WHITE);//清屏
	//顶部 						   
 	LCD_Fill(0,0,239,9,LIGHTBLUE);  //填充底部颜色(浅蓝色)	
 	LCD_Fill(0,10,239,20,GRAYBLUE); //填充底部颜色(灰蓝色)
	//中部
	POINT_COLOR=DARKBLUE;//深蓝色  
	LCD_DrawLine(0,21,239,21);
	LCD_Fill(0,22,239,41,LIGHTBLUE);//填充中部部颜色(浅灰蓝色)
	LCD_DrawLine(0,41,239,41);	    
	//底部
	LCD_DrawLine(0,298,239,298);
 	LCD_Fill(0,299,239,308,LIGHTBLUE);//填充底部颜色(浅蓝色)	
 	LCD_Fill(0,308,239,319,GRAYBLUE);//填充底部颜色(灰蓝色)	 
	//显示标题
	POINT_COLOR=WHITE;
	Show_Str_Mid(0,2,"最佳纪录",16,240); //叠加模式,非自动换行 
	Show_Str(5,300,"确定",16,0x01);   //叠加模式,非自动换行
    //显示信息	   
	POINT_COLOR=RED;
	Show_Str_Mid(0,50,"简单",16,240);   
	Show_Str_Mid(0,114,"一般",16,240); 
	Show_Str_Mid(0,178,"困难",16,240); 
		  
	LCD_Fill(0,74,239,106,LGRAY);   //填充颜色
	LCD_Fill(0,138,239,170,LGRAY);  //填充颜色
	LCD_Fill(0,202,239,234,LGRAY);  //填充颜色
	
	BACK_COLOR=LGRAY;//假定没有选中,原背景 
	POINT_COLOR=DARKBLUE;    
	for(temp=0;temp<3;temp++)
	{
		Show_Str(32,82+temp*64,"步数:",16,0x01);   //叠加模式,非自动换行 
		Show_Str(136,82+temp*64,"时间:",16,0x01);  //叠加模式,非自动换行 
	}
	POINT_COLOR=RED; 
	for(temp=0;temp<3;temp++)
	{
		Read_PTG_Best(temp,&stepx,&timex);//读取最佳值	 
		LCD_ShowNum(72,82+temp*64,stepx,4,16);//显示步数
		LCD_ShowNum(176,82+temp*64,timex,4,16);//显示时间 	   
	}
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	temp=0;
	while(1)//等待按键退出
	{
		temp=AI_Read_TP(30);
		if(temp==2)Pen_Point.Key_Reg|=0X80;//标记按键已经按下了 	   
		if(temp==0&&(Pen_Point.Key_Reg&0X80))//按键松开了
		{
			Pen_Point.Key_Reg=0;
  			if(Is_In_Area(0,300,40,20))return;//确定键被按下了  

		}   	    
	}	  						   	   
}   
//玩拼图游戏									   
void PTGame_Play(void)
{
	u8 key,temp;
	u8 size;		  
	u32 game_time;		    

	//首先得到游戏的图片文件
	temp=SysInfoGet(0x80+PT_Size);//查找图片
	if(temp)
	{
	    LCD_Clear(WHITE);//清屏  		  
		POINT_COLOR=RED;
		Show_Str_Mid(0,144,"拼图游戏数据丢失",16,240); //叠加模式,非自动换行
		Show_Str_Mid(0,160,"请检查系统文件的完整性!",16,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();//得到时间
	key=0;		  
	PTGame_Show_Msg();//显示时间,步数  
	Pen_Point.Key_Sta=Key_Up;//释放显示期间的触发 
	while(1)//等待按键
	{
		key=AI_Read_TP(30);	    
		if(key)Pen_Point.Key_Reg|=0X80;  //标记按键已经按下了(不管是滑动还是顶点) 	   
		if(key==0&&(Pen_Point.Key_Reg&0X80))//按键松开了
		{
			Pen_Point.Key_Reg=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++;//时间增加
			LED0=!LED0;//LED闪烁
			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 + -