嵌入式程序设计打地鼠游戏设计.docx
《嵌入式程序设计打地鼠游戏设计.docx》由会员分享,可在线阅读,更多相关《嵌入式程序设计打地鼠游戏设计.docx(17页珍藏版)》请在冰点文库上搜索。
![嵌入式程序设计打地鼠游戏设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/59a151a5-6803-47ed-9129-71492fb900ba/59a151a5-6803-47ed-9129-71492fb900ba1.gif)
嵌入式程序设计打地鼠游戏设计
2021年4月29日
1开发背景
打地鼠是一款常见的小游戏,简单有趣,深受人们的喜爱,本项目作为基于嵌入式WinCE课程设计和简单游戏编程而提出。
希望通过开发《打地鼠》游戏,了解并掌握WinCE软件开发工具的使用,同时提高嵌入式设计的能力。
2功能描述
基本功能:
地鼠随机出现在地图上,跟据鼠标点击事件捕获鼠标指针所在区域是否出现地鼠来判断玩家是否击中地鼠,玩家有10次失误机会。
3.基本原理
玩家触发游戏后,地鼠会随机出现在地图上,玩家通过鼠标击打地鼠,地鼠每隔一段时间机会随机出现在地图某一块,若玩家反映不及没有触发鼠标事件,地鼠随机出现别的地方玩家分数不变;若已触发鼠标事件且没有击中地鼠,玩家分数减少;击中则分数增加。
系统流程图:
(主要部分的流程图)
4.系统总体设计
4.1界面设计
本系统设计了三个界面,一个是游戏运行界面,一个是成绩保存,一个历史最高纪录显示界面(玩家成绩)。
4.2相关变量定义
intscorce;//得分
intrandx=0,randy=0;//随机得到的地鼠坐标
intTotal=10;//若有Total次击不中则游戏结束
typedefstruct{
TCHARname[20];//姓名
intscore;//成绩
}User;
4.3内部类定义及方法说明
voidReadScoreFile();//读取历史分数记录
voidWriteScoreFile();//将玩家的游戏分数写到文件中
voidSortList();//对玩家分数排序
voidInitData();//初始化数据
voidEndGame();//游戏结束
voidclearPicture();//还原背景图
voiddrawPicture(intbmpNum);//画图
voidchilkTrue(intx,inty);//判定是否击中
BOOLCDadishuDlg:
:
OnInitDialog()
游戏初始化函数。
voidCMengSnakeDlg:
:
OnTimer(UINTnIDEvent)
计时器函数,自动根据时间变量来执行程序,随机为地鼠生成一个坐标,并绘制到地图上。
voidCDadishuDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
消息处理函数,鼠标左键点击触发,主要用来打击地鼠。
voidCDadishuDlg:
:
OnPaint()
重绘函数,实现地图区域的绘制
游戏界面部分相关代码:
OOLCDadishuDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
CenterWindow(GetDesktopWindow());//centertothehpcscreen
//TODO:
Addextrainitializationhere
HWNDhwndCB;
hwndCB=CommandBar_Create(AfxGetInstanceHandle(),GetSafeHwnd(),0);
CommandBar_InsertMenubar(hwndCB,AfxGetInstanceHandle(),IDR_MENU1,0);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
//还原背景图
voidCDadishuDlg:
:
clearPicture()
{
PDC=GetDC();
CDCbmpDC;
bmpDC.CreateCompatibleDC(PDC);
CBitmapbmp;
bmp.LoadBitmap(IDB_BITMAP3);
BITMAPbm;
bmp.GetBitmap(&bm);
bmpDC.SelectObject(bmp);
intpx=40+randx*80+1;
intpy=40+randy*80+1;
PDC->StretchBlt(px,py,78,78,&bmpDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
//画图
voidCDadishuDlg:
:
drawPicture(intbmpNum)
{
PDC=GetDC();
CDCbmpDC;
bmpDC.CreateCompatibleDC(PDC);
CBitmapbmp;
if(bmpNum==1)
bmp.LoadBitmap(IDB_BITMAP1);
else
bmp.LoadBitmap(IDB_BITMAP2);
BITMAPbm;
bmp.GetBitmap(&bm);
bmpDC.SelectObject(bmp);
intpx=40+randx*80+1;
intpy=40+randy*80+1;
PDC->StretchBlt(px,py,78,78,&bmpDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
//判定是否击中
voidCDadishuDlg:
:
chilkTrue(intx,inty)
{
intpx_min=40+randx*80;
intpx_max=40+(randx+1)*80;
intpy_min=40+randy*80;
intpy_max=40+(randy+1)*80;
if(x>=px_min&&x<=px_max&&y>=py_min&&y<=py_max){
scorce+=10;
drawPicture
(2);
}
else{
Total--;
scorce-=10;
clearPicture();
}
if(Total==0)
{
EndGame();
TS*ts=newTS;
ts->m_Value=scorce;
ts->DoModal();
}
}
//
voidCDadishuDlg:
:
OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
//TODO:
Addyourmessagehandlercodehere
CDC*pDC=newCClientDC(this);
CPenpen;//画笔
pen.CreatePen(PS_SOLID,1,RGB(0,0,0));
CPen*poldpen=pDC->SelectObject(&pen);
pDC->Rectangle(40,40,280,280);
pDC->SelectObject(poldpen);
//new出来的一般都需要delete来回收内存。
deletepDC;
//DonotcallCDialog:
:
OnPaint()forpaintingmessages
}
//鼠标点击事件
voidCDadishuDlg:
:
OnLButtonDown(UINTnFlags,CPointpoint)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
if(!
start)
return;
chilkTrue(point.x,point.y);
CDialog:
:
OnLButtonDown(nFlags,point);
}
//
voidCDadishuDlg:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
switch(nIDEvent)
{
case1:
clearPicture();
randx=rand()%3;
randy=rand()%3;
drawPicture
(1);
break;
case2:
m_score=scorce;
UpdateData(FALSE);
break;
case3:
_time++;
chartemp[10];
CStringtime;
intsecond=_time%60;
intminut=_time/60%60;
inthour=_time/3600%24;
_itoa(hour,temp,10);
if(hour>9)
time+=temp;
else
time=time+"0"+temp;
_itoa(minut,temp,10);
if(minut>9)
time=time+":
"+temp;
else
time=time+":
0"+temp;
_itoa(second,temp,10);
if(second>9)
time=time+":
"+temp;
else
time=time+":
0"+temp;
m_time=time;
UpdateData(FALSE);
break;
}
CDialog:
:
OnTimer(nIDEvent);
}
//初始化数据
voidCDadishuDlg:
:
InitData()
{
Total=10;
start=true;
SetTimer(1,timer,NULL);
scorce=0;
SetTimer(2,100,NULL);
_time=0;
SetTimer(3,1000,NULL);
}
//
voidCDadishuDlg:
:
EndGame()
{
KillTimer
(1);
KillTimer
(2);
KillTimer(3);
start=false;
}
//重新开始
voidCDadishuDlg:
:
OnMENUITEMRestart()
{
//TODO:
Addyourcommandhandlercodehere
EndGame();
InitData();
}
//开始游戏
voidCDadishuDlg:
:
OnMENUITEMStart()
{
//TODO:
Addyourcommandhandlercodehere
InitData();
}
//
voidCDadishuDlg:
:
OnMENUITEMSeachRecord()
{
//TODO:
Addyourcommandhandlercodehere
SerachRecord*sr=newSerachRecord;
sr->DoModal();
}
保存记录的相关代码:
Userlist[11];
intUserListLength=0;
/////////////////////////////////////////////////////////////////////////////
//TSmessagehandlers
voidTS:
:
ReadScoreFile()
{
CStringfilename="\\scores.dat";
HANDLEhFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
Userus;
DWORDaa;
inti=0;
do{
ZeroMemory(&us,sizeof(us));
if(ReadFile(hFile,&us,sizeof(us),&aa,NULL))
{
if(aa!
=0)
list[i++]=us;
}
}while(aa==sizeof(us));
UserListLength=i;
CloseHandle(hFile);
}
//写到文件里
voidTS:
:
WriteScoreFile()
{
CStringfilename="\\scores.dat";
inti;
//文件句柄
HANDLEhFile=CreateFile(filename,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
//设置文件开始处
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
DWORDaa;
//将数据写到文件
for(i=0;i{
WriteFile(hFile,&list[i],sizeof(list[i]),&aa,NULL);
}
CloseHandle(hFile);
}
//安分数从大到小排序
voidTS:
:
SortList()
{
inti,j,k;
for(i=0;i{
k=i;
for(j=i+1;jif(list[j].score>list[k].score)
k=j;
if(k!
=i)
{
Usertemp=list[k];
list[k]=list[i];
list[i]=temp;
}
}
}
voidTS:
:
OnOK()
{
//TODO:
Addextravalidationhere
//TODO:
Addextravalidationhere
UpdateData(TRUE);
ReadScoreFile();
inti=0;
Userus;
ZeroMemory(&us,sizeof(us));
//将值更新到变量
UpdateData(TRUE);
wcscpy(us.name,m_UserName);
us.score=m_Value;
list[UserListLength]=us;
UserListLength++;
SortList();
for(i=0;i{
if(list[i].name==us.name&&list[i].score==us.score&&i>=10)
{
AfxMessageBox(_T("对不起你的名次最低,没有突破前10名"));
return;
}
}
WriteScoreFile();
CDialog:
:
OnOK();
}
查看记录相关代码
voidSerachRecord:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(SerachRecord)
DDX_Control(pDX,IDC_LIST1,m_list);
CRectrt;
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_DATA_MAP
}
BEGIN_MESSAGE_MAP(SerachRecord,CDialog)
//{{AFX_MSG_MAP(SerachRecord)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//SerachRecordmessagehandlers
voidSerachRecord:
:
OnOK()
{
//TODO:
Addextravalidationhere
m_list.DeleteAllItems();
CStringfilename="\\scores.dat";
HANDLEhFile=CreateFile(filename,GENERIC_READ,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(hFile,0,NULL,FILE_BEGIN);
Userus;
UserusList[10];
DWORDaa;
inti=0;
do{
ZeroMemory(&us,sizeof(us));
if(ReadFile(hFile,&us,sizeof(us),&aa,NULL))
{
if(aa!
=0)
{
usList[i++]=us;
}
}
}while(aa==sizeof(us));
for(intj=i-1;j>=0;j--)
{
m_list.InsertItem(0,_T("test"));
chartemp[10];
_itoa(j+1,temp,10);
CStringnum=temp;
m_list.SetItemText(0,0,num);
m_list.SetItemText(0,2,usList[j].name);
_itoa(usList[j].score,temp,10);
CStringsc=temp;
m_list.SetItemText(0,1,sc);
}
CloseHandle(hFile);
//CDialog:
:
OnOK();
}
5系统测试
5.1运行界面
1游戏开始界面
2.中间游戏进行界面
3.游戏结束界面
4.刷新显示记录: