📄 zhuoxiaoji.c
字号:
#include"..\ucos-ii\includes.h" /* uC/OS interface */#include "..\ucos-ii\add\osaddition.h"#include <string.h>#include <math.h>#include <stdlib.h>//记录9个格子的位置structRECT Rect[9];structRECT *pRect[9];//记录一些相关位置,StepRect位置显示游戏等级,CountRect位置显示总共出现的小鸡的数目//CatchRect位置显示抓到的小鸡的数目,ScoreRect位置显示当前的分数u8 StepRectX,StepRectY,TotalCountRectX,TotalCountRectY;u8 CatchCountRectX,CatchCountRectY,ScoreRectX,ScoreRectY;u8 Step; //游戏等级u8 TotalCount; //总共出现的小鸡的数目u8 CatchCount; //抓到的小鸡的数目u8 Score; //游戏当前的分数u8 CurrentPos; //小鸡当前正在哪一个格子中BOOLEAN gameover,pause;BOOLEAN gamepass;BOOLEAN initfinished;//记录初始化是否完成,用于协调多个任务,确保其它任务在主任务初始化结束后再开始工作PDC pdc;//绘图用的DCchar bmp_hitchick[12]={'1','4','5','_','8','0',' ',' ','B','M','P',0}; //击中小鸡的图片char bmp_misschick[12]={'1','4','5','_','8','1',' ',' ','B','M','P',0}; //没有击中小鸡的图片char bmp_gameend[12]={'1','4','5','_','9','0',' ',' ','B','M','P',0}; //游戏通关的图片char bmp_logo[12]={'1','4','5','_','5','9',' ',' ','B','M','P',0}; //登录图片char bmp_gamepass[12]={'1','4','5','_','7','0',' ',' ','B','M','P',0}; //游戏过关图片char bmp_gameover[12]={'1','4','5','_','7','1',' ',' ','B','M','P',0}; //游戏结束图片char bmp_frame[12]={'1','2','7','_','3','9',' ',' ','B','M','P',0}; char bmp_chick[12]={'1','2','7','_','3','5',' ',' ','B','M','P',0}; char bmp_gamepause[12]={'1','2','7','_','3','7',' ',' ','B','M','P',0};char bmp_empty[12]={'1','2','7','_','4','0',' ',' ','B','M','P',0}; ///******************任务定义***************///OS_STK Main_Stack[STACKSIZE*8]={0, }; //Main_Task堆栈void Main_Task(void *Id); //Main_Task,主要对一些变量进行初始化#define Main_Task_Prio 12 //Main_Task的优先级OS_STK Led_Flash_Stack[STACKSIZE]= {0, }; //LED闪烁任务堆栈void Led_Flash_Task(void *Id); //LED闪烁任务#define Led_Flash_Prio 60 //LED闪烁任务的优先级OS_STK Display_Task_Stack[STACKSIZE*8]={0, }; //Display_Task堆栈void Display_Task(void *Id); //Display_Task,主要实时更新LCD屏幕的显示#define Display_Task_Prio 20 //Display_Task任务的优先级/**************已经定义的OS任务*************#define SYS_Task_Prio 1#define Touch_Screen_Task_Prio 9#define Main_Task_Prio 12#define Key_Scan_Task_Prio 58#define Lcd_Fresh_prio 59#define Led_Flash_Prio 60***************************************////////////*****************事件定义*****************///OS_EVENT *Nand_Rw_Sem; //Nand_Flash读写控制权旗语//and you can use it as folloeing:// Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件//// OSSemPend(Nand_Rw_Sem,0,&err);// OSSemPost(Nand_Rw_Sem);OS_EVENT *Uart_Rw_Sem; //Uart读写控制权旗语//and you can use it as folloeing:// Uart_Rw_Sem=OSSemCreate(1); //创建Uart读写控制权旗语,初值为1满足互斥条件//// OSSemPend(Uart_Rw_Sem,0,&err);// OSSemPost(Uart_Rw_Sem);//////////////////////////////////////////////////////////void Led_Flash_Task(void *Id)//指示RTOS处于正常工作中{ unsigned char led_state; Uart_Printf(0,"\n10"); for (;;) { Led_Display(led_state); led_state=~led_state; OSTimeDly(250); }}//Led_Flash_Taskvoid initOSGUI() //初始化操作系统的图形界面{ structRECT rect; initOSMessage(); initOSList(); initOSDC(); initOSCtrl(); initOSFile();}/////////////////////////////////////////////////////// Main function. //////////////////////////////////////////////////////int Main(int argc, char **argv){ ARMTargetInit(); // do target (uHAL based ARM system) initialisation // OSInit(); // needed by uC/OS-II // uHALr_ResetMMU(); LCD_Init(); //初始化LCD模块 LCD_printf("LCD initialization is OK\n"); LCD_printf("240 x 128 Text Mode\n"); LoadFont(); //加载字体 LoadConfigSys();//加载配置文件 // create the tasks in uC/OS and assign increasing // // priorities to them so that Task3 at the end of // // the pipeline has the highest priority. // LCD_printf("Create task on uCOS-II...\n"); OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[STACKSIZE*8-1], Main_Task_Prio); OSTaskCreate(Led_Flash_Task, (void *)0, (OS_STK *)&Led_Flash_Stack[STACKSIZE-1], Led_Flash_Prio ); OSTaskCreate(Display_Task,(void *)0, (OS_STK *)&Display_Task_Stack[STACKSIZE-1], Display_Task_Prio); OSAddTask_Init();//创建一些缺省任务,包括键盘任务、触摸屏任务等 LCD_printf("Starting uCOS-II...\n"); LCD_printf("Entering graph mode...\n"); LCD_ChangeMode(DspGraMode); initOSGUI(); InitRtc(); Nand_Rw_Sem=OSSemCreate(1); //创建Nand-Flash读写控制权旗语,初值为1满足互斥条件// OSStart(); // start the game // // never reached // return 0;}//main////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////void PauseGame(){ if(gameover == FALSE) { pause = !(pause); { ShowBmp(pdc,bmp_frame, 0, 0); } }}//////////////////////////////////////////////////////////////////////////////void RestartGame(){ gameover = FALSE; pause = FALSE; gamepass = FALSE; Step = 1; TotalCount = 0; CatchCount = 0; Score = 0; CurrentPos = 100; ShowBmp(pdc,bmp_frame, 0, 0);}////////////////////////////////////////////////////////////////////////////////void StartNextGame(){ if (Step == 5) { ShowBmp(pdc,bmp_gameend, 41, 95);//显示游戏通关图片 gameover = TRUE; gamepass = FALSE; Step = 1; } else { gameover = FALSE; pause = FALSE; gamepass = FALSE; Step++; TotalCount = 0; CatchCount = 0; CurrentPos = 100; ShowBmp(pdc,bmp_frame, 0, 0); }} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////void onKey(int nkey, int fnkey){ switch(nkey) { case 0://key 1 -- choose grid1 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 1) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[0].left, Rect[0].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[0].left, Rect[0].top);//显示没有抓住小鸡的图片 } } return; case 1://key 2 -- choose grid2 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 2) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[1].left, Rect[1].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[1].left, Rect[1].top);//显示没有抓住小鸡的图片 } } return; case 2://key 3 -- choose grid3 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 3) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[2].left, Rect[2].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[2].left, Rect[2].top);//显示没有抓住小鸡的图片 } } return; case 4://key 4 -- choose grid4 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 4) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[3].left, Rect[3].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[3].left, Rect[3].top);//显示没有抓住小鸡的图片 } } return; case 5://key 5 -- choose grid5 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 5) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[4].left, Rect[4].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[4].left, Rect[4].top);//显示没有抓住小鸡的图片 } } return; case 6://key 6 -- choose grid6 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 6) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[5].left, Rect[5].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[5].left, Rect[5].top);//显示没有抓住小鸡的图片 } } return; case 8://key 7 -- choose grid7 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 7) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[6].left, Rect[6].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[6].left, Rect[6].top);//显示没有抓住小鸡的图片 } } return; case 9://key 8 -- choose grid8 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 8) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[7].left, Rect[7].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[7].left, Rect[7].top);//显示没有抓住小鸡的图片 } } return; case 10://key 9 -- choose grid9 if ( (gameover!=TRUE)&&(pause!=TRUE) ) { if (CurrentPos == 9) { CatchCount++; Score+=5; ShowBmp(pdc,bmp_hitchick,Rect[8].left, Rect[8].top);//显示抓住小鸡的图片 } else { ShowBmp(pdc,bmp_misschick, Rect[8].left, Rect[8].top);//显示没有抓住小鸡的图片 } } return; case 11://key 确定 -- New Game if (gamepass == FALSE) RestartGame(); else StartNextGame(); return; case 15://key 取消 -- Pause Game PauseGame(); return; default: return; }}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////void Main_Task(void *Id) //Main_Test_Task{ POSMSG pMsg; Wnd MainWindow; PWnd pMainWindow; structRECT MainwinRect; structRECT* pMainwinRect; char Main_Wnd_Caption_8[]="Catch Chick"; U16 Main_Wnd_Caption_16[20]; initfinished = FALSE; gameover = FALSE; pause = FALSE; gamepass = FALSE; Step = 1; TotalCount = 0; CatchCount = 0; Score = 0; CurrentPos = 100; pMainWindow=&MainWindow; pMainwinRect = &MainwinRect; MainwinRect.bottom = 235; MainwinRect.left = 1; MainwinRect.right = 320; MainwinRect.top = 5; pRect[0] = &Rect[0]; Rect[0].bottom = 81; Rect[0].left = 19; Rect[0].right = 66; Rect[0].top = 28; pRect[1] = &Rect[1]; Rect[1].bottom = 81; Rect[1].left = 85; Rect[1].right = 132; Rect[1].top = 28; pRect[2] = &Rect[2]; Rect[2].bottom = 81; Rect[2].left = 152; Rect[2].right = 199; Rect[2].top = 28; pRect[3] = &Rect[3]; Rect[3].bottom = 148; Rect[3].left = 19; Rect[3].right = 66; Rect[3].top = 95; pRect[4] = &Rect[4]; Rect[4].bottom = 148; Rect[4].left = 85; Rect[4].right = 132; Rect[4].top = 95; pRect[5] = &Rect[5]; Rect[5].bottom = 148; Rect[5].left = 152; Rect[5].right = 199; Rect[5].top = 95; pRect[6] = &Rect[6]; Rect[6].bottom = 212; Rect[6].left = 19; Rect[6].right = 66; Rect[6].top = 159; pRect[7] = &Rect[7]; Rect[7].bottom = 212; Rect[7].left = 85; Rect[7].right = 132; Rect[7].top = 159; pRect[8] = &Rect[8]; Rect[8].bottom = 212; Rect[8].left = 152; Rect[8].right = 199; Rect[8].top = 159; StepRectX = 255; StepRectY = 50; TotalCountRectX = 255; TotalCountRectY = 96; CatchCountRectX = 255; CatchCountRectY = 139; ScoreRectX = 255; ScoreRectY = 179; pdc = CreateDC(); ClearScreen();//清屏 ShowBmp(pdc,bmp_logo, 1, 1);//显示登录图片 OSTimeDly(2000);//使显示持续一段时间 ClearScreen();//清屏 strChar2Unicode(Main_Wnd_Caption_16, Main_Wnd_Caption_8); pMainWindow =CreateWindow(120, pMainwinRect, FONTSIZE_SMALL,WND_STYLE_MODE, Main_Wnd_Caption_16, NULL); DrawWindow(pMainWindow); ClearScreen(); ShowBmp(pdc,bmp_frame, 0, 0); initfinished = TRUE;//初始化部分结束 while(1) { pMsg = WaitMessage(0); switch (pMsg->Message) { case OSM_KEY: onKey(pMsg->WParam, pMsg->LParam); } DeleteMessage(pMsg); OSTimeDly(50); } DestoryDC(pdc);} ///////// Display_Task /////////////void Display_Task(void *Id){ // int tempi; U16 tempstr[20]; //判断主任务的初始化部分是否完成,如果完成则继续下面的显示工作,否则不再继续向下执行,交出CPU使用权 if (initfinished == FALSE) OSTimeDly(2000); while(1) { if (gameover == TRUE) { OSTimeDly(4000*1-700*Step); continue; } else if (pause == TRUE) { ShowBmp(pdc,bmp_gamepause, 41, 95);//显示游戏暂停图片 OSTimeDly(4000*1-700*Step); continue; } else { for(tempi=0;tempi<9;tempi++) FillRect2(pdc, pRect[tempi], GRAPH_MODE_NORMAL, RGB(255, 255, 255)); CurrentPos = rand()%9;//产生一个0-8之间的随机整数 ShowBmp(pdc,bmp_chick, Rect[CurrentPos].left, Rect[CurrentPos].top);//在制定的框中显示小鸡 TotalCount++; CurrentPos++; Int2Unicode(Step,tempstr); TextOut(pdc, StepRectX, StepRectY, tempstr, TRUE, FONTSIZE_SMALL); Int2Unicode(TotalCount,tempstr); TextOut(pdc, TotalCountRectX, TotalCountRectY, tempstr, TRUE, FONTSIZE_SMALL); Int2Unicode(CatchCount,tempstr); TextOut(pdc, CatchCountRectX, CatchCountRectY, tempstr, TRUE, FONTSIZE_SMALL); Int2Unicode(Score,tempstr); TextOut(pdc, ScoreRectX, ScoreRectY, tempstr, TRUE, FONTSIZE_SMALL); if (TotalCount >= 20) { gameover = TRUE; if (CatchCount >= 10) { gamepass = TRUE; ShowBmp(pdc,bmp_gamepass, 41, 95);//显示游戏过关图片 } else { ShowBmp(pdc,bmp_gameover, 41, 95);//显示游戏结束图片 } } OSTimeDly(4000*1-700*Step); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -