使用GTK+库实现一个扫雷程序

使用GTK+库实现一个扫雷程序
使用GTK+库实现一个扫雷程序

使用GTK+库实现一个扫雷程序

目录

目录 (1)

1 最基本的GTK+程序 (2)

2 事件处理与界面布局 (6)

3 扫雷程序 (10)

1 最基本的GTK+程序

1.1 GTK库的主要功能

GTK+,这个库实现的功能有,

1 图形显示 (Display)

2 事件处理 (Event)

1.2 GTK库的基本要素

GTK+的主要函数和数据结构包括以下三个部分:

1 控制流程(Control Flow)

2 控件管理(Manage Widget)

3 事件处理(Dispose Event)

1.3 一个最基本的GTK+程序

现在以一个简单的程序进行说明:

代码:simple.c

----------------------------------------

01 #include

02

03 int main(int argc, char**argv)

04 {

05 GtkWidget *window;

06 GtkWidget *label;

07 gtk_init(&argc, &argv);

08 window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

09 g_signal_connect(G_OBJECT(window), "delete_event",

10 gtk_main_quit, NULL);

11 label=gtk_label_new("GTK+");

12 gtk_container_add(GTK_CONTAINER(window), label);

13 gtk_widget_show_all(window);

14 gtk_main();

15 return 0;

16 }

----------------------------------------

对代码进行简单说明:

01 控制流程

gtk_init,gtk_main是控制流程函数,gtk_init是建立GTK 程序的初始化环境,gtk_init可以接受命令行参数。而gtk_main 函数则开始GTK函数的主循环。此外,还有一gtk_main_quit函数,它的功能是退出gtk环境。

02 控件和控件管理

这部分的函数和数据结构占据了GTK+库的大部分。

GtkWidget就是控件的数据结构,这个程序里有两个控件,window和label,window是程序的主窗口控件,而label是附着于程序窗口上一个显示文字内容(这里文字内容是“GTK+”)的控件。

gtk_window_new将创建一个窗口,它接受参数以生成不同类型的窗口,这里的参数是GTK_WINDOW_TOPLEVEL。gtk_label_new将生成一个带有文字内容的控件。gtk_widget_show_all用来显示窗口。

关于窗口控件,它们之间有一个树型关系,即顶层窗口包含子窗口,子窗口又可以包含新的子窗口。子窗口只有一个上层窗口作为,但可以包含多个子窗口(树型关系)。在这个程序里,gtk_container_add即把label作为子窗口添加到window窗口中。

03 事件处理

关于事件,包含有:鼠标的点击、键盘的输入。

事件处理函数负责把这些事件绑定到控件上,并指定事件发生时的处理函数。

在这个程序里,g_signal_connect函数把delete_event事件绑定到window控件上,并且指明了当发生这一件事件时,调用gtk_main_quit函数。即退出GTK+环境。

总结:GTK+程序流程

1 初始化环境

在main函数的一开始处调用gtk_init函数,标志着进入GTK+环境。

2 生成控件

使用各种可以创建控件的函数(*_widget_new,比如gtk_window_new,gtk_label_new)创建控件。

3 关联各个控件间关系

即使用gtk_container_add函数将各个控件组织成“一棵树”。

4 绑定各种事件到控件上

使用g_signal_connect函数把事件及发生事件时调用的函数绑定到控件上。

5 显示根窗口

使用gtk_widget_show函数显示根窗口控件。

6 启动GTK+主函数

调用gtk_main函数进入事件处理循环。

7 关联根窗口退出事件

使用

g_signal_connect(G_OBJECT(window), "delete_event", gtk_main_quit, NULL);

函数将退出事件绑定到跟窗口以退出GTK环境,释放资源。

2 事件处理与界面布局

2.1 事件处理

所谓的事件 (event), 在这里用来描述执行过程中所遇到的状况。键盘输入,鼠标的移动,计时通知等等,皆是硬件的事件.。大家很容易就能想象事件发生的原因跟过程。来自软件本身产生的事件则不这么明确. 例如一个 button 被按下的事件,窗口大小被调整的事件, 画面需要更新的重绘事件, 档案内容被更新的事件……许多都是依系统的设计而被定义出来的。

