MFC小游戏-扫雷

MFC小游戏-扫雷
MFC小游戏-扫雷

第二章扫雷

1.游戏实现

扫雷,是附带在Window里面的游戏,是个简单的游戏。因此我们就从扫雷开始我们的游戏旅程。很多人都玩过这个游戏,只是不知道怎么用程序实现。不过还有人不知道怎么玩,下面就先说说游戏的规则:

●开始:按左键开始游戏,按按钮或菜单重新开始。

●左键:按下时,是雷则结束,非雷则显示数字。

●数字:代表此数字周围一圈八格中雷的个数。

●右键:奇次按下表示雷,偶数按下表示对上次的否定。

●结束:左键按到雷结束,找出全部雷结束。

接下来就该介绍游戏的编程过程了。不过要先交代一下一些内容。

●添加位图。

●添加全局变量。

●画初始界面。

●添加函数。

为什么要按这种次序呢?因为我们在画初始界面时,可能要用到位图或变量,而变量的定义又可能要对位图进行定义。这样的步骤的好处还有:在做一步之后都可以运行,有错就改,无错就做下一步。

上图是扫雷的一个画面。

下面就一步一步地演示,以编程的思路进行,当然,由于编程过程中有一些函数中的代码是分成两三次写的,我们就不重复,全部代码在第一次讲到时列出,而后面讲到时就只是提一下。

新建单文档工程2_1。

2.2.资源编辑

添加位图:

前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。另外,为什么不添加一个按钮而用位图呢?是因为即使我们添加了按钮也要添加四幅位图!

位图的ID号:

按扭位图:30*30 IDB_ANNIU1、IDB_ANNIU 2、IDB_ANNIU3、IDB_ANNIU4 雷区位图:14*14 ID号按下图依次为:IDB_BITMAP14。。。。。。IDB_BITMAP25

3.3.变量函数

定义新类:

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

class Lei

{

public:

//显示哪一个位图

intweitu;

//这个位置相应的值

intshumu;

};

视图类变量:

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

//剩下雷数

intleftnum;

//雷数

intleinum;

//结束

intjieshu;

//计时

short second;

//开始计时

intsecondstart;

//位图数组

CBitmapm_Bitmap[12];

//按扭位图数组

CBitmapm_anniu[4];

//雷区行数

intm_RowCount;

//雷区列数

intm_ColCount;

//最大雷区

Lei lei[50][50];

//这个位置周围雷数为0

voidleizero();

//计时器函数

afx_msg void OnTimer(UINT nIDEvent);

//鼠标按下左键

afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

//鼠标按下右键

afx_msg void OnRButtonDown(UINT nFlags, CPoint point);

//初始化函数

afx_msgintOnCreate(LPCREA TESTRUCT lpCreateStruct);

//鼠标左键松开

afx_msg void OnLButtonUp(UINT nFlags, CPoint point);

4.4.具体实现

删去状态栏和工具栏:

开始执行程序,就能见到一个有状态栏和工具栏的大的单文档,与上图不同,所以我们第一步就是整理框架:

打开下面函数,把里面的一些语句去掉。如下所示:

intCMainFrame::OnCreate(LPCREA TESTRUCT lpCreateStruct)

{

if (CFrameWnd::OnCreate(lpCreateStruct) == -1)

return -1;

/* if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLA T, WS_CHILD | WS_VISIBLE | CBRS_TOP

| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_SIZE_DYNAMIC) ||

!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0("Failed to create toolbar\n");

return -1; // fail to create

}

if (!m_wndStatusBar.Create(this) ||

!m_wndStatusBar.SetIndicators(indicators,

sizeof(indicators)/sizeof(UINT)))

{

TRACE0("Failed to create status bar\n");

return -1; // fail to create

}

// TODO: Delete these three lines if you don't want the toolbar to

// be dockable

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

*/

return 0;

}

设置窗口大小:

运行附加的代码,还能看到扫雷游戏的框架是不能调大小的,而且总是显示在最前面,这又是怎么实现的呢?

在下面函数里添加语句,你能说出前三句是什么意思吗?注释已经被我去掉了,如果不知道,不如按一下F1。

BOOL CMainFrame::PreCreateWindow(CREA TESTRUCT&cs)

{

if( !CFrameWnd::PreCreateWindow(cs) )

return FALSE;

// TODO: Modify the Window class or styles here by modifying

// the CREA TESTRUCT cs

cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; //

cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//;

//设置窗口大小:400*340

cs.cx=400;

cs.cy=340;

return TRUE;

}

构造函数:

由于构造函数是程序运行时就执行的,所以,除了对变量赋值之外,我们还可以把游戏的核心结构即内部数组赋值:先是把全部格子的位图和雷数赋值为0,然后调用随机函数按

指定雷数赋值为-1,最后把不是雷的格子的雷数赋值为相应的值。

CMy2_1View::CMy2_1View()

