lei[a][b].shumu++;
}
}
界面函数:
现在,可以开始画界面了。
如下函数:
很明显,前面部分是用画的方法画出整个界面,但是,后面for循环显示的位图并不是现在画界面的内容,为什么要写呢?
这是为了用户框重画的需要,当我们的游戏玩了一半后最小化,或是把部分窗口移出屏幕,或是执行了新的应用程序覆盖了原来的程序时,必须重画。
我们调用重画函数,它都要重新执行OnDraw(CDC*pDC)函数,那么,此时它就必须把已经显示出来的位图也显示出来。
而开始时雷区位图是不可见的,并不影响界面的初始化。
voidCMy243ztyslView:
:
OnDraw(CDC*pDC)
{
CMy243ztyslDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
CBrushmybrush1;//画背景mybrush1.CreateSolidBrush(RGB(192,192,192));
CRectmyrect1(0,0,1200,800);
pDC->FillRect(myrect1,&mybrush1);
CBrushmybrush;//画黑框
mybrush.CreateSolidBrush(RGB(0,0,0));
CRectmyrect(20,10,70,40);
pDC->FillRect(myrect,&mybrush);
CRectmyrect2(325,10,375,40);
pDC->FillRect(myrect2,&mybrush);
CPenmypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,2,RGB(255,255,255));
myoldPen=pDC->SelectObject(&mypen);
pDC->MoveTo(20,40);//画黑框的白线
pDC->LineTo(70,40);
pDC->LineTo(70,10);
pDC->MoveTo(325,40);
pDC->LineTo(375,40);
pDC->LineTo(375,10);
for(inti=0;ifor(intj=0;j{
pDC->MoveTo(10+i*15,50+j*15+14);pDC->LineTo(10+i*15,50+j*15);
pDC->LineTo(10+i*15+14,50+j*15);
}
pDC->SelectObject(myoldPen);
CPenmypen2;
CPen*myoldPen2;
mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen2=pDC->SelectObject(&mypen2);
for(intii=0;iifor(intjj=0;jj{
pDC->MoveTo(10+ii*15,50+jj*15+14);pDC->LineTo(10+ii*15+14,50+jj*15+14);
pDC->LineTo(10+ii*15+14,50+jj*15);
}
pDC->SelectObject(myoldPen2);
CDCDc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can'tcreateDC");
Dc.SelectObject(m_anniu[0]);//显示按钮
pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);
for(inta=0;a数字区//weitu=2显示旗//weitu=3显示问号
for(intb=0;b{
if(lei[a][b].weitu==1)
{
Dc.SelectObject(m_Bitmap[lei[a][b].shumu]);
pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);
}
if(lei[a][b].weitu==2)
{
Dc.SelectObject(m_Bitmap[9]);
pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);
}
if(lei[a][b].weitu==3)
{
Dc.SelectObject(m_Bitmap[10]);
pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);
}
if(jieshu==1&&lei[a][b].shumu==-1)//结束
{
Dc.SelectObject(m_Bitmap[11]);
pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);
Dc.SelectObject(m_anniu[3]);
pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);
}
}
intnOldDC=pDC->SaveDC();//显示黑框里的数字
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,0,0));
CFontfont;
if(0==font.CreatePointFont(160,"ComicSansMS"))
{
AfxMessageBox("Can'tCreateFont");
}pDC->SelectObject(&font);CStringstr;
if(leftnum<10)//利用判断显示位数,不够三位前面加0str.Format("00%d",leftnum);
else
str.Format("0%d",leftnum);pDC->TextOut(25,10,str);
if(second<10)str.Format("00%d",second);
elseif(second<100)
str.Format("0%d",second);
else
str.Format("%d",second);pDC->TextOut(330,10,str);pDC->RestoreDC(nOldDC);
}
计时器函数:
OnTimer(UINTnIDEvent)函数,同时也可以实现计时显示。
添加OnCreate(LPCREATESTRUCTlpCreateStruct)和OnTimer(UINTnIDEvent):
intCMy243View:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)return-1;
//TODO:
Addyourspecializedcreationcodehere
SetTimer(1,50,NULL);//20次为一秒
return0;
}
voidCMy243View:
:
OnTimer(UINTnIDEvent)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefaultif(jieshu==1)return;
//显示个数为0的方格leizero();//结束,返回if(secondstart>0)//计时secondstart++;
if(secondstart==20)//二十次为一秒
{secondstart=1;second++;
CRectrect3;rect3.left=325;
rect3.right=375;rect3.top=10;
rect3.bottom=40;
InvalidateRect(&rect3);//重画时间
}
CView:
:
OnTimer(nIDEvent);
开始函数:
点击笑脸图标和开始键都可以重新开始。
voidCMy243ztyslView:
:
OnStart()
{
SetTimer(1,50,NULL);
//TODO:
Addyourcommandhandlercodeheresecond=0;//计时
secondstart=0;//1时开始计时
leftnum=leinum;//剩余雷数jieshu=0;//jieshu=1时停止intaa=0;
for(inti=0;i{
for(intj=0;j{
lei[i][j].shumu=0;
lei[i][j].weitu=0;
}
}
do//设置40个雷
{
intk=rand()%m_RowCount;
intl=rand()%m_ColCount;
if(lei[k][l].shumu!
=-1)
{
lei[k][l].shumu=-1;
aa++;
}
}while(aa!
=leinum);
for(inta=0;afor(intb=0;bif(lei[a][b].shumu==0)
{
for(intc=a-1;cfor(intd=b-1;d
if(c>=0&&c=0&&dlei[a][b].shumu++;
}//给方格赋值
Invalidate();
}
3.3系统设计结果(界面截图、操作流程)
1)游戏开始界面。
图2游戏初始界面
2)我们可以点击开始游戏。
图3点击开始游戏
3)点击小方块游戏开始并计时。
图4开始扫雷
4)可以右击标机雷的位置,这样雷的个数会减少。
图5标机雷的位置
5)当点到雷时,游戏结束停止计时。
羽24浊引.
1
1|«
•
.4
:
*
1|
1|2
■
2
1
11
•
■
■
■
1
1
1
|1
1
»:
1
1
o
>
•
■
1
11
Z
■
1
I
2
■
■
■
■
Z
1|
1
1|
Z
>
r
■
■
■
LLI
1
b
■
■
•
±1
1
卜
9
Z\2
2
2
•
■
•
Wl
«
■
.・
•
*1
■
•
♦
*
4
■
■
•
■
•
A
■
■
■
■
•
图6踩到地雷
6)可以点笑脸或开始重新开始游戏。
图7新的一局游戏
4.设计总结
随着扫雷游戏的开发完成,本游戏中预期的主要功能也基本实现。
本系统以
VisualC++6.0作为前台开发工具,VisualC++6.0以简单、易用等优点成为开发本系统的首选工具。
本论文阐述了扫雷游戏的分析与设计的全过程,并在论文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。
扫雷游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。
这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。
由于我学习VisualC++6.0的时间比较短,其中的很多知识还没有了解和掌握,在扫雷游戏中有些功能还不够完善,例如在扫雷游戏中不能实现玩家成绩的排名。
希望在以后的工作和学习中不断的充实自己的知识结构,把扫雷游戏的功能进一步完善,使它成为一个更具有实用价值的游戏软件,同时也恳请老师给予批评指正。
4.1遇到的问题及如何解决
在程序写好后运行游戏时发现以下问题:
1.游戏中显示的位图错乱。
2.在点击笑脸重新开始时出现错误,只显示一个雷。
解决方案:
1.重新把位图的ID检查一下,发现ID有错误,改之。
2.在OnStart()函数中初始化雷后,再重新步地雷的代码书写错误,及时改正了过来。