在 GTK 中在每个 widget 上都可能会发生好几种事件。事实上,在程序设计时多半都是在写如何处理各种事件。这些事件处理的function (event handler) 以 g_signal_connect() 注册到指定的 widget 中。

让指定的 object 在发生 name 事件时呼叫 func (可指定自己的额外参数 func_data):

guint g_signal_connect (GObject *object,

const gchar *name,

GCallback func,

gpointer func_data);

返回值

代表这个 signal connection 的 id。

object

要处理事件的对象。我们用的widget 可以通过 G_OBJECT() 转换, 如G_OBJECT(window).

name

事件的名称, 请参考 GTK 文件上的列表.

func

当事件发生后会呼叫这个 callback function.

func_data

提供给 func 的额外数据. 一般不需提供而使用 NULL. callback function的参数和返回值格式最正确的格式可以在

GTK 的参考手册中各个 widget 的Signal Prototypes列表里查到。例如GtkButton下的几个:

"clicked" void user_function(GtkButton *button,

gpointer user_data); "enter" void user_function(GtkButton *button,

gpointer user_data); "leave" void user_function(GtkButton *button,

gpointer user_data);

要在 button 被按下时执行某个 function 我们可以 connect 那个 function 到 button 的 "clicked" 事件. 用:

void on_clicked()

{

g_print("Hello world!\n");

}

....

g_signal_connect(G_OBJECT(button), "clicked",

G_CALLBACK(on_click), NULL);

在自己定义的callback function中传回TRUE表示这个事件已经被处理完毕。传回FALSE则GTK会继续找是否还有其它合适的event handler。

2.2 界面布局

GTK 中用 box 来排放 widget 可说是最常见也最容易写的. 一个 box 的功能主要是容纳以及计算里面 widget 的大小, 最后决定自己要占用的空间大小. Box 又分为 HBox 跟 VBox. HBox 把里面的 widget 以左右横排, vbox 则上下直排.

hbox 跟vbox 的建立跟基本的widget 一样, 各为gtk_hbox_new() 和 gtk_vbox_new(), 不过需要提供两个参数: homogeneous (每个格子等宽/等高) 及 spacing (格子之间的距离, 单位为 pixel).

GtkWidget *box1;

GtkWidget *box2;

box1=gtk_hbox_new(FALSE, 4); /* 不等宽, 间隔 4px */ box2=gtk_vbox_new(TRUE, 0); /* 等高, 无间隔 (0px) */

将 widget 放入 box 里可以使用 gtk_box_pack_start() 或是gtk_box_pack_end() 两个function. gtk_box_pack_start()

会将 widget 依从左到右 (hbox) 或从上到下 (vbox) 的顺序找位置存放, gtk_box_pack_end() 则是倒着放过来.

3 扫雷程序

程序中出现的数据类型以及函数请自行参阅GTK+文档。

功能分析

在挖雷的过程中,玩家可以掀开或标记某个格子,假如掀开的格子有地雷,游戏结束。否则显示周围有多少地雷。游戏中也应该提供一个数字,避免让玩家需要计算剩下多少地雷。当所有不含地雷的格子都被掀开后,恭喜玩家并结束游戏,此外也需要计算游戏时间,以反映玩家对游戏的熟练程度。至于其它功能如

提供玩家改变地雷数目,格子数目等等,目前不考虑包含。

具体实现

格子:

struct block

{

gint count; /* 周围有多少地雷 */

gboolean mine; /* 是否藏有地雷 */

gboolean marked; /* 是否被标记过 */

gboolean opened; /* 是否已被掀开 */

GtkWidget *button;

};

雷区:

static struct block *map; /* 地雷区资料 */

static gint width=10; /* 地雷区宽度 */

static gint height=10; /* 地雷区高度 */

static gint mines=20; /* 地雷数量 */

布雷:

/* 以随机数安置地雷 */

gint size=width*height;

gint i=0;

while(i

gint index;

gint row, col;

index=g_random_int_range(0, size);

if(map[index].mine==TRUE) /* 已有地雷 */

continue;

map[index].mine=TRUE;

row=index/width;

col=index%width;

/* 四周格子的 count 加一 */

if(row>0){

/* 左上 */ if(col>0) map[index-width-1].count++;

/* 正上 */ map[index-width].count++;

/* 右上 */ if(col

}

/* 左 */ if(col>0) map[index-1].count++;

/* 右 */ if(col

if(row

/* 左下 */ if(col>0) map[index+width-1].count++;

/* 正下 */ map[index+width].count++;

/* 右下 */ if(col

}

i++;

}

全局数据:

static GtkWidget *mine_label; /* 显示剩余地雷数 */ static GtkWidget *time_label; /* 显示游戏时间 */

static gint button_size=16; /* button 大小 */

设置界面及关联事件处理函数:

GtkWidget *vbox;

GtkWidget *hbox;

GtkWidget *label;

gint i, j index;

vbox=gtk_vbox_new(FALSE, 0);

/* 存放 label 的第一个 hbox */

hbox=gtk_hbox_new(FALSE, 0);

label=gtk_label_new("Mines:");

gtk_box_pack_start(GTK_BOX(hbox), label,

FALSE, FALSE, 4);

mine_label=gtk_label_new("0");

gtk_box_pack_start(GTK_BOX(hbox), mine_label, FALSE, FALSE, 2);

label=gtk_label_new("Time:");

gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 4);

time_label=gtk_label_new("0");

gtk_box_pack_start(GTK_BOX(hbox), time_label, FALSE, FALSE, 2);

gtk_widget_show_all(hbox);

gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);

/* width x height 个 button 的格子 */

for(i=0, index=0; i

hbox=gtk_hbox_new(FALSE, 0);

for(j=0; j

GtkWidget *button;

button=gtk_button_new();

gtk_widget_set_usize(button,

button_size, button_size);

g_object_set(G_OBJECT(button),

"can-focus", FALSE, NULL);

gtk_box_pack_start(GTK_BOX(hbox),

button, FALSE, FALSE, 0);

gtk_widget_show(button);

g_signal_connect(G_OBJECT(button), "button-press-event",

G_CALLBACK(on_mouse_click),

(gpointer)index);

map[index].button=button;

index++;

}

gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);

gtk_widget_show(hbox);

}

注意:

g_signal_connect(G_OBJECT(button),

"button-press-event",

G_CALLBACK(on_mouse_click),

(gpointer)index)

这一函数将事件”button-press-event”关联到函数on_mouse_click()上了。

鼠标点击事件的处理:

函数用到的全局数据

static gint opened_count; /* 已经掀开多少格子 */ static gint marked_count; /* 已经标记多少格子 */ static gboolean game_over; /* 游戏是否已结束 */

函数:on_mouse_click

01 gboolean on_mouse_click(GtkWidget *widget,

02 GdkEventButton *event,

03 gpointer data)

04 {

05 gint index;

06 gint row, col;

07 gchar buf[4];

08

09 if(game_over==TRUE) return TRUE; /* 游戏已结束 */

10

11 index=(gint)data;

12

13 switch(event->button){

14 case 1: /* 鼠标左键 */

15 /* 从 index 算出发生事件格子的行列 */

16 row=index/width;

17 col=index%width;

18 /* 掀开格子 */

19 open_block(col, row);

20 break;

21 case 2: /* 鼠标中键 */

22 break;

23 case 3: /* 鼠标右键 */

24 /* 已掀开的格子不做记号 */

25 if(map[index].opened==TRUE)

26 break;

27 /* 原来有记号则消掉, 沒有则画上记号 */

28 if(map[index].marked!=TRUE){

29 map[index].marked=TRUE;

30 gtk_button_set_label(

31 GTK_BUTTON(widget), "@");

32 marked_count++;

33 }else{

34 map[index].marked=FALSE;

35 gtk_button_set_label(

36 GTK_BUTTON(widget), "");

37 marked_count--;

38 }

39 /* 显示新的地雷数 */

40 g_snprintf(buf, 4, "%d",

41 MAX(0, mines-marked_count));

42 gtk_label_set_text(GTK_LABEL(mine_label), buf);

43 }

44

45 return TRUE;

46 }

说明:

第09行检查游戏是否已经结束。若游戏已结束,玩家按下button 也没有反映。

第11行将callback接受的data换成数字的index来使用。这个index也就是在g_signal_connect()

中每个button自己的index。

第19行使用了open_block()來掀开指定的格子。 open_block()是接下來要说明的函数。

