1、嵌入式程序设计打地鼠游戏设计2021年4月29日1开发背景打地鼠是一款常见的小游戏,简单有趣,深受人们的喜爱,本项目作为基于嵌入式WinCE课程设计和简单游戏编程而提出。希望通过开发打地鼠游戏,了解并掌握WinCE软件开发工具的使用,同时提高嵌入式设计的能力。2功能描述基本功能:地鼠随机出现在地图上,跟据鼠标点击事件捕获鼠标指针所在区域是否出现地鼠来判断玩家是否击中地鼠,玩家有10次失误机会。3.基本原理玩家触发游戏后,地鼠会随机出现在地图上,玩家通过鼠标击打地鼠,地鼠每隔一段时间机会随机出现在地图某一块,若玩家反映不及没有触发鼠标事件,地鼠随机出现别的地方玩家分数不变;若已触发鼠标事件且没有
2、击中地鼠,玩家分数减少;击中则分数增加。系统流程图:(主要部分的流程图)4.系统总体设计4.1界面设计本系统设计了三个界面,一个是游戏运行界面,一个是成绩保存,一个历史最高纪录显示界面(玩家成绩)。4.2 相关变量定义int scorce;/得分int randx=0,randy=0;/随机得到的地鼠坐标int Total=10;/若有Total次击不中则游戏结束typedef struct TCHAR name20;/姓名 int score;/成绩User;4.3 内部类定义及方法说明void ReadScoreFile();/读取历史分数记录void WriteScoreFile();/
3、将玩家的游戏分数写到文件中void SortList();/对玩家分数排序void InitData();/初始化数据void EndGame();/游戏结束void clearPicture(); /还原背景图void drawPicture(int bmpNum);/画图void chilkTrue(int x,int y);/判定是否击中 BOOL CDadishuDlg:OnInitDialog()游戏初始化函数。void CMengSnakeDlg:OnTimer(UINT nIDEvent)计时器函数,自动根据时间变量来执行程序,随机为地鼠生成一个坐标,并绘制到地图上。void C
4、DadishuDlg:OnLButtonDown(UINT nFlags, CPoint point)消息处理函数,鼠标左键点击触发,主要用来打击地鼠。void CDadishuDlg:OnPaint() 重绘函数,实现地图区域的绘制游戏界面部分相关代码:OOL CDadishuDlg:OnInitDialog() CDialog:OnInitDialog(); / Set the icon for this dialog. The framework does this automatically / when the applications main window is not a di
5、alog SetIcon(m_hIcon, TRUE); / Set big icon SetIcon(m_hIcon, FALSE); / Set small icon CenterWindow(GetDesktopWindow(); / center to the hpc screen / TODO: Add extra initialization here HWND hwndCB; hwndCB = CommandBar_Create(AfxGetInstanceHandle(), GetSafeHwnd(),0); CommandBar_InsertMenubar(hwndCB, A
6、fxGetInstanceHandle(), IDR_MENU1, 0); return TRUE; / return TRUE unless you set the focus to a control/还原背景图void CDadishuDlg:clearPicture() PDC = GetDC(); CDC bmpDC; bmpDC.CreateCompatibleDC(PDC); CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP3); BITMAP bm; bmp.GetBitmap(&bm); bmpDC.SelectObject(bmp); int p
7、x=40+randx*80+1; int py=40+randy*80+1; PDC-StretchBlt (px,py,78,78,&bmpDC,0,0,bm.bmWidth, bm.bmHeight,SRCCOPY);/画图void CDadishuDlg:drawPicture(int bmpNum) PDC = GetDC(); CDC bmpDC; bmpDC.CreateCompatibleDC(PDC); CBitmap bmp; if(bmpNum=1) bmp.LoadBitmap(IDB_BITMAP1); else bmp.LoadBitmap(IDB_BITMAP2);
8、 BITMAP bm; bmp.GetBitmap(&bm); bmpDC.SelectObject(bmp); int px=40+randx*80+1; int py=40+randy*80+1; PDC-StretchBlt (px,py,78,78,&bmpDC,0,0,bm.bmWidth, bm.bmHeight,SRCCOPY);/判定是否击中void CDadishuDlg:chilkTrue(int x,int y) int px_min=40+randx*80; int px_max=40+(randx+1)*80; int py_min=40+randy*80; int
9、py_max=40+(randy+1)*80; if(x=px_min&x=py_min&ym_Value=scorce; ts-DoModal(); /void CDadishuDlg:OnPaint() CPaintDC dc(this); / device context for painting / TODO: Add your message handler code here CDC *pDC=new CClientDC(this); CPen pen;/画笔 pen.CreatePen(PS_SOLID,1,RGB(0,0,0); CPen *poldpen=pDC-Select
10、Object(&pen); pDC-Rectangle(40,40,280,280); pDC-SelectObject(poldpen); /new出来的一般都需要delete来回收内存。 delete pDC; / Do not call CDialog:OnPaint() for painting messages/鼠标点击事件void CDadishuDlg:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(!start)
11、return; chilkTrue(point.x,point.y); CDialog:OnLButtonDown(nFlags, point);/void CDadishuDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call default switch(nIDEvent) case 1: clearPicture(); randx=rand()%3; randy=rand()%3; drawPicture(1); break; case 2: m_score=scorce; Upd
12、ateData(FALSE); break; case 3: _time+; char temp10; CString time; int second=_time%60; int minut=_time/60%60; int hour=_time/3600%24; _itoa(hour,temp,10); if(hour9) time+=temp; else time=time+0+temp; _itoa(minut,temp,10); if(minut9) time=time+:+temp; else time=time+:0+temp; _itoa(second,temp,10); if
13、(second9) time=time+:+temp; else time=time+:0+temp; m_time=time; UpdateData(FALSE); break; CDialog:OnTimer(nIDEvent);/初始化数据void CDadishuDlg:InitData() Total=10; start=true; SetTimer(1,timer,NULL); scorce=0; SetTimer(2,100,NULL); _time=0; SetTimer(3,1000,NULL);/void CDadishuDlg:EndGame() KillTimer(1)
14、; KillTimer(2); KillTimer(3); start=false;/重新开始void CDadishuDlg:OnMENUITEMRestart() / TODO: Add your command handler code here EndGame(); InitData();/开始游戏void CDadishuDlg:OnMENUITEMStart() / TODO: Add your command handler code here InitData();/void CDadishuDlg:OnMENUITEMSeachRecord() / TODO: Add you
15、r command handler code here SerachRecord *sr=new SerachRecord; sr-DoModal();保存记录的相关代码:User list11;int UserListLength=0;/ TS message handlersvoid TS:ReadScoreFile() CString filename=scores.dat; HANDLE hFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL)
16、; SetFilePointer(hFile,0,NULL,FILE_BEGIN); User us; DWORD aa; int i=0; do ZeroMemory(&us,sizeof(us); if(ReadFile(hFile,&us,sizeof(us),&aa,NULL) if(aa!=0) listi+=us; while(aa=sizeof(us); UserListLength=i; CloseHandle(hFile);/写到文件里void TS:WriteScoreFile() CString filename=scores.dat; int i; /文件句柄 HAND
17、LE hFile=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); /设置文件开始处 SetFilePointer(hFile,0,NULL,FILE_BEGIN); DWORD aa; /将数据写到文件 for(i=0;iUserListLength&i10;i+) WriteFile(hFile,&listi,sizeof(listi),&aa,NULL); CloseHandle(hFile);/安分数从大到小排序void TS:SortList
18、() int i,j,k; for(i=0;iUserListLength-1;i+) k=i; for(j=i+1;jlistk.score) k=j; if(k!=i) User temp=listk; listk=listi; listi=temp; void TS:OnOK() / TODO: Add extra validation here / TODO: Add extra validation here UpdateData(TRUE); ReadScoreFile(); int i=0; User us; ZeroMemory(&us,sizeof(us); /将值更新到变量
19、 UpdateData(TRUE); wcscpy(us.name,m_UserName); us.score=m_Value; listUserListLength=us; UserListLength+; SortList(); for(i=0;i=10) AfxMessageBox(_T(对不起你的名次最低,没有突破前10名); return; WriteScoreFile(); CDialog:OnOK();查看记录相关代码void SerachRecord:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);
20、/AFX_DATA_MAP(SerachRecord) DDX_Control(pDX, IDC_LIST1, m_list); CRect rt; m_list.GetClientRect(&rt); m_list.InsertColumn(0,_T(名次),LVCFMT_LEFT,(int)(rt.Width()*0.35); m_list.InsertColumn(1,_T(得分),LVCFMT_LEFT,(int)(rt.Width()*0.35); m_list.InsertColumn(2,_T(姓名),LVCFMT_LEFT,(int)(rt.Width()*0.3); /AFX
21、_DATA_MAPBEGIN_MESSAGE_MAP(SerachRecord, CDialog) /AFX_MSG_MAP(SerachRecord) /AFX_MSG_MAPEND_MESSAGE_MAP()/ SerachRecord message handlersvoid SerachRecord:OnOK() / TODO: Add extra validation here m_list.DeleteAllItems(); CString filename=scores.dat; HANDLE hFile=CreateFile(filename,GENERIC_READ,FILE
22、_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); SetFilePointer(hFile,0,NULL,FILE_BEGIN); User us; User usList10; DWORD aa; int i=0; do ZeroMemory(&us,sizeof(us); if(ReadFile(hFile,&us,sizeof(us),&aa,NULL) if(aa!=0) usListi+=us; while(aa=sizeof(us); for(int j=i-1;j=0;j-) m_list.InsertItem(0,_T(test); char temp10; _itoa(j+1, temp, 10); CString num=temp; m_list.SetItemText(0,0,num); m_list.SetItemText(0,2,usListj.name); _itoa(usListj.score, temp, 10); CString sc=temp; m_list.SetItemText(0,1,sc); CloseHandle(hFile); /CDialog:OnOK();5系统测试5.1 运行界面1游戏开始界面2中间游戏进行界面3游戏结束界面4刷新显示记录: