MFC课程设计扫雷界面游戏.docx

上传人:b****0 文档编号:17079260 上传时间:2023-07-21 格式:DOCX 页数:48 大小:102.55KB
下载 相关 举报
MFC课程设计扫雷界面游戏.docx_第1页
第1页 / 共48页
MFC课程设计扫雷界面游戏.docx_第2页
第2页 / 共48页
MFC课程设计扫雷界面游戏.docx_第3页
第3页 / 共48页
MFC课程设计扫雷界面游戏.docx_第4页
第4页 / 共48页
MFC课程设计扫雷界面游戏.docx_第5页
第5页 / 共48页
MFC课程设计扫雷界面游戏.docx_第6页
第6页 / 共48页
MFC课程设计扫雷界面游戏.docx_第7页
第7页 / 共48页
MFC课程设计扫雷界面游戏.docx_第8页
第8页 / 共48页
MFC课程设计扫雷界面游戏.docx_第9页
第9页 / 共48页
MFC课程设计扫雷界面游戏.docx_第10页
第10页 / 共48页
MFC课程设计扫雷界面游戏.docx_第11页
第11页 / 共48页
MFC课程设计扫雷界面游戏.docx_第12页
第12页 / 共48页
MFC课程设计扫雷界面游戏.docx_第13页
第13页 / 共48页
MFC课程设计扫雷界面游戏.docx_第14页
第14页 / 共48页
MFC课程设计扫雷界面游戏.docx_第15页
第15页 / 共48页
MFC课程设计扫雷界面游戏.docx_第16页
第16页 / 共48页
MFC课程设计扫雷界面游戏.docx_第17页
第17页 / 共48页
MFC课程设计扫雷界面游戏.docx_第18页
第18页 / 共48页
MFC课程设计扫雷界面游戏.docx_第19页
第19页 / 共48页
MFC课程设计扫雷界面游戏.docx_第20页
第20页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MFC课程设计扫雷界面游戏.docx

《MFC课程设计扫雷界面游戏.docx》由会员分享,可在线阅读,更多相关《MFC课程设计扫雷界面游戏.docx(48页珍藏版)》请在冰点文库上搜索。

MFC课程设计扫雷界面游戏.docx

MFC课程设计扫雷界面游戏

 

Windows程序设计

课程考核报告

 

班级:

学号:

姓名:

得分:

 

 

 

1.设计目的及要求

1.1设计目的及问题描述

利用VC++程序编写扫雷游戏,以检测自己一个学期对MFC学习的情况,以及了解自己在MFC学习中的不足,巩固和提高自己对MFC的理解和掌握。

掌握C++编程和调试的基本技能,进一步提高自己的动手能力,和运用C++解决实际问题的能力。

本次我做的是一个简单的扫雷的游戏,包括计算雷数、时间和扫雷的规则制定。

1.2设计要求

找出所有的非地雷的地方。

如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。

游戏规则:

首先按右键开始,可以通过界面快捷键(如图笑脸)

,也可以通过菜单重新开始。

接着左键按下的数字周围一圈八格中雷的个数。

当确定小方框里面是一个雷,则用右键按下有一个小旗出现。

当发现此处不是一个雷时,就可以再次按下。

结束时只需要按标题栏的关闭键或菜单中的文件下的退出。

当踩到一个雷时,程序结束。

1.3软件、硬件环境

软件:

Windows7操作系统,MicrosoftVisualC++6.0

硬件:

Inter(R)Core(TM)i3-2330MCPU@2.20GHz

2.课程设计步骤

(1)添加位图

前十二幅是在雷区的,后四幅是按钮。

位图的ID号:

按扭位图:

30*30IDB_ANNIU1、IDB_ANNIU2、IDB_ANNIU3、IDB_ANNIU4

雷区位图:

14*14ID号按下图依次为:

IDB_BITMAP14。

IDB_BITMAP25

(2)添加全局变量

public:

intleftnum;//剩下雷数

intleinum;//雷数

intjieshu;//结束

shortsecond;//计时

intsecondstart;//开始计时

CBitmapm_Bitmap[12];

CBitmapm_anniu[4];

intm_RowCount;//行

intm_ColCount;//列

wkhwkh[50][50];//最大雷区

