1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 用c语言写扫雷游戏倒计时代码 课内资源 - 基于VS实现的扫雷小游戏

用c语言写扫雷游戏倒计时代码 课内资源 - 基于VS实现的扫雷小游戏

时间:2021-12-17 16:17:39

相关推荐

用c语言写扫雷游戏倒计时代码 课内资源 - 基于VS实现的扫雷小游戏

1.任务概述

1.1 系统总体目标

本项目的目的在于开发一个扫雷软件,该软件面向游戏玩家用户,具有进行扫雷游戏的功能。游戏玩家将使用系统中的如下功能:

进行游戏

使用自定义游戏规格功能

使用计时器功能

使用高分榜功能

2.2 运行环境需求操作系统:Windows 10

开发环境:VS

2.数据需求与概要设计

2.1 数据描述

本系统涉及的对象包括方格中是否有方格状态(是否有雷)(fangge[X][Y]),产雷(lei[k]),方格是否打开(Click[X][Y]),方格内数字(number[X][Y]),是否被红旗标记(Flag[X][Y]),是否被左右键点下(LeftClick[X][Y]、RightClick[X][Y]),周围红旗标记数(flagnumber[X][Y]),游戏是否胜利(win_or_lose)等。(X、Y代表方格坐标)

对于特定的方格:

方格附近的雷数决定方格显示的数字是多少

方格是否被打开(方格状态)决定是否显示雷或数字

左右键点下同时标记数等于雷数以后打开未被标记的方格

方格中有雷被打开为游戏失败

雷是否全被找出(雷状态)决定游戏是否胜利

然后给出每类对象的详细属性列表,如:

雷:位置(随机函数布雷)(lei[k]=0~X*Y)

方格是否有雷:有/无(fangge[X][Y]=1/0)

方格状态:点开/未被点开(Click[X][Y]=1/0)

红旗:被标记/未被标记(flag[X][Y]=1/0)

方格内数字:0~8不等(number[X][Y]=0~8)

雷状态:被排完/未被点到/被点到(win_or_lose=1/0/-1)

周围红旗数:0~8不等(flagnumber[X][Y]=0~8)

2.2 数据字典

本系统将游戏数据分别装在View类和其他类中描述,游戏所具有的数据项的详细定义见表X。

数据项

名称

类型

长度精度

能否为空

编码规划或定义域说明

备注

fangge[50][50]

整数数组

50*50

NO

有:1 无:0

记录是否有雷

Click[50][50]

整数数组

50*50

NO

点开:1 无:0

记录是否被点开

number[50][50]

整数数组

50*50

NO

0~8

记录方框内数字

flag[50][50]

整数数组

50*50

NO

是:1 否:0

记录是否被红旗标记

LeftClick[50][50]

整数数组

50*50

NO

是:1 否:0

记录左键是否点下

RightClick[50][50] flagnumber[50][50]

整数数组 整数数组

5050 5050

NO NO

是:1 否:0 0~8

记录右键是否点下 记录周围红旗数

i j k

坐标 坐标 雷

整数 整数 整数

1 1 1

NO NO NO

0~X 0~Y 0~雷数

横坐标 纵坐标 雷循环变量(布雷)

lei[50]

整数数组

50

NO

产雷上限50

X

整数

1

NO

0~50

游戏界面长

Y

整数

1

NO

0~50

游戏界面宽

Mine_number

整数

1

NO

0~50

雷数

win_or_lose

整数

1

NO

胜:1 未结束:0 败:-1

是否胜利

Time second

时间

整数 整数

1 1

NO NO

未:0 开始:1 0~游戏时间

开始计时标志 计时

a _x _y set_mine

规格

对象 整数 整数 整数

1 1 1

NO NO NO NO

通过对话框控制游戏规格 0~最大规格 0~最大规格 已进行布雷:1 未进行布雷:0

全局变量( GAMESIZE) 记录鼠标点击横方格 记录鼠标点击纵方格 是否布雷

win

胜利

整数

1

NO

胜利:1 未胜利:0

全局变量记录是否胜利

game_time

时间

整数

1

NO

值:second

全局变量 记录游戏时间

2.3 数据内外部存储

2.3.1 游戏数据的内外存存储

游戏数据在内存中以数组形式保存,游戏玩家姓名数据在外存中保存成数据文件,文件格式定义如下:highscore.txt。

2.4 数据流说明

在此处说明各类数据的大致处理流程,可以用数据流图或文字进行说明,数据流图的画法请自己参考相关文档。

高分榜处理流程:

由用户输入名字,存储到相应文件中

用户打开高分榜

打开相应文件,进行读取和显示

3.功能需求与概要设计

总体功能:进行扫雷游戏

3.1功能划分

本软件的功能划分成如下几个模块:

设置游戏规格

记录玩家姓名

进行扫雷游戏

游戏内计时器

玩家高分榜

3.2 功能描述

3.2.1 设置游戏规格

进入游戏前,弹出对话框,进行设置游戏界面规格,可设置游戏区域长、宽、雷数。

实现过程

定义全局变量,在游戏开始后输入行数、列数、雷数,传递给CSaoLeiView进行变量初始化(初始化为10/10/10)。

3.2.2 记录玩家姓名(SetName)

弹出对话框,要求玩家输入玩家姓名,便于之后记录游戏数据(高分榜)。若游戏胜利且时间少于高分榜上玩家,则添加游戏记录。

实现过程

定义全局变量,在游戏开始后储存玩家姓名(m_name),之后等待是否需要被传递。

3.2.3 进行扫雷游戏(CSaoLeiView)

左键单击界面开始游戏,若为空格(实际为数字0)则展开至周围全为数字,数字则显示数字,右键可标记雷,左右键同时点击可进行排雷(周围红旗数等于雷数使打开未被标记的方格)。全部雷被排以后显示游戏胜利(笑脸),有雷被点开显示游戏失败(哭脸)。

实现过程

对于单个的方格显示:首先判断是否被点开,若被点开则判断是否有红旗标记,若有标记显示红旗,无则显示未点开;若被点开,则判断该方格是否有雷,若有则显示雷,同时游戏失败,显示哭脸。无则打开方格,显示数字;若数字为0,则打开附近的方格;若游戏进行到所有雷都被排出,或者只剩下雷未被点开,则游戏胜利,显示笑脸。

布雷(SetMine()):调用随机函数(非伪随机)产生0~X*Y的数字,分别放到相应的方格中(布雷),若重复,则再次布雷。

展开(SetClick()):判断方格是否为空(0)且处于打开状态,则打开周围八格;之后遍历每格,进行打开方格。

计算数字(SetNumber()):通过对方格不同位置的讨论,如顶点,边,中心,进行方格数字的计算。

计算红旗(SetFlagNumber()):基本计算方法同上,计算周围红旗的数目。

右键标记:由右键函数对相应数组进行操作,点下后该位置记为1,未点下则记为0。

左右键排雷:由左键函数和右键函数对相应数组进行操作,当两数组同时为1则进行判断:周围红旗数是否等于雷数,若相等则打开未被标记的方格。

判断游戏结果:仅剩所有雷未被点开,即可获得游戏胜利。

构造函数:初始化各类变量(基本为0),接受设置窗口传来的游戏规格变量。

OnCreate():设立计时器SetTimer()。

OnDraw():首先进行布雷,计算方格中的数字,计算周围的红旗数(用于左右键),点击结算操作。之后输出方格、游戏界面(显示方法见上)、计时器(分三数字展示),判断是否胜利(游戏结束后关闭计时器)。

OnIDGaofen():将高分榜添加到游戏界面上(定义高分榜的全局变量,将参数值传递过来)。

OnLButtonUp():点下后开始计时,若游戏未结束,对点击位置进行计算,判断位于哪个方格,记录点击,调用OnDraw()。

OnRButtonUp():同上(添加再次点击取消小红旗功能)。

OnTimer():与之前设立的计时器相连,游戏开始后开始计时,每1s重画一次计时器区域。

3.2.4 游戏内计时器

左键点击游戏界面以后开始计时,游戏结束以后停止计时。

实现过程

之前设置SetTimer函数,在OnTimer中进行计时操作。首先判断游戏是否开始(由单一变量Time记录),左键点下以后开始计时,并以三位数的形式显示在游戏区域左上方;之后判断游戏是否结束(win_or_lose),结束后停止计时,储存在全局变量中,等待是否传递给高分榜。

3.2.5 玩家高分榜

游戏胜利后,若游戏时间比之前高分榜上游戏玩家用时少,则记录新的游戏记录和玩家,下次打开游戏使用高分榜功能时也能够看到本次记录。高分榜记录前三名用时最少的历史玩家。

实现过程

开启一个字符数组用于存放用户名,整数数组用于存放游戏时间(长度均为3,记录前三名玩家)。使用全局变量,传递游戏时间和用户名;定义文件指针进行读写。按一定格式对文件内容进行读取,调用Sort函数,进行排序;输出排序后的前三名到高分榜对话中,同时输出到文件中,覆盖之前的文件内容。

Sort():按时间进行排序,用时少的排在前面。

4.游戏截图

游戏参数设置

设置玩家昵称

游戏初始界面

游戏中

高分排行榜

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。