📄 ptgame.c
字号:
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 + -