voidleizero();

virtual~CWkhView();

(3)画初始界面

(4)添加函数

1)voidCWkhView:

:

leizero()//扫描,如果是已经被按下且雷数为0,显示它周围的八个格,并重

voidCWkhView:

:

leizero()

{

for(inti=0;i

for(intj=0;j

if(wkh[i][j].shumu==0&&wkh[i][j].weitu==1)

{

for(intn=i-1;n

for(intm=j-1;m

if(n>=0&&n<25&&m>=0&&m

if(wkh[n][m].shumu!

=-1&&wkh[n][m].weitu==0)

{

wkh[n][m].weitu=1;

CRectrect;

rect.left=n*15+10;

rect.right=n*15+25;

rect.top=m*15+50;

rect.bottom=m*15+65;

InvalidateRect(&rect);

}

}

}

2)voidCWkhView:

:

OnLButtonDown(UINTnFlags,CPointpoint)//鼠标左键按下函数

voidCWkhView:

:

OnLButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

//获取指针pdc

CDC*pDC=GetDC();

CDCDc;

if(Dc.CreateCompatibleDC(pDC)==FALSE)

AfxMessageBox("Can'tcreateDC");

//显示按下按钮

if(point.x>180&&point.x<210&&point.y>10&&point.y<40)

{

Dc.SelectObject(m_anniu[3]);

pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

}

if((point.x>=10)&&(point.x<=385)&&(point.y>=50)&&(point.y<=290))

{

if(jieshu==1)

return;

//显示窗口按钮

Dc.SelectObject(m_anniu[1]);

pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

secondstart=1;

inta=(point.x-10)/15;

intb=(point.y-50)/15;

if(wkh[a][b].weitu==0||wkh[a][b].weitu==3)

{

if(wkh[a][b].shumu==-1)

{

jieshu=1;

KillTimer

(1);

Invalidate();

MessageBox("你失败了");

}

else

{

wkh[a][b].weitu=1;

CRectrect;

rect.left=a*15+10;

rect.right=a*15+25;

rect.top=b*15+50;

rect.bottom=b*15+65;

InvalidateRect(&rect);

}

}

}

CView:

:

OnLButtonDown(nFlags,point);

}

3)voidCWkhView:

:

OnLButtonUp(UINTnFlags,CPointpoint)//鼠标左键松开

voidCWkhView:

:

OnLButtonUp(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CDC*pDC=GetDC();

CDCDc;

if(Dc.CreateCompatibleDC(pDC)==FALSE)

AfxMessageBox("Can'tcreateDC");

//显示按钮

Dc.SelectObject(m_anniu[0]);

pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

if(jieshu==1)

{

Dc.SelectObject(m_anniu[2]);

pDC->BitBlt(180,10,160,160,&Dc,0,0,SRCCOPY);

}

if(point.x>180&&point.x<210&&point.y>10&&point.y<40)

OnStart();

CView:

:

OnLButtonUp(nFlags,point);

}

 

4)voidCWkhView:

:

OnRButtonDown(UINTnFlags,CPointpoint)//鼠标右键按下

voidCWkhView:

:

OnRButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

if(jieshu==1)

return;

if((point.x>=10)&&(point.x<=385)&&(point.y>=50)&&(point.y<=290))

{

inta=(point.x-10)/15;

intb=(point.y-50)/15;

if(wkh[a][b].weitu==0||wkh[a][b].weitu==3)

{

wkh[a][b].weitu=2;

leftnum--;

}

else

if(wkh[a][b].weitu==2)

{

wkh[a][b].weitu=3;

leftnum++;

}

//重画剩下雷数

CRectrect2;

rect2.left=20;

rect2.right=70;

rect2.top=10;

rect2.bottom=40;

InvalidateRect(&rect2);

//重画打击格子

CRectrect;

rect.left=a*15+10;

rect.right=a*15+25;

rect.top=b*15+50;

rect.bottom=b*15+65;

InvalidateRect(&rect);

}

CView:

:

OnRButtonDown(nFlags,point);

}

5)voidCWkhView:

:

OnStart()//计时函数

voidCWkhView:

:

OnStart()