{

// TODO: add construction code here

for(int ii=0;ii<16;ii++)

m_Bitmap[ii].LoadBitmap(IDB_BITMAP14+ii);

for(intjj=0;jj<4;jj++)

m_anniu[jj].LoadBitmap(IDB_ANNIU1+jj);

//计时

second=0;

//1时开始计时

secondstart=0;

//行数

m_RowCount=25;

//列数

m_ColCount=16;

//雷数

leinum=80;

//剩余雷数

leftnum=leinum;

//jieshu=1时停止

jieshu=0;

intaa=0;

//初始化为0

for(inti=0;i

{

for(int j=0;j

{

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

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

}

}

//获取当前时间

CTime time=GetCurrentTime();

int s;

//获取秒数

s=time.GetSecond();

//设置40个雷

do

{

//以当前秒数为产生随机算法

int k=(rand()*s)%m_RowCount;

int l=(rand()*s)%m_ColCount;

//为了避免一个位置同时算两个雷

//只允许当前位置不是雷时赋值为雷

if(lei[k][l].shumu!=-1)

{

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

aa++;

}

}while(aa!=leinum);

//给方格赋值,计算雷数

for(int a=0;a

for(int b=0;b

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

{

for(int c=a-1;c

for(int d=b-1;d

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

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

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

}

}

界面函数:

现在,可以开始画界面了。如下函数:

很明显,前面部分是用画的方法画出整个界面,但是,后面for循环显示的位图并不是现在画界面的内容,为什么要写呢?

这是为了用户框重画的需要,当我们的游戏玩了一半后最小化,或是把部分窗口移出屏幕,或是执行了新的应用程序覆盖了原来的程序时,必须重画。我们调用重画函数,它都要重新执行OnDraw(CDC* pDC)函数,那么,此时它就必须把已经显示出来的位图也显示出来。而开始时雷区位图是不可见的,并不影响界面的初始化。

void CMy2_1View::OnDraw(CDC* pDC)

{

CMy2_1Doc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

//画背景

CBrush mybrush1;

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(int j=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);

CPen mypen2;

CPen*myoldPen2;

mypen2.CreatePen(PS_SOLID,1,RGB(0,0,0));

myoldPen2=pDC->SelectObject(&mypen2);

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

CDC Dc;

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

AfxMessageBox("Can't create DC");

//显示按钮

Dc.SelectObject(m_anniu[0]);

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

//判断显示什么位图

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

//weitu=2显示旗

//weitu=3显示问号

for(int a=0;a

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

CFont font;

if(0==font.CreatePointFont(160,"Comic Sans MS"))

{

AfxMessageBox("Can't Create Font");

}

pDC->SelectObject(&font);

CStringstr;

//利用判断显示位数,不够三位前面加0

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

else if(second<100)

str.Format("0%d" ,second);

else

str.Format("%d" ,second);

pDC->TextOut(330,10,str);

pDC->RestoreDC(nOldDC);

}

运行一下,外观已经出来了,只是还不能玩。那我们就来添加一些功能函数,使它可以玩。

当然,如果你对程序已经有一定的经验的话,你就会指出上面的函数太长了。这并不太符合我们编程的要求。我们编程有一个讲究,就是尽量使函数的代码少,一般为一页左右,便于查看。那么,我们可以把上面的函数细分为几个小函数,然后在这个函数里面分别调用。

按下鼠标左键:

用if语句判断,如果在按钮上面,则显示按钮按下位图;如果在扫雷区,先把按钮位图改为张口位图,再判断按下的是否是雷,是就结束,重画,以显示所有的雷;否则,重画相应格子以显示数字。

void CMy2_1View::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

//获取指针pdc

CDC *pDC=GetDC();

CDC Dc;

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

AfxMessageBox("Can't create DC");

//显示按下按钮

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时计时有效

secondstart=1;

//鼠标坐标转换为数组坐标

int a=(point.x-10)/15;

int b=(point.y-50)/15;

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

{

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

{

jieshu=1;

//结束时,释放Timer

KillTimer(1);

//重画,因为这次重画将显示全部的雷,

//不能用部分重画

Invalidate();

}

else

{

lei[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);

}

如果你现在运行的话,你会发现按下按钮时并不还原,这就涉及到鼠标函数:OnLButtonUp(UINT nFlags, CPoint point)

松开鼠标左键:

松开左键时,显示按钮没有按下的位图;再判断,如果结束,就要显示失败的位图;另外,如果是在按钮上松开按钮,即表示我们已经按下了重新开始的按钮,必须调用重新开始函数OnStart()。

由于OnStart()函数是与菜单里的开始共有的,此处先保留不说,若有必要运行,可以先去掉最后两行。

void CMy2_1View::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CDC *pDC=GetDC();

CDC Dc;

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

AfxMessageBox("Can't create DC");

//显示按钮

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

}

按下鼠标右键:

如果是雷,我们按右键,显示旗子,并减少一个剩下雷数;如果我们认为那旗子的格子不是雷,我们按右键,显示问号,并在剩下雷数加上1。有关函数:

void CMy2_1View::OnRButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

//结束,返回

if(jieshu==1)

return;

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

{

int a=(point.x-10)/15;

int b=(point.y-50)/15;

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

{

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

leftnum--;

}

else

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

{

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

leftnum++;

}

//重画剩下雷数

CRect rect2;

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

}

显示没有雷的区域:

运行,玩一下,你会发现当按下的是一个周围没有雷的格子是它并不会象Window里面的扫雷游戏一样显示它周围的格子雷数。怎么实现呢?

添加一个如下函数:

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

void CMy2_1View::leizero()

{

for(inti=0;i

for(int j=0;j

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

{

for(int n=i-1;n

for(int m=j-1;m

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

if(lei[n][m].shumu!=-1&&lei[n][m].weitu==0)

{

lei[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);

}

}

}

再运行,效果是有的,只是它只显示一部分,即这个周围的几个。那么我们应该怎样使它显示全部呢?可以利用计时器函数。

计时器函数:

OnTimer(UINT nIDEvent)函数,同时也可以实现计时显示。添加OnCreate(LPCREA TESTRUCT lpCreateStruct)和OnTimer(UINT nIDEvent):

int CMy2_1View::OnCreate(LPCREA TESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// TODO: Add your specialized creation code here

//20次为一秒

SetTimer(1,50,NULL);

return 0;

}

void CMy2_1View::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

//结束,返回

if(jieshu==1)

return;

//显示个数为0的方格

leizero();

//计时

if(secondstart>0)

secondstart++;

//二十次为一秒

if(secondstart==20)

{

secondstart=1;

second++;

//重画时间

CRect rect3;

rect3.left=325;

rect3.right=375;

rect3.top=10;

rect3.bottom=40;

InvalidateRect(&rect3);

}

CView::OnTimer(nIDEvent);

}

扫雷游戏就这样就是了。下面是附加内容,它将说明菜单的添加和重新开始函数的算法。

5.5.附加内容

修改菜单:

游戏已经可以玩了,只是点到雷之后就完了,无法重新开始。还有,菜单还没有改。下面就修改菜单并实现重新开始功能:

把菜单改为如下图2-3。

图2-3

并在View()函数中按下图添加OnStart()函数(图2-4):

开始函数:

OnStart()函数其实只是构造函数的再版。

void CMy2_1View::OnStart()

{

SetTimer(1,50,NULL);

// TODO: Add your command handler code here second=0;//计时

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

// num=0;

leftnum=leinum;//剩余雷数

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

intaa=0;

//初始化0

for(inti=0;i

{

for(int j=0;j

{

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

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

}

}

//设置leinum个雷

do

{

int k=rand()%m_RowCount;

int l=rand()%m_ColCount;

if(lei[k][l].shumu!=-1)

{

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

aa++;

}

}while(aa!=leinum);

//给方格赋值

for(int a=0;a

for(int b=0;b

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

{

for(int c=a-1;c

for(int d=b-1;d

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

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

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

}

Invalidate();

}

这样,整个程序完成了。

6.6.小结

当然,这个游戏比Window自带的简单。但就目前来说,离它其实也不远。添加菜单项,并相应修改参数值:m_RowCount、 m_ColCount、leinum,并重新初始化界面就行了。

本书的例子都只是一些最基本的游戏算法,它教你怎样去实现游戏,而至于游戏的扩展,我只是提一些建议,让你自己去实现。

软件测试 扫雷游戏

软件测试 实验报告(20 15 -20 16 学年第 2学期) 学号: 学生姓名: 专业班级: 学院: 学生成绩:

1.引言 1.1编写目的 编写该测试报告目的为: (1).查找并总结该模块程序所存在的问题; (2).为更改存在的问题,提供参考。 (3).评估测试测试执行和测试计划是否符合 1.2 程序功能 扫雷游戏中各个功能实现 1.3 测试对象 扫雷软件游戏规则测试 1.4 测试方法 黑盒测试 2.测试计划 2.1、条件: ?方块当前状态:标识问号方块、方块初始状态、方块标识红旗、 标识数字X且周围已标记了X个雷、标识数字X且周围没有标记完X个雷,标识数字X标雷错误 ?鼠标操作:左键、右键、双击 ?方块状态:有雷、无雷 2.2、动作: ?方块白色 ?方块标识问号 ?方块标识数字 ?方块旗子 ?炸弹爆炸,游戏结束

?未标识方块闪速 ?周围所有的非雷显示 2.4、简化公式: 6*3*2 =(1+1+1+1+1+1)*3*2 =1*3*2+1*2*2+1*3*2+1*1*1+1*1*1+1*1*1 =6+4+6+1+1+1 =19

3.测试结果分析 3.1结果分析 在程序代码基本完成后,经过不断的调试和修改,最后测试本次所设计的扫雷游戏能够正常运行,没有出现明显的错误和漏洞,但是在一些细节方面仍然需要完善,总的来说本次设计在功能上已经基本达到要求,在其他细节方面有待以后完善。 3.2 修改建议 1.在游戏中可以假如一些声音的提示,在游戏完成和失败的时候弹出一些小 的Flash动画。 2.完善一下扫雷英雄榜等。 4.测试评估 4.1测试任务评估 本次测试执行准备充足,完成了既定目标。 4.2 测试对象评估 测试对象尚未完善,不符合现阶段测试质量要求,存在着一些缺陷,本测试需要进一步修正,重新进行测试。

扫雷游戏教案

一、入门准备训练 从一个假成语导入:八面埋伏(十面埋伏) 注:【秦朝末年(公元前206年),楚汉交兵争霸天下.战争持续了多年,虽然还没有分出最后胜负. 但是楚霸王项羽的领地已经越来越少,大半天下为汉王刘邦所得.刘邦命足智多谋的韩信挂帅,统帅六-七十万大军浩浩荡荡追剿项羽.韩信设下了十面埋伏之计,将楚军诱入罗网,层层包围。】 谈话:对红色的格子八面埋伏,你需要哪些格子(理解一个格子,需要哪些格子来包围它) 图①是一个雷区(黑点表示地雷),让学生试着分析下数字与包围它的雷有什么联系)并说一说

2.根据这个规律,以下是已经被扫出的雷区,你能填出红格中的数字吗。 3、下面的几个雷区中有数量不等的地雷,请在空格里填上合适的数字。 ① ② ③ 最简单的问题 找一找:下面的雷区中,空格里可能有地雷,请根据格子中的数,找出地雷的位置。(用●表示地雷)

图中间的3告诉你什么?有数字的格子表示没有地雷,把空格中可能有地 雷的地方标上●。 你首先可以确定哪些位置一定有地雷,为什么?怎么确定哪个空格没有地 雷呢? 滚动思考:在下面的雷区中找出地雷 下面的雷区中,空格里可能有地雷,请根据格子中的数,找出地雷的位置。(用●表示地雷) 温馨提示:注意先看,哪个位置是可以确定有地雷的?再用其他格子的数字进行验算,没有矛盾,你的扫雷就完成了。 关键位置的分析 看一看:下面这片雷区中只有5颗地雷,小明却找出了6颗,请你看一看,哪一颗应该不是地雷?

(1) 哪个数字相邻的空格里的地雷数量是合乎实际的? (2) 那两个数字相邻的空格里的地雷数量不对了? (3) 去掉哪个地雷合适? 滚动思考:下面的雷区中已经找出了一些地雷,但是还有一些没有找到,请把还 温馨提示:注意寻找,哪些格子的附近还少地雷? 无法确定的时候,可以先试一试。 综合分析 找一找:在空格里标出地雷,有地雷的标上 ,如果没有地雷,就在空格里写上表示周围地雷数量的数字。

JAVA课程设计扫雷小游戏

Java游戏设计报告 院系计算机科学学院 班级计科11002 姓名张林峰 设计日期2012.12.18—2012.12.29

1·设计内容及要求 1.1·扫雷小游戏的基本要求 扫雷小游戏主要采用Java语言编写,适合windows XP以下的系统,以eclipse 为平台。具体要求如下: <1>扫雷小游戏分为初级、中级和高级三个级别,扫雷排行榜保存着每个级别的最好成绩,即挖出全部的地雷并且用时最少。单机游戏菜单选择“初级”、“中级”和“高级”。 <2>游戏默认的是初级级别,用户可以选择不同级别将出现对应级别的扫雷区域,单击扫雷区域任一方格以便启动计时器。 <3>用户选择某个方格,单击它就行。若所选择的放阁下有雷,这一局就结束了,若所选择方格下无雷,则会显示一个数字,该数字代表方格周围8个方格中共有几颗雷。 <4>如果用户认为某个方格下有雷,单击右键可以在方格上标记一个用户认为是雷的图标(一个小旗子)。 <5>用户可以选择标记为疑问的方格,可以选择游戏菜单下的标记,或者双击右键所选方格显示(?)图标。 <6>扫雷完成后,程序弹出保存成绩的对话框,用户可以根据自身选择是否保存。 <7>如果用户喜欢有提示音,可以选择游戏菜单中的声音选项,单击扫雷区域任一方格,就会听到吧嗒声。当点中地雷时,将会有爆炸声音响起,胜利后,将播放凯旋的旋律。 1.2需求实现的主要功能 (1)该游戏具有计时功能,即扫完全部地雷所花费的时间。 (2)用户可以选择是否有音效。 (3)用户可以自定义级别,还可以输入任意地雷数。 (4)自动保存扫雷排行榜。 2·需求分析 2.1扫雷区域的布局设计 系统的整体布局为:CardLayout布局,采用菜单、按钮、面板……等组件,菜单项主要有开始,选择级别,自定义,标记,声音,扫雷排行榜,退出,按钮的功能是重新开始游戏(可以选择游戏菜单里的开局,也可以点击企鹅图标重新开始游戏)。 2.2雷区的设计 MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener 和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。 2.3音效的设计

高级编程技术课程实验报告-扫雷游戏

高级编程技术课程实验报告 班级通信一 班 姓名陈远春学号201100120084 课程实验内容 扫雷游戏,是Windows操作系统自带的一款经典游戏。其规则简单,上手容易,不论男女老少皆可娱乐。扫雷的目的就是要把所有非地雷的格子揭开即胜利。踩到地雷格子就算失败。 设计的扫雷游戏应包含以下功能:能够显示主菜单和界面;能够接收鼠标输入功能;能够根据规则翻转相应的格子;能够标记指定格子的功能;游戏胜负判断功能;游戏支持背景音乐功能;游戏提供帮助说明。 设计分工安排 本程序由三人共同完成。 其中我主要负责程序代码编写调试和上台讲解方面的工作。 其余两个主要负责游戏设计部分模块的工作。 一、系统概述 扫雷游戏,是Windows操作系统自带的一款经典游戏。其规则简单,上手容易,不论男女老少皆可娱乐。扫雷的目的就是要把所有非地雷的格子揭开即胜利。踩到地雷格子就算失败。 本设计的扫雷游戏包含以下功能:能够显示主菜单和界面;能够接收鼠标输入功能;能够根据规则翻转相应的格子;能够标记指定格子的功能;游戏胜负判断功能;英雄榜记录更新;游戏支持背景音乐功能;游戏提供帮助说明。 二、需求分析 随着世界经济的长足发展和计算机技术的日益成熟,计算机被应用到人类活动的各个领域,各种应用软件也相继问世,这其中有相当一部分是游戏软件。使用游戏软件自然是为了满足人们对娱乐性的要求,而有些软件大都采用3D设计对系统配置的要求较高。 在众多游戏软件中,也不乏一些小游戏的身影,它们对系统的配置要求较低。能够满足人们对娱乐性的需求,是人们在完成工作娱乐时候的最好选择。在各种操作系统中都附带了一些小的游戏,而这些游戏也成为电脑用户软件中不可或缺的一部分。 扫雷游戏是比较经典的一款小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去却依然保持着原貌。但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。

经典游戏:扫雷的技巧攻略

经典游戏:扫雷的技巧攻略 扫雷作为策略游戏,需要游戏者精确的判断。现在扫雷高级的官方最快纪录是33.95秒,中级则是由一个波兰玩家保持的8.5秒。而初级纪录是1秒,世界上很多人达到了这一点。在1秒的时间里完成初级扫雷,据测算概率在0.00058%至0.00119%之间(属于运气题),最可能的方法是直接点击四个角的方块。而本文所作的事情,则是将雷与雷之间的规律给你揪出来,并且深入思考其中的内涵。让你以后面对扫雷时,缩短与记录的差距,战无不胜! 从简单雷区入手下图是一个初级的雷区,并且标注了两颗雷的位置,你能将剩下的地雷扫描出来吗? 经过逐一排查,可以很轻松的确定雷区中的6颗地雷所在位置:

再来看一个简单的“雷区”: 通过逐步扫描每一个方块会发现:首先最左边的和最右边的两个格子都一定是地雷,从左数第二个空格子和从右数第二个空格子也都是地雷,由于数字1的关系,从左数第3个格子和从右数第3个格子都不是地雷,翻开一定是数字1……这样一直下去,最后你会发现最中间的两个空格子,不管有没有地雷,都和周围格子上的数字不符。也就是说这样的雷区有bug,是无解的。雷区中的逻辑门怎么判断一个雷区是否有bug?又怎么判断雷区中地雷的具体位置呢?难道一定要从头到尾将雷区扫描一遍吗?其实这些雷区里其实藏着一个规律。我们用数学方法来分析了上例的雷区:在之前提到的这两个雷区里,把还没有翻开的格子交叉标记上字母x和x’。可以看到:当x的格子有雷时,x’格子一定没有地雷,反之亦然。如果将最左边的空格子作为输入,把最右边的格子作为输出,输入结果和输出结果一定是一样或者相反的。如果是相反的,这相当于一个NOT (“非”)门电子元件。如果是一样的,就有趣了,这样的一片雷区就具备了电路导线的性质!

(完整word版)JAVA课程设计--扫雷游戏

合肥学院 计算机科学与技术系 课程设计报告 2009~2010学年第二学期 课程Java语言与应用 课程设计名称扫雷游戏 学生姓名胡远远 学号0604031005 专业班级07网络工程一班 指导教师许强张贯虹

2010年09月 1.设计内容及要求 1.1 扫雷游戏的基本要求 Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下:(1)选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。 (2)用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下五雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。 (3) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。 (4)扫雷胜利后,显示游戏胜利。 (5) 用户可以右击空格,可以选择标记为“旗帜”、“问号”或者返回成空格。 1.2 需实现的主要功能 (1)用户点击笑脸实现复位操作。 调用repaint()和validate()函数对界面进行重置以及刷新操作(2)可以显示用户完全扫雷成功所花时间。 文本框TF记录扫雷成功所花的时间 (3)在失败和胜利后跳出失败或胜利的文本框 JoptionPane 该类用来调出对话框并提示胜利 2.需求分析 2.1 扫雷棋盘的布局设计 系统的整体布局为:CardLayout布局, 采用了文本框、按钮、面板、框架…等组件,菜单主要有run按钮笑脸和哭脸,按钮的功能是重新开始新的游戏。

扫雷

大连科技学院 Java课程设计报告 题目扫雷小游戏 学生姓名 XXX 专业班级软件工程12-1 指导教师史原职称讲师 所在单位大连科技学院 教研室主任刘瑞杰 完成日期 2015年6月12日

目录 1.总体设计 (1) 1.1本系统的主要功能 (1) 1.2系统包含的类及类之间的关系 (1) 2.详细设计 (2) 2.1 MineGame.java(主类): (2) 2.2 MineArea.java: (2) 2.3 Block.java: (3) 2.4 BlockView.java (3) 2.5 LayMines.java: (3) 2.6 Record.java: (4) 2.7 ShowRecord: (4) 3.运行效果 (5) 3.1 系统主界面 (5) 3.2初级录入界面 (5) 3.3中级录入界面 (6) 3.4高级录入界面 (6) 3.5游戏结束录入界面 (7) 3.6游戏英雄榜界面 (7) 参考文献 (8) 附录1 软件源程序 (8) 课程设计实践总结: (25)

1.总体设计 1.1本系统的主要功能 (1)本系统用户可以自定义级别并且可以任意输入雷数; (2)具有计时功能,即显示用户完成移动盘子所花费的时间; (3)自动保存扫雷英雄榜; 1.2系统包含的类及类之间的关系 本系统共包括7个java源文件。 如图1-1所示。 图1-1 类之间的关系

2.详细设计 2.1 MineGame.java(主类): (1)成员变量 bar和fileMenu 提供菜单操作,单击菜单操作中的选项为“初级”,“中级”,“高级”或“扫雷英雄榜”;mineArea 是扫雷区域,提供有关雷的主要功能;英雄榜”负责存放三个级别的扫雷最好成绩;showHeroRecord负责显示英雄榜中的数据(2)方法 MineGame()是构造窗口,负责完成窗口的初始化。 ActionPerformed(ActionEvent)方法是MineGame类实现的ActionListener接口中的方法,该方法负责执行菜单发出的有关命令。用户选择菜单中的菜单项可触发ActionEvent事件,导致actionPerformed(ActionEvent)方法执行相应的操作。 Main(String[])方法是程序运行的入口方法。 (3)源代码见文件MineGame.java 2.2 MineArea.java: (1)成员变量 block和Block类型的数组,用来确定雷区有多少需进行扫雷的方块; blockView是BlockView类型的数组,负责block数组中Block对象提供视图; lay是LayMines类型的对象,负责设置block数组中的哪些方块不是雷; record负责提供保存成绩的界面,是一个对话框,默认为不可见,用户只有扫雷成功后,才可以看见该对话框; reStart是一个按钮对象,用户单击它重新开始游戏; time是计时器对象,负责计算用户用时。 (2)方法 initMineArea(int,int,int,int)方法可根据参数提供的数据设置雷区的宽度,高度,类的数目以及雷区的级别。 actionPerformed(actionEvent)是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时actionPerformed(actionEvent)执行有关算法。 Show()方法是一个递归方法,actionPerformed(actionEvent)方法执行将调用show 方法进行扫雷。 mousePressed(mouseEvent)方法是MineArea类实现的MouseListener接口中的方

扫雷小游戏课程设计

西安科技大学 软件工程课程设计报告 题目:扫雷游戏开发 班级:计科0901班 学号: xxxxxxxxxxxx 姓名: xxxxxxx 电话:xxxxxxxxxxxxx

2012年7月 目录 1 绪论 (3) 1.1 选题目的及意义 (3) 1.2 系统概述 (3) 2 可行性研究报告 (4) 3 需求规格说明书 (5) 4 总体设计说明书 (6) 5详细设计说明书 (7) 6 系统实现 (16) 6.1 开发环境 (16) 6.2 关键技术 (16) 6.3 运行结果 (16) 7测试分析报告 (17) 8心得体会 (19) 参考文献

1.绪论 1.1选题目的及意义 随着现在生活节奏的加快,人们在工作学习之余需要一个轻松娱乐的放松环境。因此我编写此软件的目的,一方面作为初学者来了解java环境下的小程序开发,另一方面使用户能在娱乐休闲的同时拓展思维能力。扫雷是单人计算机游戏。游戏的用户界面由小方格组成的战场构成。当游戏开始时,计算机将固定的地雷数随机的放到战场的方格。此游戏还允许玩家指定战场中的地雷数。 参考Windows 操作系统提供的扫雷游戏,改进扫雷游戏程序,增加以下功能:在主界面中添加一个菜单栏,菜单栏中包括游戏和帮助两个菜单,其中游戏菜单中设置初级、中级、高级、自定义、声音、扫雷英雄榜这几个菜单项,帮助菜单中设置游戏规则和制作人员两个菜单项。 背景说明: a.软件名称:扫雷 b.用户:所有扫雷游戏爱好者 1.2 系统概述 1.2.1扫雷游戏的基本要求 Windows 2000/XP系统提供的扫雷游戏是一个很有趣的游戏。本章的课程设计使用Java语言编写一个与其类似的扫雷游戏。具体要求如下: (1) 扫雷游戏分为初级、中级和高级三个级别。单击游戏菜单可以选择“初级”、“中级”和“高级”。 (2) 选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击‘“开始”便启动计时器。 (3) 用户要揭开某个方块,可左键单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。 (4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。 (5)当用户点中雷时,将有“你输了”的提示出现,胜利时,将有“你赢了”的提示出现。 1.2.2 需实现的主要功能 用户可以自定义级别并且可以任意输入雷数; 具有计时功能,即显示用户完成移动盘子所花费的时间。

java_扫雷_课程设计_报告

《JAVA程序设计》 课程设计报告 系别:计算机与电子系 专业班级:计算机科学与技术0803班 学生姓名:曾一墙 指导教师:徐鹏 (课程设计时间:2011年6月13日——2011年6月24日) 华中科技大学武昌分校

课程设计报告撰写内容、格式与成绩评定 一、课程设计报告的撰写内容与要求 1.课程设计总结报告应包括:前言、基本原理或理论、设计计算书或实验报告、结论、图纸(框图、流程图)、参考资料等;或调查、访谈报告、调查问卷、调查提纲等。 2.课程设计总结报告应书写工整,文句通顺、精炼、逻辑性强,图纸和曲线的绘制应符合规范。 3.调查型课程设计应根据调查结果撰写调查报告。调查报告内容包括:题目、参加时间、地点、方式、过程、调查对象一般情况、调查内容、发现的问题、调查结果和调查分析及体会等。调查报告要求语言简练、准确;叙述清楚、明白;数据、资料可靠;结论有理、有据。 4.图纸应布局合理,比例恰当,线条分明,字体工整,符合国家制图标准。 5.课程设计报告字数要求:理工、艺术类不少于2000字,其他专业不少于3000字。 二、课程设计成绩评定 1.学生的课程设计成绩由平时成绩、业务考核成绩两部分组成,均为百分制记分,其中平时成绩占总成绩的30%,业务考核成绩占70%。业务考核含设计报告(计算说明书、调查提纲、调查问卷等)、绘制的图纸、编制的软件、制作的模型、撰写的论文或问卷统计、调查分析等的完成及质量情况;平时成绩含设计表现、到课率等。 2. 教师按学生实际成绩(百分制,含平时成绩和业务考核成绩两部分)登记并录入教务MIS系统,由系统自动转化为“优秀(90~100分)、良好(80~89分)、中等(70~79分)、及格(60~69分)和不及格(60分以下)”五等。

能力拓展训练-----扫雷游戏

课程设计 题目扫雷游戏 学院计算机学院 专业软件工程 班级0803班 姓名徐泽前 指导教师 2010 年7 月15 日

扫雷游戏 1规则描述 游戏开始后,系统会在雷区的小方块中随机布下若干个地雷。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中雷方块的数量,玩家可以根据这些信息去半段时候可以打开某些方块,并把认为是地雷的方块打上标记,当玩家吧所有地雷找出来后,其余非雷方块区域都已打开,这时游戏结束。在游戏过程中一旦错误的打开了雷方块则立即失败,游戏结束;当玩家标识的地雷数量超过程序设定,虽然打开了全部其余方块,游戏仍不会结束。 2软件环境 Windows XP Microsoft Visual C++ 3功能需求分析 游戏需要提供两个计数器,一个用来显示用户扫雷所花费的时间,以秒为单位;一个用来显示当前还剩多少个雷方块。另外提供一个按钮,用来开始游戏。在游戏区域方面,按功能将它分成两大区域:雷区和提示区。提示区除了上面提供的计数器外,还包括两个按钮,一个用来开始游戏,一个用来显示版本信息。游戏过程中,当玩家用鼠标点击相应的方块,程序就会做出相应的鼠标响应时间,程序处理这些鼠标时间的过程中会伴随着GDI绘图,而众多鼠标事件的处理,都是围绕着实现扫雷程序的算法而衍生的。

4程序实现 4.1界面设计 图1 界面设计图 4.2具体实现 4.21布雷 随机获取一个状态为非雷的点,将它的属性标识为雷,重复这样的工作,直到布下足够的累为止,流程图如下 在CMineWind类中添加游戏的布雷模块的处理函数,该函数的具体实现如下所示:

游戏开发课程设计报告模版-扫雷游戏报告(定稿)

中原工学院信息商务学院 课程设计报告 2016~2017学年第一学期 课程游戏开发课程设计 课程设计名称扫雷游戏 学生姓名*** 学号***** 专业班级数媒141 指导教师郑全录 2016年12月

目录 第一章设计内容及要求 (1) 1.1 扫雷游戏的基本要求 (1) 1.2 游戏需要实现的主要功能 (1) 第二章需求分析 (2) 2.1扫雷游戏界面设计 (2) 2.2 雷区的设计 (2) 2.3 音效的设计 (3) 2.4 扫雷英雄榜的设计 (3) 第三章总体设计 (5) 3.1 总体功能图 (5) 3.2 总体流程图 (5) 第四章主要功能设计流程 (6) 4.1 雷区设计流程图 (6) 4.2 音效设计流程图 (6) 4.3 英雄榜设计流程图 (7) 第五章主要功能设计流程 (8) 5.1 类之间关系图 (8) 5.2程序运行效果图 (8) 5.2.1 游戏登录界面 (8) 5.2.2游戏菜单界面 (9) 5.2.3游戏运行界面 (10) 5.2.4游戏英雄榜界面 (12) 第六章总结 (13) 参考文献 (14) 附录 (15)

第一章设计内容及要求 1.1扫雷游戏的基本要求 当前各种游戏层出不穷,因为游戏的开发成本非常大,所以游戏的开发具有一定的风险性,但是一些小游戏的开发成本具有成本小,编写简单的优势,所以这些小游戏在游戏开发中也占有一席之地。在这类小游戏中包括益智类游戏,它以画面精美、游戏方法简单等特点得到大家的认可。成为人们在工作之余不可或缺的好伙伴。针对这种情况我选择了扫雷游戏该课题作为我的课程题目。 Windows XP和Windows 7系统提供的扫雷游戏是一个很有趣的游戏。本次课程设计的主要任务是使用JA V A语言编写一个与其类似的扫雷游戏。具体要求如下: 1、扫雷游戏分为初级、中级和高级三个级别,同时扫雷英雄榜存储每个级别的最好成绩,即挖出全部的地雷且用时最少者。单击游戏菜单可以选择“初级”、“中级”和“高级”或“查看英雄版”。 2、选择级别后将出现相应级别的扫雷区域,这时用户使用鼠标左键单击雷区中任何一个方块便启动了计时器。 3、用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下没有雷,则显示一个数字,该数字代表此方块周围的8个方块中共有多少颗雷。 4、如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),窗口左上角的雷数计数器将会减少一个。 5、扫雷胜利后(用时最少者),程序弹出保存成绩的对话框。 6、用户如果遇到疑问的方块,可以勾选游戏菜单下的标记选项卡(或者用快捷键Alt+G然后点击M)即可标记该可疑方块,此时双击右键并可出现“?”标记。另有颜色选项,当用户选中该项时,游戏将以最低图像像素来显示。 7、如果用户需要使用提示声,可选中声音选项,此时将听到计时的咔嗒声。当用户点中雷时,将有爆炸声产生;胜利时,将有凯旋的旋律播放,此时企鹅出现欢悦表情。 1.2游戏需要实现的主要功能 1、用户可以自定义级别并且可以任意输入雷数; 2、具有计时功能,既显示用户完成所有扫雷任务所需要的时间; 3、自动保存扫雷英雄榜。

扫雷游戏技巧

1.边角的1对应的角肯定是雷,如下图。这也是扫雷中最常见的情形。 2. 2 2.边上的两个2并排对应的两个块肯定是雷,如下图。 3. 3 3.边角的3对应的3个块肯定是雷,如下图。 4. 4 4.孤立的3对应的3个块肯定是雷,如下图。

5. 5 5.孤立的4对应的4个块肯定是雷,如下图。 6. 6 6.孤立的5对应的5个肯定是雷,如下图。 7.7

7.两个1夹一个2的1,两个1下面对应的块肯定是雷,如下图。 8.孤立的2对应的两个块肯定是雷,如下图。 9.如下图,已知3的左边两个是雷,那么3的下边两个中肯定有一个是雷,所以第二个1下边的那个块肯定不是雷。 10.如下图,已知2的左边一个是雷,所以2的下边两个中肯定有一个是雷,所以1的右边3个块都不是雷。 11.如下图,上边那个1对应的两个角块中有一个是雷,所以下边那个1下边的3个块都不是雷。

12.如下图,两个并排的3对应的3个块都是雷。 13.如下图,两个并排的2,已知左边那个2的左边是雷,则右边那个2的右下角那个肯定也是雷。 14.如下图,已知右边两个竖着的1的左边两个块中有个个是雷,则左边那两个1下方的两个块都不是雷。 15.如下图,1和2孤立地排在一起,则2要从下方3个块中选两个,肯定不会是左边两个,所以2的右下角那个肯定是雷,而1和2下边两个块中有1个是雷,所以1左下角那个肯定不会是雷。

16.如下图,一个3和一个2并排在一起,已知3上边那个是雷,则3左下角那个块肯定是雷,而2右下角那个块肯定不是雷。 17.如下图,两个2并排在一起,且已知右边那个2正上方那个块是雷,则它的左边两个中肯定只有一个是雷,并且左边那个2的左边3个块都不是雷。 一夹二,一有雷; 二夹一,心有雷; 二夹三,全有雷; 二二边,都有雷; 三连一,中有雷; 四连一,边有雷。

扫雷的课程设计报告

西安文理学院信息工程学院课程设计报告 设计名称:数据结构课程设计 设计题目:实现一个N*M的扫雷游戏 学生学号:1402130407 专业班级:软件13级四班 学生姓名:樊秀琳 学生成绩: 指导教师(职称):谢巧玲(讲师) 课题工作时间:2015.6.22 至2015.7.3

说明: 1、报告中的任务书、进度表由指导教师在课程设计开始前填写并发给每个 学生。 2、学生成绩由指导教师根据学生的设计情况给出各项分值及总评成绩。 3、所有学生必须参加课程设计的答辩环节,凡不参加答辩者,其成绩一律 按不及格处理。答辩由指导教师实施。 4、报告正文字数一般应不少于3000字,也可由指导教师根据本门综合设 计的情况另行规定。 5、平时表现成绩低于6分的学生,取消答辩资格,其本项综合设计成绩按 不及格处理。

信息工程学院课程设计任务书 指导教师:院长: 日期:2015年6月22日

信息工程学院课程设计进度安排表 学生姓名:樊秀琳学号:1402130407 专业:软件工程班级:13级四班 指导教师签名: 2014年6月22日

成绩评定表 学生姓名:樊秀琳学号:1402130407 专业:软件工程班级:13级四班

摘要 摘要: 扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法设计和语言实现,如C,C++,VB,JAVA等。我利用eclipse编写了与它功能相似的扫雷游戏,寓学于乐。 程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的笑脸可以重新开始游戏。所有地雷标出后胜利,当鼠标左键单击到地雷时提示游戏失败。其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案。重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作。清除未靠近地雷区的方块较为复杂。 关键词:算法设计;事件;Eclipse

扫雷游戏报告

《扫雷游戏》程序设计报告 院系中兴电信学院 专业计算机科学与技术 班级7B1431 小组成员强建敏张伟田志杰赵立

一、开发环境 Intel?Pentium?2及以上的处理器,32M以上内存,20M以上硬盘空间。 Microsoft?WindowsTM22000或XP以上操作系统。 800×600或以上的屏幕分辨率 microsoft visual studio 2010 二、系统功能 游戏共由两个类组成 主界面对话框类:主要负责主界面、菜单及各个窗口类对象的创建和调用等处理。 扫雷窗口类:主要负责接收玩家鼠标输入的打开格子位置、格子变换、花费时间及地雷格子的显示等处理。 三、系统设计 1、扫雷格子模块功能设计 地雷格子的处理是扫雷游戏的核心内容,包括如下几个部分。 (1)地雷铺设模块。 游戏中的地雷个数可以根据玩家设定。地雷分布是调用随机数发生函数生成随机数。利用随机数去除最大行数或者最大列数,得到放置地雷行列坐标。然后分别防止地雷到不同的行和列的格子中去。 (2)自动打开周围不是地雷的格子。 在游戏中,当玩家单击的格子周围没有地雷格子时,就需要程序自动地把周围的格子自动打开来提高玩家的效率。 以上的实现,由如下代码实现。 public void LoadGame() {

int x = Convert.ToInt16(cbX.Text);//行坐标 int y = Convert.ToInt16(cbY.Text);//纵坐标 intmine_count = Convert.ToInt16(cbMinecount.Text);//地雷个数 mines = new List(); mines = CreateMines(x, y, mine_count);//生成随机地雷集合 intbtnx = plMines.Location.X + 5; intbtny = 5; for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { Button btn = CreateButton(btnx, btny); btn.Tag = j + "," + i; plMines.Controls.Add(btn); btnx += 40; } btnx = plMines.Location.X + 5; btny += 40; Application.DoEvents(); } } 2、玩家输入模块功能设计 在扫雷游戏中,用的最多的就是鼠标的输入。而鼠标输入又分为鼠标左键单击和右键单击两种处理类型。 1. 鼠标左键的处理

扫雷游戏程序设计课程设计报告

课 程 设 计 扫雷游戏程序设计 2013 年 11 月 5 日 设计题目 学 号专业班级 学生姓名 指导教师

合肥工业大学课程设计任务书

一. 设计任务 (1)鼠标左击排雷,右击插小旗,打问号; (2)方格里面的数字表示方格周围的雷数; (3)能够显示未标记雷数和游戏用时; (4)雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏; (5)可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数),和自行定义雷区行数,列数和雷数的功能; (6)排行榜功能,扫雷成功时候,根据游戏用时更新排行榜。 二. 具体设计 (一)、设计思路 扫雷游戏是很经典也很有趣的一款游戏,这次的游戏程序设计要求设计出功能与原游戏相近的一款游戏,首先定义变量和类要画出游戏方格以及位图,设计游戏等级,等级越高方格越多雷数也越多;然后设置随机布雷以保证每次重新开始游戏都有不同的雷区地图;另外定义鼠标左击扫雷,左击标记周围埋雷情况,右击奇数次排雷偶数次取消上次排雷,以及扫雷第一次左击不能扫到雷。

(二)、设计表示: 1、鼠标左击排雷,右击插小旗,打问号; 2、方格里面的数字表示方格周围的雷数; 3、能够显示未标记雷数和游戏用时; 4、雷区上面的小脸可以变化,显示微笑,惊讶,痛苦,胜利。在任何情况下单击小脸可以重新开始游戏; 5、可进行游戏难度的设定:包括预定义的难度级别(雷区行数,列数和雷数); 6、任何时候开始游戏第一次点击不会扫到雷。 由于时间等原因未完成功能: 排行榜和自行定义雷区行数,列数和雷数功能。 (四)、详细设计 1、添加位图 前十二幅是在雷区的,后四幅是按钮。为了便于加载,必须各自保证其连续性。 分别表示游戏进行的状态、结果胜利或触雷。

课程实训报告

课程实训报告 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

信息工程学院课程实训报告 姓名:谢成林 学号:45 实训名称:C/C++项目实训 所在班级:14级软件工程2班 实训时间: 2015年6月8日-2015年6月18日实训地点:工B201 实训教师: 实训企业:上海杰普软件科技有限公司 实训成绩: 宿州学院信息工程学院实习实训中心制

三、项目开发过程(1写明项目开发需要用到的C/C++知识点,并给出相关重要代码,并在代码后做出注释。2 写出在项目开发环境下的开发步骤,尽可能详细。可续页。) 1、相应的知识点 1、导包:如果需要用到其他包中的类就需要导包 本次实训主要使用的包 工具包 布局画界面 布局画界面 部分 2数组 数组有基本数据类型和引用型数据类型,有一维和二维,二维是存放一维的数组,二维数组一般确定一个有X,Y轴坐标的位置。 而且数组的初始化也有静态的和动态,不得混用。 以下是利用数组添加图片,添加鼠标的事件监听等。

3产生随机数 利用随机数产生1到81的随机数 4鼠标点击事件 BUTTON1左击,BUTTON2中击,BUTTON3右击。 5、结构体语 (1)if条件语句 有些代码只能在满足条件之后可以执行的。 if(条件){} .else{} 多支语句 本次实训不仅利用if语句判断是否右击,解决了雷数的加减问题,还解决了所点击是否为雷,随后找出所雷并标出的问题等。

(2)循环语句 有些代码重复执行 循环语句可以很好的执行重复执行的代码,就如以下,利用for循环很好的解决了初级,中级,高级布雷任务等。 6界面和菜单

JAVA实训报告

目录 1 绪论 (1) 2 系统分析 (2) 2.1 设计目的 (2) 2.2选择开发工具 (2) 2.3JA V A语言的特点 (2) 3系统设计 (4) 3.1需求分析 (4) 3.2可行性分析 (4) 3.3 总体设计 (4) 4系统功能实现 (5) 4.1.功能设计 (5) 4.2 系统实现(程序代码) (6) 4.2.1在Eclipse中新建项目 (6) 4.2.2主类Minesweeper1分析 (7) 4.2.3添加按钮系统功能 (8) 4.2.4小游戏查看器功能 (10) 4.2.5初级游戏功能 (10) 4.2.6中级游戏功能 (12) 4.2.7高级游戏功能 (13) 5系统应用 (16) 总结 (17) 致谢 (18) 参考文献 (19) 附录 (20)

1 绪论 当今时代是飞速发展的信息时代,在各行各业中离不开信息处理,计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高了其安全性。对于复杂的信息管理、游戏开发计算机能够充分发挥它的优越性。而JA V A语言是开发小游戏的最好的处理语言。 java虚拟机是软件模拟的计算机,可以在任何处理器上(无论是在计算机中还是在其它电子设备中)安全并且兼容的执行保存在.class文件中的字节码。java虚拟机的"机器码"保存在.class文件中,有时也可以称之为字节码文件。java程序的跨平台主要是指字节码文件可以在任何具有java虚拟机的计算机或者电子设备上运行,java虚拟机中的java解释器负责将字节码文件解释成为特定的机器码进行运行。java源程序需要通过编译器编译成为.class文件(字节码文件),java程序的编译和执行过程

Java课程设计报告_扫雷小游戏

. . . . JAVA语言课程设计报告 题目:扫雷小游戏 设计者: 专业班级: 学号: 指导教师: 2011年 12月 12日 计算机学院

目录: 1.设计容及要求 (1) 1.1.扫雷小游戏的基本要求 (1) 1.2 需求实现的主要功能 (1) 2.需求分析 (1) 2.1 扫雷区域的布局设计 (1) 2.2 雷区的设计 (1) 2.3 音效的设计 (1) 3.总体设计 (2) 3.1总体功能图 (2) 3.2游戏设计流程图 (2) 4.主要功能设计 (3) 4.1 雷区设计流程图 (3) 4.2 音效设计流程图 (4) 4.3 排行榜设计流程图 (5) 5.代码实现 (6) 5.1 类之间的关系图 (6) 5.2 各界面图及代码: (6) 5.2.1 游戏菜单界面 (6) 5.2.2 游戏登录界面(初级、中级、高级) (8) 5.2.3自定义扫雷界面 (15)

6.扫雷总结 (18) 7.参考文献 (18) 1·设计容及要求 1.1·扫雷小游戏的基本要求 扫雷小游戏主要采用Java语言编写,适合windows XP 以下的系统,以eclipse 为平台。具体要求如下: <1> 扫雷小游戏分为初级、中级和高级三个级别,扫雷排行榜保存着每个级别的最好成绩,即挖出全部的地雷并且用时最少。单机游戏菜单选择“初级”、“中级”和“高级”。 <2> 游戏默认的是初级级别,用户可以选择不同级别将出现对应级别的扫雷区域,单击扫雷区域任一方格以便启动计时器。 <3> 用户选择某个方格,单击它就行。若所选择的放阁下有雷,这一局就结束了,若所选择方格下无雷,则会显示一个数字,该数字代表方格周围8个方格中共有几颗雷。 <4> 如果用户认为某个方格下有雷,单击右键可以在方格上标记一个用户认为是雷的图标(一个小旗子)。 <5> 用户可以选择标记为疑问的方格,可以选择游戏菜单下的标记,或者双击右键所选方格显示(?)图标。 <6> 扫雷完成后,程序弹出保存成绩的对话框,用户可以根据自身选择是否保存。 <7> 如果用户喜欢有提示音,可以选择游戏菜单中的声音选项,单击扫雷区域任一方格,就会听到吧嗒声。当点中地雷时,将会有爆炸声音响起,胜利后,将播放凯旋的旋律。 1.2 需求实现的主要功能 (1)该游戏具有计时功能,即扫完全部地雷所花费的时间。 (2)用户可以选择是否有音效。 (3)用户可以自定义级别,还可以输入任意地雷数。 (4)自动保存扫雷排行榜。 2·需求分析 2.1 扫雷区域的布局设计 系统的整体布局为:CardLayout 布局,采用菜单、按钮、面板……等组件,菜单项主要有开始,选择级别,自定义,标记,声音,扫雷排行榜,退出,按钮的功能是重新开始游戏(可以选择游戏菜单里的开局,也可以点击企鹅图标重新开始游戏)。 2.2 雷区的设计

软件体系结构课程之扫雷游戏

扫雷游戏 开发成员:代禄礼 学号:2406070428

开发时刻: 2010-7-5

目录 0、引言……............................................. ............................................... .....................2 1、工作打算........................................ ................................................................ (2) 1.1、要紧工作时期划分............................................... ................................... (2) 1.2、各时期工作任务分解....................................................................................2 2、需求分析.............................................. ...................................................................2

2.1、概述................................................................................................................2 2.2、用户分析............................................ ...................................................... (3) 2.3、约束条件........................................................................................ ................3 2.4、功能需求.............................................. .................................................... (3) 2.5、用户界面需求................................................................................................4

相关文档
最新文档