第45行传回TRUE表示這个事件已经被处理完毕, GTK不需要再寻找其他callback function处理。

函数:open_block()

特别说明:

當玩家掀开一块周围完全沒有地雷的格子时 (count=0), 可以安全的掀开周围的八个格子. 若这八个格子之中又有遇到相同的情況则那个格子周围又可以继续掀开. 因此我们准备了open_block 這个重复呼叫自己的 recursive function, 并由它來检查遊戏是否结束.

01 void open_block(gint x, gint y)

02 {

03 gint index;

04 GtkWidget *button;

05

06 index=x+y*width;

07

08 if(game_over==TRUE || map[index].marked==TRUE)

09 return; /* 游戏已结束或防止玩家误翻有记号的格子 */

10

11 button=map[index].button;

gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(butto n),

13 TRUE); /* 改变 button 状态为按下 */

14

15 if(map[index].opened==TRUE) /* 掀开的格子保持按下状态即可 */

16 return;

17

18 map[index].opened=TRUE; /* 格子状态为掀开 */

19

20 if(map[index].mine==TRUE){ /* 若藏有地雷 */

21 gtk_button_set_label(GTK_BUTTON(button), "*");

22 gameover(FALSE); /* 踩到地雷游戏結束 */

23 return;

24 }

25

26 if(map[index].count>0){ /* 若周围有地雷 */

27 gchar buf[2];

28 g_snprintf(buf, 2, "%d", map[index].count);

29 gtk_button_set_label(GTK_BUTTON(button), buf);

30 }

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.如果单击了鼠标左键则判断 如果单击了笑脸,则游戏重新开始‘

扫雷小游戏课程设计

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

扫雷教程

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

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

Java语言 扫雷游戏完整源代码