{

SetTimer(1,50,NULL);

//TODO:

Addyourcommandhandlercodehere

second=0;//计时

secondstart=0;//1时开始计时

//num=0;

leftnum=leinum;//剩余雷数

jieshu=0;//jieshu=1时停止

intaa=0;

//初始化0

for(inti=0;i

{

for(intj=0;j

{

wkh[i][j].shumu=0;

wkh[i][j].weitu=0;

}

}

//设置40个雷

do

{

intk=rand()%m_RowCount;

intl=rand()%m_ColCount;

if(wkh[k][l].shumu!

=-1)

{

wkh[k][l].shumu=-1;

aa++;

}

}while(aa!

=leinum);

//给方格赋值

for(inta=0;a

for(intb=0;b

if(wkh[a][b].shumu==0)

{

for(intc=a-1;c

for(intd=b-1;d

if(c>=0&&c=0&&d

if(wkh[c][d].shumu==-1)

wkh[a][b].shumu++;

}

Invalidate();

}

6)voidCWkhView:

:

OnTimer(UINTnIDEvent)//结束游戏函数

voidCWkhView:

:

OnTimer(UINTnIDEvent)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

//结束,返回

if(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);

}

7)voidCWkhView:

:

OnDraw(CDC*pDC)//框架设置

voidCWkhView:

:

OnDraw(CDC*pDC)

{

CWkhDoc*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;i

for(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;ii

for(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);

//判断显示什么位图

//weitu=1已按下的数字区

//weitu=2显示旗

//weitu=3显示问号

for(inta=0;a

for(intb=0;b

{

if(wkh[a][b].weitu==1)

{

Dc.SelectObject(m_Bitmap[wkh[a][b].shumu]);

pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

}

if(wkh[a][b].weitu==2)

{

Dc.SelectObject(m_Bitmap[9]);

pDC->BitBlt(a*15+10,b*15+50,160,160,&Dc,0,0,SRCCOPY);

}

if(wkh[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&&wkh[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)

str.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);

//////////////////////////////////////////////

}

 

(5)菜单修改

3.课程设计内容

3.1概要设计

游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。

游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“1”,则表示以其为中心的周边方块内藏有1个地雷。

当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。

3.1.1程序总体框架描述

 

3.1.2程序常用类声明

定义新类:

对于雷,我们是单独定义一个类,这样有利于程序的操作。

classwkh

{

public:

//显示哪一个位图

intweitu;

//这个位置相应的值

intshumu;

};

视图类变量:

接着是在View类添加变量和函数:

//剩下雷数

intleftnum;

//雷数

intleinum;

//结束

intjieshu;

//计时

shortsecond;

//开始计时

intsecondstart;

//位图数组

CBitmapm_Bitmap[12];

//按扭位图数组

CBitmapm_anniu[4];

//雷区行数

intm_RowCount;

//雷区列数

intm_ColCount;

//最大雷区

wkhlei[50][50];

3.2主要技术

1.图形的设置

2.消息处理函数;

3.视图框架设置;

4.扫雷游戏算法。

5.菜单的设置。

 

3.3系统设计结果(界面截图、操作流程)

1.界面截图:

操作流程图

 

 

4.设计总结

4.1遇到的问题及如何解决

随着扫雷游戏的开发完成,本游戏中预期的主要功能也基本实现。

本系统以VisualC++6.0作为前台开发工具,VisualC++6.0以简单、易用等优点成为开发本系统的首选工具。

本论文阐述了扫雷游戏的分析与设计的全过程,并在论文中相应的位置插入了图片、流程图以及一些具有技巧性的程序代码,更加清晰的描述了该游戏是如何实现的。

扫雷游戏是一款益智类游戏,该游戏与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。

这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。

由于我学习VisualC++6.0和MFC的时间比较短,其中的很多知识还没有了解和掌握,当然出现了很多错误,

在设计过程中出现鼠标不响应操作的现象,这是因为定义鼠标函数时出现了错误;

在设计过程中对位图的设置不够了解,总是不能调用位图,通过XX,才知道缺少了一部分代码;

对于分号、引号的符号出现了不少的错误,主要是中英文切换时没注意,导致编译出错;

完成程序之后,对程序进行编译,系统总是提示链接出错,经过仔细检查

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2