当前位置:文档之家› C#扫雷

C#扫雷

C#扫雷
C#扫雷

湖南涉外经济学院

程序实训

学院:信息科学与工程学院

专业名称:计算机科学与技术

课程名称:程序设计实训

设计题目:扫雷游戏

学生姓名:

指导教师:

时间:2012年12月

摘要

在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。

扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如C#、C++、VB、JA VA等,我利用C# 编写了与它功能相仿的扫雷游戏,寓学于乐。

关键字:游戏;扫雷;C#;

目录

摘要 ................................................................................................... II 第一章程序的功能和设计目的.. (2)

1.1 程序的功能 (2)

1.2 程序的设计目的 (2)

1.3 程序的要求 (2)

第二章程序分析和设计 (3)

2.1 游戏规则 (3)

2.2 游戏功能 (3)

2.3 游戏设计 (3)

第三章程序实现 (8)

3.1界面设计 (8)

3.2 游戏功能调试 (9)

3.3问题的解决 (12)

3.4 功能代码 (13)

总结 (19)

参考文献 (20)

第一章程序的功能和设计目的

1.1程序的功能

程序的功能是随机生成地雷数,通过鼠标操作玩游戏,不接受键盘,按任意键结束程序。单击屏幕上的笑脸可以重新开始游戏。所有地雷标出后胜利,当鼠标左键单击到地雷时失败。

1.2程序的设计目的

1.培养综合运用所学知识独立完成课题的能力。

2.更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。

5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。

1.3程序的要求

1.游戏基本功能必须实现,可以不做问号、可以不做鼠标左右两键同时操作,可以不做鼠标移动,可以不做扫雷英雄排行榜,可以不做游戏级别选择;

2.符合游戏的基本逻辑,例如,不允许出现第一次点击就触雷的情况,雷分布每次都必须是随机的,点开所有的不包含雷的网格后游戏能自动识别胜利,一旦触雷游戏能自动识别失败,等等,违背基本游戏逻辑的,不能算通过;

第二章程序分析和设计

2.1 游戏规则

设计10×10 格区域,单击鼠标后,该格显示数字,则表示它周围8 个空格内含有的地雷数,周围没有地雷的显示空白,则不能再单击了。如果是地雷,则游戏结束。如果判断是地雷,可以单击鼠标右键标出,显示红旗,要取消红旗标志则再单击鼠标右键,当所有地雷都标出,每个不是雷的空格都被打开了则胜利结束。

2.2 游戏功能

1.游戏总共分为三个区域:菜单区、计录区和雷区。

2.游戏分为初级、中级、高级三个级别、并且可以自定义雷区大小和雷数。

3.记录区有一个计时器和计数器,分别记录游戏时间和剩下的雷数。

2.3 游戏设计

1.程序流程图

(1)扫雷总体流程图

图2.1为该扫雷的程序总流程图。清楚的表示出了扫雷游戏的详细流程。

图2.1 总流程图

(2)布雷流程图

如图2.4为布雷流程图,表现出了布雷的流程。

(3) 挖雷流程图

如图2.3为挖雷流程图,表现出了挖雷的流程。

(4)英雄榜流程图

图2.4为英雄榜流程图,表现出了英雄榜的判断流程。

图2.3 挖雷流程图

图2.2布雷流程图

2.设计思路

算法的重点是一开始统计好每个格子周围有多少地雷,然后当鼠标左键点在没地雷的格子上时进行两种判断,如果格子周围没地,雷就先在原来的格子位置显示空白格,然后用递归的方法同样判断周围的8个格子;如果格子周围有地雷,就在该格子上显示具体的雷数。

定义全局变量

图2.4英雄榜流程图

first表示是否第一次点开雷区

gameover表示游戏状态。值0表示游戏正在进行,1表示结束

dig表示当前已经挖开非雷点

time表示游戏已经进行的时间

leftTag为TRUE表示左键按下

rightTag为TRUE表示右键按下

remain指示剩下未标记的雷数(可能为负数,因为存在标记错误的情况)

MileState二维数组表示雷区每个点周围的地雷数

游戏开始,载入窗体并将窗体初始化,然后初始化游戏时间、雷数和布雷点。然后载入所有通过buton做成的雷区。

开始点开雷块,做判断,如果是第一次点击,则将first置成false然后开始布雷,布雷的时候要避开第一次单击的坐标,并且不能在同一位置重复布雷。

点开雷块后,判断该点是不是雷,如果是雷,则游戏结束并且停止计时,弹出失败窗口。如果不是雷,计算该点周围8个点的雷数,根据雷数返回对应的背景图片,如果没有雷则将该button禁用,递归打开周围8个点。在递归判断8个格子时,如果格子上有雷或者格子已经显示过雷数或者空白格,以及格子上有红旗标志的话,就不再对格子进行任何判断。

当点开所有非雷的点,或者正确的标记所有的雷点后,判断游戏胜利,弹出胜利窗口,同时对游戏时间进行判断,如果时间少于排行榜的时间,对排行榜的时间进行更新。

第三章程序实现

3.1界面设计

1.将一个form初始化大小,并且将所有功能模块添加到该form,作为游戏的主界面(如图3.1)

图3.1游戏模块

2.在游戏的菜单栏添加游戏功能:开始游戏、初级难度、中级难度、高级难度、自定义雷区、英雄榜、退出、帮助(如图

3.2)

图3.2游戏菜单栏

3.在雷区添加botton作为雷块(如图3.3)

图3.3游戏主界面3.2游戏功能调试

1.打开第一个雷点,并开始计时(如图3.4)

图3.4游戏开始

2.游戏中级难度(如图

3.5)

图3.5中级难度3.游戏高级难度(如图3.6)

图3.6高级难度

4.自定义雷区(如图3.7)

图3.7自定义雷区5.游戏英雄榜(如图3.8)

图3.8游戏英雄榜6.成功扫除所有雷(如图3.9)

图3.9扫雷成功

7.扫雷失败(如图3.10)

图3.10扫雷失败

3.3问题的解决

1.第一步就点开雷。

因为老师明确的说了第一步不能够点到雷,要等第一个方块打开后才开始布雷。所以添加了一个判断来确定是否第一次点开方块,如果是第一次就打开该方块,如果不是第一次,找出第一次点开方块的坐标,在除了第一次点开的方块其他的方块随机布雷。

2.挖开了非雷点不显示成功。

在游戏中,如果点开了所有的不是雷的方块,剩下的所有方块都是雷的

情况下不提示游戏成功。判断游戏是否成功有两种情况:一种是判断剩下的方块和所剩雷的方块数是否一致,如果一致则显示游戏成功,如果不一致则游戏继续。另一种是对已插旗帜数目与剩下雷数相加如果数目等于总雷数,则游戏成功,否则游戏继续。

3.4功能代码

1.重新开始按扭

private void button1_Click(object sender, EventArgs e)

{

int x = 0;

int y = 0;

//时间复位

time = -1;

timer1_Tick(sender, e);

timer1.Stop();

//游戏开始dig,remain重新赋值

gameover = 0;

dig = 0;

remain = Miles;

Fresh_Remain();

first = true;

//初始化窗体大小

Initialize_Size(sender, e);

button1.Image = global::MineSweeping.Properties.Resources.Face1;

//以button显示雷区

for (x = 0; x < Widths; x++)

{

for (y = 0; y < Heights; y++)

{

this.buttonarray[x, y] = new System.Windows.Forms.Button();

this.buttonarray[x, y].Location = new System.Drawing.Point(20 + 20 * x, 60 + 20 *

y);

this.buttonarray[x, y].Size = new System.Drawing.Size(20, 20);

this.buttonarray[x, y].UseVisualStyleBackColor = true;

this.buttonarray[x, y].Text = "";

this.buttonarray[x, y].MouseDown += new

System.Windows.Forms.MouseEventHandler(Mouse_Down);

this.buttonarray[x, y].MouseUp += new

System.Windows.Forms.MouseEventHandler(Mouse_Up);

this.buttonarray[x, y].MouseClick += new

System.Windows.Forms.MouseEventHandler(Mouse_Click);

this.Controls.Add(buttonarray[x, y]);

}

}

}

2.鼠标按下事件

private void Mouse_Down(object sender, MouseEventArgs e)

{

if (gameover == 0)

{

button1.Image = global::MineSweeping.Properties.Resources.Face2;

}

int x = this.PointToClient(MousePosition).X / 20 ;

int y = this.PointToClient(MousePosition).Y / 20 * 20;

x = (x - 20) / 20;

y = (y - 60) / 20;

if (e.Button == MouseButtons.Right)

rightTag = true;

if (e.Button == MouseButtons.Left)

leftTag = true;

if (leftTag && rightTag)

{

int open=letout(x - 1, y - 1)+letout(x - 1, y)+ letout(x - 1, y + 1)+letout(x, y - 1);

open +=letout(x, y + 1)+letout(x + 1, y - 1)+letout(x + 1, y)+letout(x + 1, y + 1);

if (buttonarray[x, y].Text == "" && open == MileState[x, y])

{

if (Check(x - 1, y - 1) == true)

Open_Button(x - 1, y - 1);

if (Check(x - 1, y) == true )

Open_Button(x - 1, y);

if (Check(x - 1, y + 1) == true)

Open_Button(x - 1, y + 1);

if (Check(x, y - 1) == true)

Open_Button(x, y - 1);

if (Check(x, y + 1) == true)

Open_Button(x, y+1);

if (Check(x + 1, y - 1) == true)

Open_Button(x + 1, y - 1);

if (Check(x + 1, y) == true)

Open_Button(x + 1, y );

if (Check(x + 1, y + 1) == true)

Open_Button(x + 1, y + 1);

}

leftTag = false;

rightTag = false;

//显示周围未挖开点或问号点(改变背景颜色)

middleX = x;

middleY = y;

NeedToResume = true;

ChangeBackColor(x-1, y-1);

ChangeBackColor(x-1, y);

ChangeBackColor(x-1, y+1);

ChangeBackColor(x, y-1);

ChangeBackColor(x, y);

ChangeBackColor(x, y+1);

ChangeBackColor(x+1, y-1);

ChangeBackColor(x+1, y);

ChangeBackColor(x+1, y+1);

}

}

3.检查是否扫雷成功(是否已已经挖开所有非雷点)

private void GameState()

{

if (dig == Widths * Heights-Miles)

{

gameover = 1;

button1.Image = global::MineSweeping.Properties.Resources.Face4;

for (int x = 0; x < Widths; x++)

{

for (int y = 0; y < Heights; y++)

{

if (buttonarray[x, y].Text == "")

{

buttonarray[x, y].Text = " ";

remain--;

Fresh_Remain();

buttonarray[x,

y].Image=global::MineSweeping.Properties.Resources.Marked;

}

buttonarray[x, y].Text = " ";

}

}

timer1.Stop();

MessageBox.Show("恭喜你,扫雷成功,回去领赏吧", "成功");

Point p = new Point(pictureBox4.Location.X, pictureBox4.Location.Y + 23);

///检查是否超过英雄榜记录,如果超过,提示记录参赛大名!

if (MenuItem4.Checked == true)

{

if (time < least_Time)

{

least_Time = time;

Write_Name.ShowSelf(this,PointToScreen(p), "初级", ref least_Name) ;

}

}

if (MenuItem5.Checked == true)

{

if(time

{

middle_Time=time;

Write_Name.ShowSelf(this,PointToScreen(p), "中级",ref middle_Name);

}

}

if(MenuItem6.Checked==true)

{

if(time

{

highest_Time=time;

Write_Name .ShowSelf(this,PointToScreen(p),"高级",ref highest_Name );

}

}

}

}

4.随机布雷

private void Initialize_Miles(int index)

{

int total = Widths * Heights;

int s = 0, t, i;

int[] temp = new int[total];

int[] state=new int[total];

for ( i = 0; i < total; i++)

{

temp[i] = i;

state[i]=0;

}

int count = 0;

for (count = 0; count < Miles; count++)

{

Random r = new Random(System.Environment.TickCount / (count + 1) + System.Environment.TickCount - s);

s = r.Next(total - count);

t = temp[s];

if (state[t] != 1 && t != index ) //定义state,如果=1则该点已经布好了雷,不等于1则还未布雷,可以在这点布雷。

{

state[t] = 1;

}

temp[s] = temp[total - count - 1];

}

for (i = 0; i < total; i++)

{

int y = i / Widths;

int x = i - y* Widths;

if (state[i] == 1) //如果该点有雷

MileState[x, y] = -1;

else

MileState[x, y] = 0;

}

int [,] mmm=new int[Widths+2,Heights+2];

for (int x = 0; x < Widths+2; x++)

{

for (int y = 0; y < Heights+2; y++)

{

if (x == 0 || y == 0 || x == Widths + 1 || y == Heights + 1)

mmm[x, y] = 0;

else

mmm[x, y] = -MileState[x - 1,y - 1];

}

}

for (int x = 0; x < Widths; x++)

{

for (int y = 0; y < Heights; y++)

{

if (mmm[x + 1, y + 1] == 0)

{

MileState[x, y] = mmm[x, y] + mmm[x, y + 1] + mmm[x, y + 2] + mmm[x + 1, y];

MileState[x, y] += mmm[x + 1, y + 2] + mmm[x + 2, y] + mmm[x +

2, y + 1] + mmm[x + 2, y + 2];

}

}

}

}

5.以button显示雷区

for (x = 0; x < Widths; x++)

{

for (y = 0; y < Heights; y++)

{

this.buttonarray[x, y] = new System.Windows.Forms.Button();

this.buttonarray[x, y].Location = new System.Drawing.Point(20 + 20 * x, 60 + 20 * y);

this.buttonarray[x, y].Size = new System.Drawing.Size(20, 20);

this.buttonarray[x, y].UseVisualStyleBackColor = true;

this.buttonarray[x, y].Text = "";

this.buttonarray[x, y].MouseDown += new

System.Windows.Forms.MouseEventHandler(Mouse_Down);

this.buttonarray[x, y].MouseUp += new

System.Windows.Forms.MouseEventHandler(Mouse_Up);

this.buttonarray[x, y].MouseClick += new

System.Windows.Forms.MouseEventHandler(Mouse_Click);

this.Controls.Add(buttonarray[x, y]);

}

}

c语言课程设计——扫雷

扫雷设计 网101 陈超张艳 1.游戏规则 设计1010格区域,单击鼠标后,该格显示数字,则表示它周围8个空格内含有的地雷数,周围没有地雷的显示空白,则不能再单击了.如果是地雷,则游戏结束.如果判断是地雷,可以单击鼠标右键标出,显示红旗,要取消红旗标志则单击鼠标右键,当所有地雷都标出时,每个空格都处理过了,则胜利结束。 2.设计思路 扫雷程序主要用了一个10行10列的二维数组,数组的每个元素都是结构体类型,结构体中的num代表格内当前处于什么状态,值1表示有雷,值0表示已经变成空白格或者显示过数字,roundnum 统计每个格子周围有多少地雷,flag是鼠标右键的标志,如果flag为1表示格子显示红旗,这样鼠标左键点击在这个格子上无效。 在程序一开始统计好每个格子周围有多少地雷,然后当鼠标左键点击在没有地雷的格子上时进行两种判断,如果格子周围没有地雷,就在原来的格子位置显示空白格,然后用递归的方法同样判断周围的8个格子;如果格子周围有地雷,就在该空格显示具体的雷数。 在递归判断8个格子时,如果格子上有雷或者格子已经显示过雷数或者空白,以及格子上有红旗标志的话,就不再对格子进行任何判断。 具体函数流程图如下:

(1)main()主函数 定义使用到的常数,全局变量,函数原型说明。然后初始化图形系统,调用游戏控制函数,按任意键结束游戏,关闭图形系统,游戏结束。 (2)Control()游戏控制函数 调用函数GameBegain()显示游戏初始化界面,调用

GamePlay()函数具体实现游戏操作,该函数的返回值有可能有两种:一是正在玩中,提前结束游戏;一是玩完,要么失败,要么胜利。如果是前者,则重新开始游戏。如果是后者,则判断是否单击了笑脸,是则重新开始,否则结束程序。 (3)GameBegin()画初始界面 这个函数完成初始界面的设计以及随机生成地雷。初始界面的主要工作是确定图的位置和方格显示的位置。外边框的左上角为(190,60),右上角坐标为(390,290),显示笑脸和地雷数的区域为(190,60)~(390,90),每个方格的宽度和高度均为16. (4)DrawSmile()画笑脸 利用画椭圆的函数fillellipse()和bar()画笑脸,设置好填充模式。 (5)DrawEmpty()两种格子的显示 函数的参数为四个,确定格子的坐标i和j模式,颜色。格子有两种:一是可以单击的格子;一是已经显示空白的格子,比前一种格子小,通过参数模式和颜色来控制。 (6)DrawFlag()显示红旗 用单击鼠标右键表示起地雷,起雷后显示一个小红旗 (7)GamePlay()游戏控制 游戏过程主要是对鼠标按键的处理,集体算法实现如下: a.如果单击了鼠标左键则判断 如果单击了笑脸,则游戏重新开始‘

软件测试 扫雷游戏

软件测试 实验报告(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 测试对象评估 测试对象尚未完善,不符合现阶段测试质量要求,存在着一些缺陷,本测试需要进一步修正,重新进行测试。

扫雷教程

大家好。许多人现在都在玩一些刺激的网游,但许多人忽视了许多别的游戏。 现在,我开始教大家玩扫雷。
扫雷软件可以在 Windows 的“开始”—“程序”—“附件”—“游戏”中找到。 推荐大家使用 Minesweeper Clone 0.97,好处多多哦
可以从这里下载:https://www.doczj.com/doc/739054959.html,/Download/Minesweeper_Clone_0.97.exe
进入扫雷界面,会出现一大片方格:
先介绍一下操作吧: 鼠标左键可以打开方格 鼠标右键可以把方格标记为地雷 打开的方格里的数字表示本方格周围有几颗地雷。 如果一个方格周围已经标出的地雷数量和方格内数字相同,在方格上同时按左键和右键可以打开其余方格。
如果不幸踩雷,可以按
按钮重新来过,不想用鼠标的话可以按键盘上的 F2 键。
操作介绍完了,现在我们实际演练一盘,就先初级的开始吧:
咱先从这个阵学习先从简单学起

请看左下角的
如果会玩的一看当然就知道左下角的那个不是雷 为什么会知道呢? 这里有一个规律 当方格子里有 1 时就表示它周围的 8 个格子里肯定有一个是雷 从这个分析
看中间的 1 它周围有 5 个空 就表示有 5 个格子不是雷 看它左面的和下面的 1 也表示这两个不是雷 那么现在咱可以知道中间的 1 周围 8 个格子里有 7 个不是雷 下面咱就可以知道左下角的肯定是雷
你猜对了 咱知道这个了
在看最左面中间的那个 1 再看周围 8 个格子里 可是他周围不是 8 个 所以就考虑剩下的 6 个 还继续看那个 1 它周围有一个小红旗 表示已经有一个雷了 就表示它的周围已经有一个雷了所以剩下的几个格子都不是雷 咱就可以得到
你已经学会了最简单的部分了 下面咱再分析左上的那部分

扫雷游戏教案

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

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

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

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

C语言实现扫雷游戏

C语言实现扫雷游戏运行环境:Windows系统,V isualC++6.0 _head.h #ifndef _HEAD_H_ #define _HEAD_H_ #define XX 40 #define YY 20 typedef struct { char boom; char flag; //默认为0,1代表标记为雷,2代表翻牌 char recursionMark; //默认为0,1代表已经被递归} Node; extern Node node[YY][XX]; void randomBoom(int width, int high, int num); void gotoxy(int x, int y); int clear_boom(int width, int high, int y, int x); void myPrint(int i); #endif clear_boom.c #include #include #include #include"_head.h" /* 功能:递归翻牌 参数:int width, high 雷区的宽度和高度 int y, x 要翻牌的坐标 返回值:int 返回 1 代表输了 */ int clear_boom(int width, int high, int y, int x) { node[y][x].recursionMark=1; node[y][x].flag=2; //本方格标记为翻牌 gotoxy(2*x, y);

if(node[y][x].boom=='*')//如果是雷就输出字符'*',否则输出数字 printf("%-2c\b\b", node[y][x].boom); else myPrint(node[y][x].boom);//调用输出双字符函数 if(node[y][x].boom=='*') return 1; //返回1代表输了 else if(node[y][x].boom==0) //说明周围8个方向的方格没有雷,在8个方向上做上翻牌标记 { if(y-1>=0) //在该方格上面的雷区做翻牌标记 { if(x-1>=0 && node[y-1][x-1].flag==0) //标记左上方 { node[y-1][x-1].flag=2; //2代表翻牌,1代表地雷 gotoxy(2*(x-1), y-1); //跳转到方格处并翻牌 if(node[y-1][x-1].boom=='*')//如果是雷就输出字符'*',否则输出数字 printf("%-2c\b\b", node[y-1][x-1].boom); else myPrint(node[y-1][x-1].boom);//调用输出双字符函数 if(node[y-1][x-1].boom==0 && node[y-1][x-1].recursionMark==0)//递归调用 clear_boom(width, high, y-1, x-1); } if(node[y-1][x].flag==0) { node[y-1][x].flag=2; //标记正上方 gotoxy(2*x, y-1); //跳转到方格处并翻牌 if(node[y-1][x].boom=='*')//如果是雷就输出字符'*',否则输出数字 printf("%-2c\b\b", node[y-1][x].boom); else myPrint(node[y-1][x].boom);//调用输出双字符函数 if(node[y-1][x].boom==0 && node[y-1][x].recursionMark==0)//递归调用 clear_boom(width, high, y-1, x); } if(x+1

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

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

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

简版扫雷代码

#include #include #include #define MAX 100 //最大范围为100x100 struct place{ int show;//显示状态(-1为不显示,0为显示@,1为显示status ) char status;//身份(数字为周围8位地雷数,*为地雷,#号为边界标志) }; /*显示函数*/ void print_all(place mine_area[][MAX+2]){ for(int i=0;i<=MAX+1;i++){ for(int j=0;j<=MAX+1;j++){ if(mine_area[i][j].status<=8) printf("%d",mine_area[i][j].status+48); else if(mine_area[i][j].status=='#') printf("#"); else if(mine_area[i][j].status=='*') printf("*"); printf(":%d ",mine_area[i][j].show); } printf("\n"); } } void print_all(place mine_area[][MAX+2],int length,int width){ for(int i=0;i

C程序课程设计报告(扫雷游戏)

C程序设计 扫雷游戏 一、设计题目:扫雷游戏 二、设计目的 1.使学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。 2.培养学生综合运用所学知识独立完成课题的能力。 3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基

本素质。 5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对学生掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。 三、设计要求 1.汪洋和孔维亮组成设计小组。小组成员分工协作完成。要求每个成员有自己相对独立的模块,同时要了解其他组员完成的内容。 2.查阅相关资料,自学具体课题中涉及到的新知识。 3.采用结构化、模块化程序设计方法,功能要完善,界面要美观。 4.按要求写出课程设计报告,并于设计结束后1周内提交。 一概述 1)掌握数组指针的概念及其应用 2)培养团结合作精神 2. 课程设计的要求 要求我们有扎实的C语言知识,以及良好的编程习惯,能够熟练的应用循环,有毅力,还要求我们有较强的合作精神,善于总结。同时还要求我们自学C语言作图部分知识。在必要时还要上网查相关资料。 3.课程设计的主要设计思想 扫雷游戏主要用了一个10行10列的二维数组,刚开始利用random随机布雷。 每一个程序最主要的是算法。扫雷游戏算法的重点是一开始统计好每个格子周围有多少雷,当鼠标左键点在格子上时做出判断,如果周围8个格子有雷则显示出雷数,如果没有雷则显示空白格(在四个角的格子显示周围3个格子,其它边缘的格子显示周围5个的状态),我们在主函数中用两个for语句来判断周围雷数。我们还加了鼠标处理函数。 如果格子上有雷则调用函FailExitGame(),显示“Fail!”,游戏结束。若所有的雷都标出,且所有的格子都处理过,则调用函数ExitGame(),显示“OK,Good!”,游戏结束。游戏结束后,按任意键出去。

C语言扫雷源代码

C语言扫雷源代码.txt如果背叛是一种勇气,那么接受背叛则需要更大的勇气。爱情是块砖, 婚姻是座山。砖不在多,有一块就灵;山不在高,守一生就行。 #include #include #include #include /*鼠标信息宏定义*/ #define WAITING 0xff00 #define LEFTPRESS 0xff01 #define LEFTCLICK 0xff10 #define LEFTDRAG 0xff19 #define RIGHTPRESS 0xff02 #define RIGHTCLICK 0xff20 #define RIGHTDRAG 0xff2a #define MIDDLEPRESS 0xff04 #define MIDDLECLICK 0xff40 #define MIDDLEDRAG 0xff4c #define MOUSEMOVE 0xff08 struct { int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/ int roundnum;/*统计格子周围有多少雷*/ int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/ }Mine[10][10]; int gameAGAIN=0;/*是否重来的变量*/ int gamePLAY=0;/*是否是第一次玩游戏的标志*/ int mineNUM;/*统计处理过的格子数*/ char randmineNUM[3];/*显示数字的字符串*/ int Keystate; int MouseExist; int MouseButton; int MouseX; int MouseY; int up[16][16],down[16][16],mouse_draw[16][16],pixel_save[16][16]; void MouseMath()/*计算鼠标的样子*/ {int i,j,jj,k; long UpNum[16]={ 0x3fff,0x1fff,0x0fff,0x07ff, 0x03ff,0x01ff,0x00ff,0x007f, 0x003f,0x00ff,0x01ff,0x10ff,

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

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

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

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

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

c语言实现扫雷程序模拟

本人写的扫雷程序,由于时间紧迫,写的比较粗糙,但经过c编译可运行,下面是源代码: /*name:kaituozhe001saolei1125.cpp*/ #include #include #include #define N 9 int mine[N][N],game[N][N]; int row=0,col=0,a,b; void main() { void putmine(int n1); int expand(int row,int col); int Remain(); void myprintf1(); void myprintf2(); int aroundmine(int row,int col); /* 提示说明 */ printf(" -------------------------------------------------------------------\n* 您接下来要玩一个%d*%d的扫雷游戏。 *\n* 请按提示操作(否则会出意外的), *\n* 在这个游戏中“*”代表地雷,“#”代表未打开的盒子。 *\n* 当您将全部非雷盒子打开后,您就赢了! *\n* 谢谢参与游 戏!》》开拓者制作bo《《 *\n -------------------------------------------------------------------",N,N); int n1,i=0,j=0;

/*初始化雷区*/ for(i=0;i> ",N,N,N*N); scanf("%d",&n1); printf("\n下面是所布雷阵>> \n"); putmine(n1); myprintf1(); for(i=0;i> \n"); myprintf1(); while(Remain()!=n1) { printf("\n请输入扫雷坐标,以“,”分开>> "); scanf("%d,%d",&row,&col); for(i=0;i

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

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

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

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

c语言扫雷程序代码

#include #include #include #include #define Map_list 6 #define Map_line 6 void map_printf(int x,int y,int b[][Map_list]) { int i,j; for(i=0;i0&&b[i][j]<9) printf(" %d",b[i][j]); } printf("\n"); } } void Move(int x,int y) { HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); COORD pos= {x, y}; SetConsoleCursorPosition(hOut, pos); } int kb_cursor() { int a=getch(); char input[2]; if(a<0) { input[0]=a; input[1]=getch(); } else {

input[1]=a; } return input[1]; } void HideCursor() { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void printf_0(int b[][Map_list],int x,int y) { int i,j,n; if(x==0&&y==0) { n=0; for(i=0;i<2;i++) for(j=0;j<2;j++) if(b[x+i][y+j]==11) n++; if(n==0) { for(i=0;i<2;i++) for(j=0;j<2;j++) { if(b[x+i][x+j]==10) { b[x+i][y+j]=0; printf_0(b,x+i,y+j); } } } else b[x][y]=n; } else if(x==0&&y0) { n=0; for(i=0;i<2;i++) for(j=-1;j<2;j++) if(b[x+i][y+j]==11) n++; if(n!=0) b[x][y]=n; else for(i=0;i<2;i++)

扫雷小游戏课程设计

西安科技大学 软件工程课程设计报告 题目:扫雷游戏开发 班级:计科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 需实现的主要功能 用户可以自定义级别并且可以任意输入雷数; 具有计时功能,即显示用户完成移动盘子所花费的时间。

扫雷游戏设计代码(VB完善版)

扫雷游戏VB设计实现最终界面如下:

显然只需完成三个窗体的设计即可,具体设计界面和代码如下: 一、主窗体(form10)设计界面:

主窗体(form10)的代码: Dim d(11, 11) As Integer Dim k As Integer Dim v(100) As Integer '定义全局变量' Private Sub Command1_Click(Index As Integer) Timer1.Enabled = True '当点击任意一个命令按钮时(即开始游戏),则启动计时器' i = Index \ 10 + 1 j = Index Mod 10 + 1 '将二维数组的元素与命令按钮一一对应' If d(i, j) = 1 Then '判断是否点到地雷' Timer1.Enabled = False '关闭计时器,游戏结束' For i = 1 To 10 For j = 1 To 10 n = 10 * (i - 1) m = j - 1 If d(i, j) = 1 Then

Command1.Item(m + n).Picture = LoadPicture(App.Path & "\2.jpg") '在按钮上显示地雷图片' End If Form1.Show '弹出子窗体1(判断输赢)' Next j Next i Else If v(Index) = Index + 1 Then '判断是否插上红旗或是问号图片' Command1.Item(Index).Picture = LoadPicture() '清除图片' Command1.Item(Index).Caption = f(i, j) '调用函数,显示周围地雷数' Command1.Item(Index).Enabled = False '将按钮设为不可用' Label7.Caption = Val(Label7.Caption) + 1 v(Index) = 0 End If h = s(i, j) '调用函数,显示周围的情况(边界)' For Y = 0 To 99 If v(Y) = Y + 1 Then Command1.Item(Y).Enabled = True '如果是按钮插上了红旗则将按钮设置为可用' End If Next Y End If

扫雷游戏教程技巧大全

扫雷游戏教程技巧大全 扫雷软件可以在Windows的“开始”—“程序”—“附件”—“游戏”中找到。进入扫雷界面,会出现一大片方格: 先介绍一下操作吧:鼠标左键可以打开方格,鼠标右键可以把方格标记为地雷,打开的方格里的数字表示本方格周围有几颗地雷。如果一个方格周围已经标出的地雷数量和方格内数字相同,在方格上同时按左键和右键可以打开其 余方格。如果不幸踩雷,可以按按钮重新来过,不想用鼠标的话可以按键盘 上的F2键。操作介绍完了,现在我们实际演练一盘,就先初级的开始吧: 咱先从这个阵学习先从简单学起,请看左下角的 如果会玩的一看当然就知道左下角的那个不是雷,为什么会知道呢?这里有一个规律当方格子里有 1 时就表示它周围的 8 个格子里肯定有一个是雷,从这个分析 看中间的 1 它周围有 5 个空就表示有 5 个格子不是雷,看它左面的和下,的 1 也表示这两个不是雷,那么现在咱可以知道中间的 1 周围 8 个格子里有 7 个不是雷,下面咱就可以知道左下角的肯定是雷

在看最左面中间的那个 1 再看周围 8 个格子里可是他周围不是 8 个所以就考虑剩下的 6 个 还继续看那个 1 它周围有一个小红旗表示已经有一个雷了,就表示它的周围已经有一个雷了所以剩下的几个格子都不是雷 咱就可以得到 你已经学会了最简单的部分了,下面咱再分析左上的那部分 先用我上面给你介绍的那种方法,把下面三个 1 上面的两个格子解出来 可以得到 这时你是不是有点迷惘不知道怎么点了?别着急咱继续分析,看到这块右面的下面的 2 了吗?,它就表示它的周围有 2 颗雷但咱已经分析出已经有一个是雷了,还有它周围还剩下 1 个未知的格子还有6个已知的格子,所以咱就可以判断出刚才那个雷的上面还是个雷,咱们就可以得到 再看左边的那个 2 这时它周围已经有两个雷了,所以咱就可以把剩下的三个格点开,咱就可以知道 这时 2 上面还是 2 并且它周围已经有两颗雷 我们就可以把这部分解出来

Java扫雷游戏源代码

import java.awt.BorderLayout; import java.awt.Container; import java.awt.Font; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.Timer; public class ScanLei1 extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private Container contentPane; private JButton btn; private JButton[] btns; private JLabel b1; private JLabel b2; private JLabel b3; private Timer timer; private int row=9; private int col=9; private int bon=10; private int[][] a; private int b; private int[] a1; private JPanel p,p1,p2,p3; public ScanLei1(String title){ super(title); contentPane=getContentPane(); setSize(297,377); this.setBounds(400, 100, 400, 500); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); timer =new Timer(1000,(ActionListener) this); a = new int[row+2][col+2]; initGUI(); } public void initGUI(){ p3=new JPanel();

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

扫雷游戏 开发成员:代禄礼 学号: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

相关主题
文本预览
相关文档 最新文档