C++ 扫雷程序输出报告

合集下载

C语言实现扫雷附完整代码

C语言实现扫雷附完整代码

C语⾔实现扫雷附完整代码⽬录⼀、理清逻辑⼆、创建⽂件三、具体步骤1.打印菜单2.创建⼆维数组3.初始化⼆维数组并打印棋盘4.布置雷5.排查雷(内含判断胜负)四、完整代码五、待改进⼀、理清逻辑我们先来看⼀下实现扫雷的基本逻辑1.打印游戏菜单2.创建并初始化⼆维数组3.布置雷4.进⾏排雷⼆、创建⽂件我创建了三个⽂件,分别为test.c、game.h和game.ctest.c⽂件⽤于实现进⼊游戏、退出游戏、判断输赢、打印菜单等逻辑game.c⽤于编写游戏的主要实现⽅法game.h存放头⽂件和函数的声明三、具体步骤1.打印菜单void menu(){printf("**********************************\n");printf("*********** 1.start **********\n");printf("*********** 0. exit **********\n");printf("**********************************\n");}void test(){int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请输⼊:>");scanf("%d", &input);switch (input){case 1:printf("游戏开始\n");game();break;case 0:printf("游戏结束\n");break;default :printf("⾮法输⼊,请重新输⼊\n");break;}} while (input);}2.创建⼆维数组因为我们想实现⼀个9*9的扫雷,所以考虑到数组越界的问题,我们要创建⼀个11*11的⼆维数组,需要同时去创建两个⼆维数组,mine数组⽤来查看雷的位置和show数组来展⽰排雷过程。

C程扫雷实验报告

C程扫雷实验报告
srand((unsigned)time(NULL));
for(m=0;m<len;m++)
{
do
{
i=rand()%9+1;
j=rand()%9+1;
}while(*(v+i*n+j)==9); /*防止生成的雷的位置有所重复*/
*(v+i*n+j)=9;/*在随机生成的位置布雷*/
}
}
void shengcheng_shuzu(int v[],int n)
{
int i,j,k,h;
for(i=1;i<n-1;i++)
for(j=1;j<n-1;j++)/*只处理行数1-9和列数1-9中的元素*/
{
if(v[i*n+j]!=9)/*只处理不是雷的元素*/
for(k=0;k<3;k++)
for(h=0;h<3;h++)
if(v[(i-1+k)*n+j-1+h]==9)/*判断元素对象周围8个元素为雷的个数*/
2.遇到了“unresolved external symbol "void __cdecl shengcheng_lei(int * const,int)" (?shengcheng_lei@@YAXQAHH@Z)”和“Debug/扫雷——.exe : fatal error LNK1120: 1 unresolved externals;”的问题;后来知道是函数在定义的时候名字与声明的不一样;
3.开始的时候有时候只能打出9个雷,后来知道是没加
do

c语言扫雷课程设计总结

c语言扫雷课程设计总结

c语言扫雷课程设计总结一、课程目标知识目标:1. 理解C语言的基本语法和结构,掌握扫雷游戏的逻辑设计。

2. 学会使用C语言编写程序,实现扫雷游戏的界面显示、地雷布置、排查等功能。

3. 掌握数组的使用,利用二维数组存储扫雷游戏的数据。

技能目标:1. 培养学生运用C语言解决问题的能力,提高编程技巧。

2. 培养学生的逻辑思维能力,通过分析问题,设计出合理的算法。

3. 提高学生的动手实践能力,能够独立完成扫雷游戏的编写和调试。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习热情,增强自信心。

2. 培养学生的团队协作精神,学会与他人分享和交流编程经验。

3. 培养学生面对困难不退缩,勇于尝试和解决问题的积极态度。

分析课程性质、学生特点和教学要求:1. 课程性质:本课程为C语言编程实践课,旨在通过设计扫雷游戏,让学生掌握C语言的基本语法和应用。

2. 学生特点:学生已经具备一定的C语言基础,对编程有一定了解,但实践能力较弱。

3. 教学要求:注重理论与实践相结合,以学生为主体,充分调动学生的积极性,培养其编程兴趣和动手能力。

1. 熟练掌握C语言的基本语法和结构,能够独立编写扫雷游戏程序。

2. 提高逻辑思维能力和问题解决能力,能够分析并优化扫雷游戏的算法。

3. 增强团队协作意识,善于与他人分享和交流编程经验。

4. 培养良好的学习习惯,勇于面对挑战,积极解决问题。

二、教学内容1. C语言基础语法回顾:变量定义、数据类型、运算符、控制结构(包括顺序结构、分支结构、循环结构)。

2. 数组的使用:介绍一维数组、二维数组的概念和应用,以及数组在扫雷游戏中的使用。

3. 函数的定义与调用:重点讲解自定义函数的编写,如初始化游戏界面、布置地雷、排查地雷等。

4. 游戏逻辑设计:分析扫雷游戏的规则,设计游戏的数据结构,编写算法实现游戏逻辑。

5. 界面设计与实现:利用C语言库函数,实现扫雷游戏的图形化界面显示。

6. 程序调试与优化:介绍调试工具和技巧,指导学生进行程序调试,提高程序性能。

C++设计扫雷游戏报告

C++设计扫雷游戏报告

电气信息学院实训报告课程名称: 软件项目实训实训题目: 扫雷游戏年级/专业/班: *****************学生姓名: ****学号: **********实训成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)报告撰写质量(45)总分(100)指导教师签名:年月日摘要游戏业发展一日千里,该行业极大的影响和改变了人们的生活和娱乐方式,游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦想,满足了消费者的心理和精神需求。

扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows 操作系统里去却依然保持着原貌。

但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。

扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如C,C++,VB,JAVA等。

本论文研究的是以Visual C++ 6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。

论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。

关键字:扫雷;Visual C++ 6.0;事件;递归IAbstractGame industry develops by leaps and bounds,and it has a great impact on the way people live and entertainment, games provide consumers with a variety of virtual space, so that consumers can enjoy the free fun of the virtual world, achieve the dream that may never achieve in real life, and satisfy the psychological and spiritual needs consumer.The Sweep Mine Game is a small game that the Windows operating system have. Over the past few years the Windows operating system has experienced a number of chang,and become much larger and more complexed. However, this lovely game in any version of the Windows operating system has keep the original appearance. Almost every computer users have come into contact with it, and love this game.The Sweep Mine Game is an classical little game, and there are many ways can achieve it,we can use many different algorithms and languages,such as C,C++,VB,JAVA and so on.This study is based on Visual C++ 6.0 to designed and made the sweep mine game,it’s function is similar to the game that the Windows operating system has. First we introduced the whole idea of making the gameand the process planning of the game design,then introduced the method of the layout of minefields and mines randomly generated. And focuses on the process of dealing with the incident in the game, among them, the mouse events and clearance of unexploded landmines around the box are the two most important thing, the mouse events is to use the message that the mouse give to understand the the user's intent, then make the corresponding action, and clearance of unexploded landmines around the box has became simply with the introduction of the "recursive" .Key words:Sweep Mine,; Visual C++ 6.0; Affairs,; RecursionⅡ目录摘要 (I)Abstract (Ⅱ)1 引言 01.1 系统概述 01.2 需求分析 01.3 运行环境 (1)2 概要设计 (1)2.1 设计思路 (1)2.2 模块功能介绍 (1)2.3 模块结构图 (2)2.4 程序流程图 (3)2.5 功能设计分工 (4)3 详细设计 (4)3.1 游戏菜单的实现 (4)3.2 游戏帮助对话框的实现 (9)3.3 游戏英雄榜对话框的实现 (12)3.4 游戏播放背景音乐的实现 (18)3.5 新游戏处理模块的设计与实现 (19)3.6 地雷格子模块的设计与实现 (22)3.7 游戏规则模块的设计与实现 (27)3.8 游戏绘图模块的设计与实现 (31)3.9 玩家输入模块的设计与实现 (35)4 调试分析 (40)5 测试 (41)5.1 主菜单和界面显示功能的测试演示 (41)5.2 鼠标输入功能的测试演示 (41)5.3 标示指定格子功能的测试演示 (42)5.4 游戏胜负判断功能的测试演示 (43)5.5 游戏帮助功能的测试演示 (43)心得与体会 (44)参考文献 (47)1 引言1.1 系统概述扫雷游戏,是Windows操作系统自带的一款经典游戏。

c语言扫雷课程设计报告vc

c语言扫雷课程设计报告vc

C语言扫雷课程设计报告1. 引言扫雷游戏是一款经典的单人益智游戏,通过在一个由方块组成的网格中,通过点击方块并根据周围方块的状态来逐步揭示地雷的位置。

本文档将介绍一个使用C语言实现的扫雷游戏。

2. 项目背景扫雷游戏是一个经典的Windows游戏,在Windows操作系统中自带有扫雷游戏,因此开发一个C语言版本的扫雷游戏可以提高学生对C 语言的学习兴趣,同时锻炼计算机编程能力。

3. 项目目标本项目的目标是实现一个具备基本功能的C语言扫雷游戏,包括以下特点:•游戏开始时,玩家输入游戏难度(即地雷数量和地图大小),按照输入的难度生成对应的地图。

•玩家通过输入坐标的方式来翻开方块,并根据周围地雷的数量显示提示信息。

•当玩家翻开一个地雷方块时,游戏结束,显示游戏失败信息。

•如果玩家成功翻开了所有的非地雷方块,则游戏胜利,显示游戏胜利信息。

4. 技术实现本项目将使用C语言实现扫雷游戏,主要涉及以下技术:•使用C语言的基本语法和数据结构,实现游戏逻辑和操作;•使用C语言中的文件操作,实现游戏的保存和读取功能;•使用C语言中的随机数生成函数,生成随机地雷的位置;•使用C语言的图形库(如ncurses)来实现游戏界面的显示。

5. 版本控制为了方便项目的维护和追踪,本项目将使用Git进行版本控制。

代码库将托管在GitHub上,方便多人协作和版本管理。

6. 开发计划本项目的开发计划如下:•第1周:学习C语言基础知识,熟悉C语言的基本语法和数据结构;•第2周:完成C语言扫雷游戏的框架搭建,包括游戏初始化、界面设计等;•第3周:实现游戏逻辑,包括地雷生成、方块翻开、胜利条件判定等;•第4周:优化游戏功能,增加保存和读取功能,完善游戏界面等;•第5周:完成文档撰写和项目总结。

7. 预期成果通过本项目的实现,预期可以达到以下成果:•培养学生对C语言的编程能力,加深对C语言的理解;•提高学生的逻辑思维和问题解决能力;•锻炼学生的团队协作和沟通能力;•了解和应用Git版本控制工具,提高代码管理和维护能力。

C语言实现扫雷游戏详解

C语言实现扫雷游戏详解

C语⾔实现扫雷游戏详解本⽂实例为⼤家分享了C语⾔实现扫雷游戏的具体代码,供⼤家参考,具体内容如下功能设计扫雷⼤家应该都玩过,这是⼀个⼗分经典的游戏,今天我将给⼤家讲解如何⽤C语⾔实现扫雷,我的这个扫雷有如下⼏个功能:1、显⽰该点周围雷的个数2、第⼀次下⼦,不炸死3、坐标周围没雷,可以实现展开4、游戏结束后展⽰玩家⽤时效果展⽰话不多说,先附上效果图:设计思路我们只要输⼊坐标就可以扫雷了,是不是很有趣?其实要想实现这也不难,我们要⽤⼏个算法模块来模拟游戏规则,需要⽤函数来调⽤各个模块使游戏跑起来。

那么第⼀步我们就要构思⼀个棋盘,看见上⾯第⼀张图没,在开始游戏的界⾯我打印了两个棋盘,有0和1的棋盘是给我们设计者看的,它可以显⽰出当前雷的真实分布,这有利于我们测试代码的正确性,⽽全是 * 的棋盘是给玩家扫雷⽤的。

那我们就需要⽤⼆维数组来打印两个棋盘,假如我们要打印10X10的棋盘,那我们的⼆维数组元素也要为10X10个吗?,不能,因为我们在设计算法时需要统计坐标周围8个⽅位雷的个数,假如要统计边界坐标周围雷的个数,那么就会有数组越界的问题,那我们就要在10X10的边界多上⼀圈元素,也就要定义12X12的数组元素,这些元素我们不要打印出来,⼼⾥有数就⾏,如下图:#define row 12#define col 12show_mine[row][col];//玩家数组real_mine[row][col];//设计者数组我们在⼀个项⽬⾥建⽴三个源⽂件,如下:1、我们打印设计者棋盘要⽤数组real_mine,打印玩家棋盘要⽤数组show_mine,两个数组在开始必须要初始化,在设计者棋盘中字符0代表不是雷,字符1代表雷,先初始化两个数组代码如下:void init_mine()//初始化两个雷阵{int i = 0;int j = 0;for (int i = 0; i < row; i++){for (j = 0; j < col; j++){show_mine[i][j] = '*';real_mine[i][j] = '0';}}}2、打印两个雷阵(不要忘了打印横竖序号以便确定坐标)void print_player()//打印玩家棋盘{int i = 0;int j = 0;printf("0 ");for (i = 1; i <row-1; i++){printf("%d ", i);//打印横标(0--10)}printf("\n");for (i = 1; i <row-2; i++)//打印竖标(1--10){printf("%d ", i);for (j = 1; j < col-1; j++){printf("%c ", show_mine[i][j]);//玩家棋盘数组}printf("\n");}printf("10 ");//开始打印最后⼀⾏for (i = 1; i < row-1; i++){printf("%c ", show_mine[10][i]);}printf("\n");}void print_mine()//打印设计者棋盘{int i = 0;int j = 0;printf("0 ");for (i = 1; i <row - 1; i++){printf("%d ", i);//打印横标(0--10)}printf("\n");for (i = 1; i <row - 2; i++)//打印竖标(1--10){printf("%c ", real_mine[i][j]);}printf("\n");}printf("10 ");//开始打印最后⼀⾏for (i = 1; i < row - 1; i++){printf("%c ", real_mine[10][i]);}printf("\n");}3、我们在每⼀次玩的时候设计者棋盘中的雷分布都必须不相同,使⽤随机数⽣成横竖坐标确定布雷坐标,代码如下:void set_mine()//给设计者棋盘布雷{int x = 0;int y = 0;int count = COUNT;//雷总数while (count)//雷布完后跳出循环{int x = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷int y = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷if (real_mine[x][y] == '0')//找不是雷的地⽅布雷{real_mine[x][y] = '1';count--;}}}4、为了统计当前坐标周围雷的个数,定义⼀个函数实现:int count_mine(int x, int y)//检测周围8个区域雷的个数{int count = 0;if (real_mine[x - 1][y - 1] == '1')count++;if (real_mine[x - 1][y] == '1')count++;if (real_mine[x - 1][y + 1] == '1')count++;if (real_mine[x][y - 1] == '1')count++;if (real_mine[x][y + 1] == '1')count++;if (real_mine[x + 1][y - 1] == '1')count++;if (real_mine[x + 1][y] == '1')count++;if (real_mine[x + 1][y + 1] == '1')count++;return count;}5、为了确保第⼀次不被雷炸死,我们需要定义个函数来实现,如果第⼀次选到雷就将这颗雷放在其他不是雷的地⽅,代码如下:void safe_mine()//避免第⼀次炸死{int x = 0;int y = 0;char ch = 0;int count = 0;int ret = 1;printf("输⼊坐标扫雷\n");while (1){scanf("%d%d", &x, &y);//只能输⼊1到10,输⼊错误重新输⼊if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输⼊坐标是否有误{if (real_mine[x][y] == '1')//第⼀次踩到雷后补救show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值open_mine(x, y);while (ret)//在其余有空的地⽅设置⼀个雷{int x = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷int y = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷if (real_mine[x][y] == '0')//找不是雷的地⽅布雷{real_mine[x][y] = '1';ret--;break;}}break;//跳出此函数}if (real_mine[x][y] == '0'){char ch = count_mine(x, y);show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值open_mine(x, y);break;}}else//坐标错误{printf("输⼊错误重新输⼊\n");}}}6、为了实现展开功能,需要展开函数模块(展开的坐标还要显⽰其坐标周围的雷数),如下:void open_mine(int x, int y)//坐标周围展开函数{if (real_mine[x - 1][y - 1]== '0'){show_mine[x - 1][y - 1] = count_mine(x - 1, y - 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x - 1][y] == '0'){show_mine[x - 1][y] = count_mine(x - 1, y) + '0';//显⽰该坐标周围雷数}if (real_mine[x - 1][y + 1] == '0'){show_mine[x - 1][y + 1] = count_mine(x - 1, y + 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x][y - 1] == '0'){show_mine[x][y - 1] = count_mine(x, y - 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x][y + 1] == '0'){show_mine[x][y + 1] = count_mine(x, y + 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x + 1][y - 1] == '0'){show_mine[x + 1][y - 1] = count_mine(x + 1, y - 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x + 1][y] == '0'){show_mine[x + 1][y] = count_mine(x + 1, y) + '0';//显⽰该坐标周围雷数}if (real_mine[x + 1][y + 1] == '0'){show_mine[x + 1][y + 1] = count_mine(x + 1, y + 1) + '0';//显⽰该坐标周围雷数}}7、扫雷函数是⼀个重要的模块,代码如下:int sweep_mine()//扫雷函数,踩到雷返回1,没有踩到雷返回0{int x = 0;int y = 0;if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输⼊坐标是否有误,输⼊错误重新输⼊{if (real_mine[x][y] == '0')//没踩到雷{char ch = count_mine(x,y);show_mine[x][y] = ch+'0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值open_mine(x, y);if (count_show_mine() == COUNT)//判断剩余未知区域的个数,个数为雷数时玩家赢{print_mine();printf("玩家赢!\n\n");return 0;}}else if (real_mine[x][y]=='1')//踩到雷{return 1;}}else{printf("输⼊错误重新输⼊\n");}return 0;//没踩到雷}到最后需要确定游戏胜利的条件,我们要统计当前状态玩家棋盘中显⽰的剩余 * 的个数,如果个数等于总雷数时说明扫雷完成,游戏胜利,定义⼀个函数实现:int count_show_mine()//判断剩余未知区域的个数,个数为雷数时玩家赢{int count = 0;int i = 0;int j = 0;for (i = 1; i <= row - 2; i++){for (j = 1; j <= col - 2; j++){if (show_mine[i][j] == '*'){count++;}}}return count;}我们将以上函数的定义放在 game.c ⽂件中以上就是我们要实现扫雷的模块,要想把这些模块整合起来运⾏,就需要⼀个游戏执⾏函数来调⽤这些模块,定义个game()函数实现,代码如下:#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"double start, finish;void game(){int ret = 0;init_mine();//初始化玩家棋盘和设计者棋盘set_mine();//给设计者棋盘布雷print_mine();//打印设计者棋盘(可不打印)printf("\n");print_player();//打印玩家棋盘start = clock();safe_mine();//避免第⼀次被炸死if (count_show_mine() == COUNT)//⼀步就赢的情况{print_mine();while (1)//循环扫雷{int ret=sweep_mine();//扫雷,踩到雷返回1,没有踩到雷返回0if (count_show_mine() == COUNT)//若玩家棋盘的'*'个数为雷数时,扫雷完成,游戏胜利 {print_mine();//打印设计者棋盘printf("玩家赢!\n\n");finish = clock();//取结束时间printf("⽤时%d 秒\n",(int) (finish - start) / CLOCKS_PER_SEC);break;}if (ret)//判断是否踩到雷{printf("被雷炸死\t");finish = clock();//取结束时间printf("⽤时%d 秒\n", (int)(finish - start) / CLOCKS_PER_SEC);print_mine();//打印设计者雷阵查看雷的分布break;}print_player();//打印玩家棋盘}}int main(){srand((unsigned int)time(NULL));//产⽣随机数⽣成器int input = 0;muen();//菜单do{scanf("%d", &input);switch (input){case 1:game();break;case 0:exit(1);//退出游戏break;default:printf("输⼊错误,重新输⼊\n");break;}muen();printf("contiue?\n");} while (1);//循环玩游戏system("pause");return 0;}在头⽂件game.h中声明各种函数:game.h#ifndef __GAME_H__#define __GAME__H__#include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define row 12#define col 12#define COUNT 10//棋盘中雷的总数extern char show_mine[row][col];//展⽰数组extern char real_mine[row][col];//布雷数组void muen();//菜单函数void init_mine();//初始化数组函数void set_mine();//布雷函数int count_mine();//统计周围雷的个数void print_player();//打印玩家棋盘void print_mine();//打印设计者棋盘int sweep_mine();//扫雷函数#endif //__GAME_H__将上⾯这个函数放在main.c⽂件中以上我们便完成了扫雷的所有C语⾔代码,接下来我们测验⼀下:1、检测第⼀次是否能不被炸死2、检测周围没雷可以展开总结测试显⽰我们的代码没有问题,我们总结⼀下,这个程序的难点的就是如何实现展开和和保证第⼀次不被炸死,如果你仔细理解以上的程序,你就会明⽩其中的原理,包括为什么要在数组元素周围多⼀圈元素,这些模块都是游戏的核⼼,等你掌握了这个程序,你的逻辑思维能⼒就会有很⼤的提⾼!附game.c⽂件源码:#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"char show_mine[row][col] = { 0 };char real_mine[row][col] = { 0 };void muen(){printf("*******************************\n");printf("*****1.play 0.exit*******\n");printf("*******************************\n");}void init_mine()//初始化两个棋盘{int i = 0;int j = 0;for (int i = 0; i < row; i++){for (j = 0; j < col; j++){}}void print_player()//打印玩家棋盘{int i = 0;int j = 0;printf("0 ");for (i = 1; i <row-1; i++){printf("%d ", i);//打印横标(0--10)}printf("\n");for (i = 1; i <row-2; i++)//打印竖标(1--10){printf("%d ", i);for (j = 1; j < col-1; j++){printf("%c ", show_mine[i][j]);//玩家棋盘数组}printf("\n");}printf("10 ");//开始打印最后⼀⾏for (i = 1; i < row-1; i++){printf("%c ", show_mine[10][i]);}printf("\n");}void print_mine()//打印设计者棋盘{int i = 0;int j = 0;printf("0 ");for (i = 1; i <row - 1; i++){printf("%d ", i);//打印横标(0--10)}printf("\n");for (i = 1; i <row - 2; i++)//打印竖标(1--10){printf("%d ", i);for (j = 1; j < col - 1; j++){printf("%c ", real_mine[i][j]);}printf("\n");}printf("10 ");//开始打印最后⼀⾏for (i = 1; i < row - 1; i++){printf("%c ", real_mine[10][i]);}printf("\n");}void set_mine()//给设计者棋盘布雷{int x = 0;int y = 0;int count = COUNT;//雷总数while (count)//雷布完后跳出循环{int x = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷 int y = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷 if (real_mine[x][y] == '0')//找不是雷的地⽅布雷{real_mine[x][y] = '1';count--;int count_mine(int x, int y)//检测周围8个区域雷的个数{int count = 0;if (real_mine[x - 1][y - 1] == '1')count++;if (real_mine[x - 1][y] == '1')count++;if (real_mine[x - 1][y + 1] == '1')count++;if (real_mine[x][y - 1] == '1')count++;if (real_mine[x][y + 1] == '1')count++;if (real_mine[x + 1][y - 1] == '1')count++;if (real_mine[x + 1][y] == '1')count++;if (real_mine[x + 1][y + 1] == '1')count++;return count;}void safe_mine()//避免第⼀次炸死{int x = 0;int y = 0;char ch = 0;int count = 0;int ret = 1;printf("输⼊坐标扫雷\n");while (1){scanf("%d%d", &x, &y);//只能输⼊1到10,输⼊错误重新输⼊if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输⼊坐标是否有误{if (real_mine[x][y] == '1')//第⼀次踩到雷后补救{real_mine[x][y] = '0';char ch = count_mine(x, y);show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值 open_mine(x, y);while (ret)//在其余有空的地⽅设置⼀个雷{int x = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷int y = rand() % 10 + 1;//产⽣1到10的随机数,在数组下标为1到10的范围内布雷if (real_mine[x][y] == '0')//找不是雷的地⽅布雷{real_mine[x][y] = '1';ret--;break;}}break;//跳出此函数}if (real_mine[x][y] == '0'){char ch = count_mine(x, y);show_mine[x][y] = ch + '0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值 open_mine(x, y);break;}}else//坐标错误{printf("输⼊错误重新输⼊\n");}}}int sweep_mine()//扫雷函数,踩到雷返回1,没有踩到雷返回0{printf("输⼊坐标扫雷\n");scanf("%d%d", &x, &y);//只能输⼊1到10if ((x >= 1 && x <= 10) && (y >= 1 && y <= 10))//判断输⼊坐标是否有误,输⼊错误重新输⼊{if (real_mine[x][y] == '0')//没踩到雷{char ch = count_mine(x,y);show_mine[x][y] = ch+'0';//数字对应的ASCII值和数字字符对应的ASCII值相差48,即'0'的ASCII值 open_mine(x, y);if (count_show_mine() == COUNT)//判断剩余未知区域的个数,个数为雷数时玩家赢{print_mine();printf("玩家赢!\n\n");return 0;}}else if (real_mine[x][y]=='1')//踩到雷{return 1;}}else{printf("输⼊错误重新输⼊\n");}return 0;//没踩到雷}void open_mine(int x, int y)//坐标周围展开函数{if (real_mine[x - 1][y - 1]== '0'){show_mine[x - 1][y - 1] = count_mine(x - 1, y - 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x - 1][y] == '0'){show_mine[x - 1][y] = count_mine(x - 1, y) + '0';//显⽰该坐标周围雷数}if (real_mine[x - 1][y + 1] == '0'){show_mine[x - 1][y + 1] = count_mine(x - 1, y + 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x][y - 1] == '0'){show_mine[x][y - 1] = count_mine(x, y - 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x][y + 1] == '0'){show_mine[x][y + 1] = count_mine(x, y + 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x + 1][y - 1] == '0'){show_mine[x + 1][y - 1] = count_mine(x + 1, y - 1) + '0';//显⽰该坐标周围雷数}if (real_mine[x + 1][y] == '0'){show_mine[x + 1][y] = count_mine(x + 1, y) + '0';//显⽰该坐标周围雷数}if (real_mine[x + 1][y + 1] == '0'){show_mine[x + 1][y + 1] = count_mine(x + 1, y + 1) + '0';//显⽰该坐标周围雷数}}int count_show_mine()//判断剩余未知区域的个数,个数为雷数时玩家赢{int count = 0;int i = 0;int j = 0;for (i = 1; i <= row - 2; i++){for (j = 1; j <= col - 2; j++){if (show_mine[i][j] == '*'){count++;}}}return count;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

C语言程序设计扫雷游戏实验报告

C语言程序设计扫雷游戏实验报告

中南大学程序设计基础实践报告题目设计一个和window系统类似的小游戏【挖地雷】学生姓名张兰兰学院信息科学与工程学院专业班级物联网工程1301班完成时间 2014.1目录1.课程设计内容 (3)2.课程设计目的 (3)3.背景知识 (4)4.工具/准备工作 (5)5.设计步骤、方法 (6)5.1. 步骤1:步骤名称(二级标题) .................................................................... 错误!未定义书签。

5.1.1. 步骤1.1:步骤名称(三级标题) (6)5.2. 步骤2:步骤名称 ......................................................................................... 错误!未定义书签。

5.3. 步骤n:步骤名称......................................................................................... 错误!未定义书签。

6.设计结果及分析 (6)7.设计结论 (20)8.问题及心得体会 (20)9.对本设计过程及方法、手段的改进建议 (21)10.参考文献 (21)报告名称1. 课程设计内容在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。

扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。

我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。

即:设计一个功能与Windows中的挖雷游戏相同的小游戏。

2. 课程设计目的1.培养学生综合运用所学知识独立完成课题的能力。

C语言程序设计扫雷游戏实验报告

C语言程序设计扫雷游戏实验报告

中南大学程序设计基础实践报告题目设计一个和window系统类似的小游戏【挖地雷】学生姓名张兰兰学院信息科学与工程学院专业班级物联网工程1301班完成时间 2014.1目录1.课程设计内容 (3)2.课程设计目的 (3)3.背景知识 (3)4.工具/准备工作 (5)5.设计步骤、方法 (5)5.1. 步骤1:步骤名称(二级标题) ..........................................................错误!未定义书签。

5.1.1. 步骤1.1:步骤名称(三级标题) (5)5.2. 步骤2:步骤名称.............................................................................错误!未定义书签。

5.3. 步骤n:步骤名称.............................................................................错误!未定义书签。

6.设计结果及分析 (5)7.设计结论 (15)8.问题及心得体会 (16)9.对本设计过程及方法、手段的改进建议 (17)10.参考文献 (17)报告名称1. 课程设计内容在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。

扫雷游戏是Windows操作系统自带的一款小游戏,在过去的几年里,Windows 操作系统历经数次换代更新,变得越来越庞大、复杂,功能也越来越强大,但是这款小游戏依然保持原来的容貌,可见这款小游戏受到越来越多人的喜爱。

我利用C-free编写了与它功能相仿的挖地雷游戏,寓学于乐。

即:设计一个功能与Windows中的挖雷游戏相同的小游戏。

2. 课程设计目的1.培养学生综合运用所学知识独立完成课题的能力。

2.试学生更深入地理解和掌握该课程中的有关基本概念,程序设计思想和方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序输出报告程序设计时使用环境----Win10 VS20151程序设计思路模块化设计一个扫雷游戏。

要实现埋雷,计算一个格子周围雷数,打开雷位,显示雷区几个功能.需要以下几个主要数据,判断雷位的雷是否存在,雷位周围的雷数,是否已经被打开,游戏是否结束,雷区大小,布雷量(本程序中非必须保存于类中数据)2功能的具体实现为了方便计算和理解先分出类class OneMine{OneMine(); //雷位构造函数void InitOneMine(); //初始化一个雷位bool IsMine; //是否是雷bool Opened; //是否已经打开short AroundMines; //周边的雷数friendclass Operation;friendclass Mines;};class Mines//创建雷区类{bool GameOver; //扫雷是否结束short Rows; //雷区的行数short Cols; //雷区的列数short MinesCount; //布设雷的数量OneMine *pos[50][50]; //存放雷对象的数组指针public:Mines(); //雷区类构造函数~Mines(); //析构函数friendclass Operation;};class Operation :public Mines//操作类{public:void ReInitMine(short row, short col, short mines); //重新初始化雷区void LayOneMines(); //布置一个地雷void CalculateAroundMine(int x, int y); //计算每个雷周边的雷数void ShowOneMine(int x,int y); //触雷时的执行函数void ShowMine(); //显示未触雷时的雷区情况void ShowAllMine(); //触雷时的触发函数void OpenOneMine(int x, int y); //打开一个雷位};实现埋雷//布一个地雷void Operation::LayOneMines() //布一个地雷{int m, n;do {m = rand() % Cols + 1; n = rand() % Rows + 1; //随机产生雷位坐标} while (pos[m][n]->IsMine);pos[m][n]->IsMine = true;}PS:rand()函数的输出是依赖于默认输入数据的,需要使用windows.h中的GetTickCount()函数来初始化实现计算格子周围雷数void Operation::CalculateAroundMine(int x, int y) //计算雷位周边雷数{int mines = 0;for (int i = x - 1; i<= x + 1; i++)for (int j = y - 1; j <= y + 1; j++)mines = mines + pos[i][j]->IsMine; //利用IsMine数据的特性计算周围雷数pos[x][y]->AroundMines = mines;}实现打开雷位void Operation::OpenOneMine(int x, int y) //打开一个雷位{if (x>Cols || x<1 || y>Rows || y<1) return; //如果点的位置不在雷区,则返回if (GameOver) return; //如果扫雷结束,则返回if (pos[x][y]->Opened) r eturn; //如果该位置已经打开,则返回if (pos[x][y]->IsMine) //如果该雷位是地雷{ShowAllMine(); //找出所有的地雷,并显示出来cout<<"BOOM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";GameOver = true;return;}else//如果该雷位不是地雷{pos[x][y]->Opened = true;if (pos[x][y]->AroundMines == 0) //如果该雷位周边的雷数为零,打开周边的雷位,采用递归调用的方法{if (x != 1) OpenOneMine(x - 1, y); //打开左边if (x != Cols) OpenOneMine(x + 1, y); //打开右边if (y != 1) OpenOneMine(x, y - 1); //打开上边if (y != Rows) OpenOneMine(x, y + 1); //打开下边if (x != 1 &&y != 1) OpenOneMine(x - 1, y - 1); //打开左上if (x != 1 &&y != Rows) OpenOneMine(x - 1, y + 1); //打开左下if (x != Cols&&y != 1) O penOneMine(x + 1, y - 1); //打开右上if (x != Cols&&y != Rows)OpenOneMine(x + 1, y + 1); //打开右下} }}}实现输出未触雷的雷区void Operation::ShowMine() //显示雷区{int k = 0; //换行判定变量if (GameOver == false){if (Rows >= 10){cout<<" ";}cout<<" ";for (int i = 1; i<= Cols; i++) //输出横坐标{cout<<i<<" ";if (Cols >= 10 &&i< 10){cout<<" ";}for (int i = 1; i<= Rows; i++)for (int j = 1; j <= Cols; j++){if (k%Cols == 0){cout<<endl<<i % (Rows + 1) <<" "; //纵坐标+按列if (i< 10 && Rows >= 10)cout<<" ";}if (Rows >= 10)cout<<" ";if (pos[j][i]->Opened){cout<<pos[j][i]->AroundMines<<" ";k++;}else{cout<<"H ";k++;}} cout<<endl; //末尾回车}}实现触雷后的雷区显示void Operation::ShowOneMine(int x,int y) //触发雷后显示一个雷{int i = x;int j = y;if (pos[i][j]->IsMine)//right{cout<<"M ";}else{cout<<pos[i][j]->AroundMines<<" ";}void Operation::ShowAllMine() //触发雷后显示所有雷{int k = 0; //换行判定变量if (Rows >= 10){cout<<" ";}cout<<" ";for (int i = 1; i<= Cols; i++) //输出横坐标{cout<<i<<" ";if (Cols >= 10 &&i< 10){cout<<" ";}}for (int i = 1; i<= Rows; i++)for (int j = 1; j <= Cols; j++, k++){if (k%Cols == 0){cout<<endl<<i % (Rows + 1) <<" "; //纵坐标+按列if (i< 10 && Rows >= 10)cout<<" ";}if (Rows >= 10)cout<<" ";ShowOneMine(j, i);}cout<<endl;}3程序运行结果4程序分析由于不是鼠标操作,加一道标记操作显得过于繁琐,所以没有加入标记地雷功能,也因此该地雷游戏其实没有完整的胜利途径.没有将雷区框架(即X-Y轴)输出函数化5程序改进思路加入标记地雷功能,使用条件判断,每次输入打开行列坐标前,请求输入Y/N是否进行标记操作.对类进行详细分类,分别封装是否存雷类,是否打开类,是否结束游戏类…. 6附:完整源代码// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。

//#include"stdafx.h"#include<iostream>#include"windows.h"usingnamespace std;class OneMine{OneMine(); //雷位构造函数void InitOneMine(); //初始化一个雷位bool IsMine; //是否是雷bool Opened; //是否已经打开short AroundMines; //周边的雷数friendclass Operation;friendclass Mines;};class Mines//创建雷区类{bool GameOver; //扫雷是否结束short Rows; //雷区的行数short Cols; //雷区的列数short MinesCount; //布设雷的数量OneMine *pos[50][50]; //存放雷对象的数组指针public:Mines(); //雷区类构造函数~Mines(); //析构函数friendclass Operation;};class Operation :public Mines//操作类{public:void ReInitMine(short row, short col, short mines); //重新初始化雷区void LayOneMines(); //布置一个地雷void CalculateAroundMine(int x, int y); //计算每个雷周边的雷数void ShowOneMine(int x,int y); //触雷时的执行函数void ShowMine(); //显示未触雷时的雷区情况void ShowAllMine(); //触雷时的触发函数void OpenOneMine(int x, int y); //打开一个雷位};OneMine::OneMine()//雷位构造函数{InitOneMine();}void OneMine::InitOneMine()//重新初始化一个雷位{IsMine = false; //雷位默认无雷Opened = 0; //雷位默认未打开AroundMines = 0; //雷位周围雷数默认为无}Mines::Mines()//雷区构造函数{for (int i = 0; i<50; i++)for (int j = 0; j<50; j++)pos[j][i] = new OneMine();}Mines::~Mines()//雷区析构函数{for (int i = 0; i<50; i++)for (int j = 0; j<50; j++)delete pos[j][i];}void Operation::ReInitMine(short row, short col, short mines)//重新初始化雷区{int i, j;GameOver = false; //游戏默认为未结束Rows = row; Cols = col; //行数列数MinesCount = mines; //初始雷数for (i = 1; i<= Rows; i++) //把所有的雷位地雷清除for (j = 1; j <= Cols; j++)pos[j][i]->InitOneMine(); //InitOneMine()为初始化雷位函数srand((unsigned)GetTickCount()); //初始化产生随机数函数for (i = 0; i<MinesCount; i++) //布置地雷LayOneMines();for (i = 1; i<= Rows; i++) //计算每个雷位周边的雷数for (j = 1; j <= Cols; j++)CalculateAroundMine(j, i);}void Operation::LayOneMines() //布一个地雷{int m, n;do {m = rand() % Cols + 1; n = rand() % Rows + 1; //随机产生雷位坐标} while (pos[m][n]->IsMine);pos[m][n]->IsMine = true;}void Operation::CalculateAroundMine(int x, int y) //计算雷位周边雷数{int mines = 0;for (int i = x - 1; i<= x + 1; i++)for (int j = y - 1; j <= y + 1; j++)mines = mines + pos[i][j]->IsMine; //利用IsMine数据的特性计算周围雷数pos[x][y]->AroundMines = mines;}void Operation::ShowOneMine(int x,int y) //触发雷后显示一个雷{int i = x;int j = y;if (pos[i][j]->IsMine)//right{cout<<"M "; //雷显示为"M"}else{cout<<pos[i][j]->AroundMines<<" "; //非雷被打开后显示周围雷数}}void Operation::ShowAllMine() //触发雷后显示所有雷{int k = 0; //换行判定变量if (Rows >= 10) //适当输出空格使得雷区不至于变形(以下输出空格均属于此功能){cout<<" ";}cout<<" ";for (int i = 1; i<= Cols; i++) //输出横坐标{cout<<i<<" ";if (Cols >= 10 &&i< 10){cout<<" ";}}for (int i = 1; i<= Rows; i++)for (int j = 1; j <= Cols; j++, k++){if (k%Cols == 0){cout<<endl<<i % (Rows + 1) <<" "; //纵坐标+按列if (i< 10 && Rows >= 10)cout<<" ";}if (Rows >= 10)cout<<" ";ShowOneMine(j, i);}cout<<endl;}void Operation::ShowMine() //显示雷区{int k = 0; //换行判定变量if (GameOver == false){if (Rows >= 10){cout<<" ";}cout<<" ";for (int i = 1; i<= Cols; i++) //输出横坐标{cout<<i<<" ";if (Cols >= 10 &&i< 10){cout<<" ";}}for (int i = 1; i<= Rows; i++)for (int j = 1; j <= Cols; j++){if (k%Cols == 0){cout<<endl<<i % (Rows + 1) <<" "; //纵坐标+按列if (i< 10 && Rows >= 10)cout<<" ";}if (Rows >= 10)cout<<" ";if (pos[j][i]->Opened){cout<<pos[j][i]->AroundMines<<" ";k++;}else{cout<<"H ";k++;}} cout<<endl; //末尾回车}}void Operation::OpenOneMine(int x, int y) //打开一个雷位{if (x>Cols || x<1 || y>Rows || y<1) return; //如果点的位置不在雷区,则返回if (GameOver) return; //如果扫雷结束,则返回if (pos[x][y]->Opened) r eturn; //如果该位置已经打开,则返回if (pos[x][y]->IsMine) //如果该雷位是地雷{ShowAllMine(); //找出所有的地雷,并显示出来cout<<"BOOM!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";GameOver = true;return;}else//如果该雷位不是地雷{pos[x][y]->Opened = true;if (pos[x][y]->AroundMines == 0) //如果该雷位周边的雷数为零,打开周边的雷位{if (x != 1) OpenOneMine(x - 1, y); //打开左边if (x != Cols) OpenOneMine(x + 1, y); //打开右边if (y != 1) OpenOneMine(x, y - 1); //打开上边if (y != Rows) OpenOneMine(x, y + 1); //打开下边if (x != 1 &&y != 1) OpenOneMine(x - 1, y - 1); //打开左上if (x != 1 &&y != Rows) OpenOneMine(x - 1, y + 1); //打开左下if (x != Cols&&y != 1) O penOneMine(x + 1, y - 1); //打开右上if (x != Cols&&y != Rows)OpenOneMine(x + 1, y + 1); //打开右下}}}int main()//主函数{short row, col, mines;int x, y, i;Operation p;cout<<"请输入行、列、布雷数"<<endl;cin>> row >> col >> mines;p.ReInitMine(row, col, mines);p.ShowMine();for (i = 0; i<= row*col; i++) //循环要求输入打开雷位并循环输出雷区{cout<<"请输入要打开的行、列坐标:"<<endl;cin>> y >> x;p.OpenOneMine(x, y);p.ShowMine();cout<<endl;}return 0;}。

相关文档
最新文档