import javax.swing.ImageIcon; public class Block { String name; //名字,比如"雷"或数字int aroundMineNumber; //周围雷的数目 ImageIcon mineIcon; //雷的图标 boolean isMine=false; //是否是雷 boolean isMark=false; //是否被标记 boolean isOpen=false; //是否被挖开 public void setName(String name) { https://www.360docs.net/doc/bd4290631.html,=name; } public void setAroundMineNumber(int n) { aroundMineNumber=n; } public int getAroundMineNumber() { return aroundMineNumber; } public String getName() { return name; } public boolean isMine() { return isMine; } public void setIsMine(boolean b) { isMine=b; } public void setMineIcon(ImageIcon icon){ mineIcon=icon; } public ImageIcon getMineicon(){ return mineIcon; }

public boolean getIsOpen() { return isOpen; } public void setIsOpen(boolean p) { isOpen=p; } public boolean getIsMark() { return isMark; } public void setIsMark(boolean m) { isMark=m; } } import java.util.*; import javax.swing.*; public class LayMines{ ImageIcon mineIcon; LayMines() { mineIcon=new ImageIcon("mine.gif"); } public void layMinesForBlock(Block block[][],int mineCount){ int row=block.length; int column=block[0].length; LinkedList list=new LinkedList(); for(int i=0;i0){ int size=list.size(); // list返回节点的个数 int randomIndex=(int)(Math.random()*size);

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

中原工学院信息商务学院 课程设计报告 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、自动保存扫雷英雄榜。

原创C语言扫雷程序大作业代码

#include #include #include #define random(x) (rand()%x) int n=0;//-------------------------------------------完成度判断 int bomb[12][12]={{},{},{},{},{},{},{},{},{},{},{},{},};//地雷分布(地雷1、无雷0) int tru[10][10]={{},{},{},{},{},{},{},{},{},{}};//真相数组[truth](地雷数、地雷*、误判/、空白O)int tbl[12][12]={{' ','X',1,2,3,4,5,6,7,8,9,10}, {'Y','+','-','-','-','-','-','-','-','-','-','-'}, {1,'|','_','_','_','_','_','_','_','_','_','_'}, {2,'|','_','_','_','_','_','_','_','_','_','_'}, {3,'|','_','_','_','_','_','_','_','_','_','_'}, {4,'|','_','_','_','_','_','_','_','_','_','_'}, {5,'|','_','_','_','_','_','_','_','_','_','_'}, {6,'|','_','_','_','_','_','_','_','_','_','_'}, {7,'|','_','_','_','_','_','_','_','_','_','_'}, {8,'|','_','_','_','_','_','_','_','_','_','_'}, {9,'|','_','_','_','_','_','_','_','_','_','_'}, {10,'|','_','_','_','_','_','_','_','_','_','_'}}; //棋盘数组[table](坐标系|-12、地雷数、红旗P、地雷*、爆炸X、误判/) int main()//---------------------主函数 { welcome(); do { game(); } while (n<=9);//未胜利,继续进行游戏 if(n==10) printf("Mission succeed!\n");//全部地雷标记完成,胜利 else printf("Mission failed!\n");//n=11,引爆地雷,失败 return 0; } int welcome() { int i,j,m,a,num; printf("Hello,welcome to Bomb Hunter!\nFirst of all,please input the number of bombs(eg:30):\n"); scanf("%d",&num); printf("Now let's begin,good luck!\n"); srand((int)time(0)); for (m=0;m

扫雷游戏设计代码(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

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!”,游戏结束。游戏结束后,按任意键出去。

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

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

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

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

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

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

扫雷游戏的设计与开发1

扫雷游戏的设计与开发 摘要 本论文研究的是以Visual Basic 6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。 本次设计只是完成了扫雷游戏的基本功能,在细节方面仍有待以后完善。 关键词:扫雷;Visual Basic 6.0;事件;递归

The Design and Development of Mine Game Abstract What my thesis research for is basic on the develop environment of Visual Basic 6.0 , design and develop a mine game,its function is similar to the mine games of the Windows Operating System .The thesis has introduced the layout of mined areas and the method of how to create the mines at random. It use vairies of components in Visual Basic 6.0 and the combination of some simple calculations; the thesis lays emphasis on introducing the processing of each event in the game. Among these events ,the mouse event and the event of clearance of the area which isn’t close to the mine field are much more important.The theory of mouse event is that the intention of user is learned by the information sent out by the mouse and then the program runs according to the information .The other event is simplified by the introduction of the concept of recursion. This design has been completed the basic function of mine game. The details still need to be improved. Key words: Mine game, Visual Basic 6.0, Affairs, Recursion

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

扫雷游戏Java源代码详解

扫雷游戏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();

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

课程设计 题目扫雷游戏 学院计算机学院 专业软件工程 班级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++)

实用文库汇编之扫雷游戏代码

*实用文库汇编之/*block.h*/* #ifndef BLOCK_H_ #define BLOCK_H_ #include class QWidget; class Block:public QLabel { Q_OBJECT public: explicit Block(bool mine_flag,QWidget*parent=0); void set_number(int number); void turn_over(); bool is_mine()const; bool is_turn_over()const; signals: void turn_over(bool is_mine); protected: void mousePressEvent(QMouseEvent*event); private: bool mine_flag_; bool mark_flag_; bool turn_over_flag_; int number_; }; #endif #include"block.h" #include #include #include #include Block::Block(bool mine_flag,QWidget*parent) :QLabel(parent) { mine_flag_=mine_flag; mark_flag_=false; turn_over_flag_=false; number_=-1; setPixmap(QPixmap(":/images/normal.png"));

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

《WINDOWS程序设计》 课程设计报告 题目:扫雷游戏设计 专业: 班级: 姓名: 指导教师: 成绩: 学院 二〇一六年十一月十五日

目录 1.设计目的及意义 (3) 2.游戏基本操作内容 (3) 2.1 游戏玩法 (3) 2.2 游戏的基本操作 (4) 2.3 扫雷的设计原理 (4) 2.4总体游戏过程分析 (5) 3.游戏设计过程 (6) 3.1基本设计类及流程图 (6) 3.2 设计过程 (7) 4.设计结果及分析 (24) 4.1结果 (24) 4.2问题: (25) 5.心得体会: (25) 6.参考文献 (26)

1.设计目的及意义 在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。 扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。 即:设计一个功能与Windows中的挖雷游戏相同的小游戏。 1.培养学生综合运用所学知识独立完成课题的能力。 2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。3.提高对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质。4.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。 5.培养从资料文献、科学实验中获得知识的能力,提高从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核 2.游戏基本操作内容 2.1 游戏玩法: 游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过 24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。2.2 游戏的基本操作:

相关文档
最新文档