基于C语言扫雷游戏的设计与实现

目录
  • 1 引言
  • 2 相关工作
  • 3 本文方法
  • 4 结果与分析
  • 5 总结
  • 整体代码

1 引言

伴随着信息技术的快速发展,近年来,人们的生活已经离不开计算机。生活娱乐几乎都是在计算机上进行的。其中的扫雷游戏就是之一。扫雷游戏是微软公司在1992年在windows系统上发布的一款益智类小游戏,直到今天这款小游戏依然存在,可见此款游戏的成功。本文将用Visual Studio 2019作为开发工具来模拟实现扫雷游戏。经过大一第一学期的学习,我们对C语言的理论及其相关知识有了一定的认识和了解。本文可以把我们所学的理论知识和实践动手能力相结合,另外也可以对我所学过的知识进行复习巩固。通过探索windows的扫雷小游戏,我们可以巧妙地和这学期学过的C语言相结合起来模拟实现无界面化简易版的扫雷小游戏。

2 相关工作

准备Visual Studio 2019开发工具,了解数据类型,会使用选择语句、循环语句、函数、数组等内容。

了解ASCII码值、随机数的生成。了解二维坐标相关的数学知识。

3 本文方法

3.1玩家游戏思路

进入菜单,进行选择是否进入,或退出游戏。
进入游戏模块,输入坐标进行扫雷。扫到雷,结束游戏,没扫到雷,进行标记该位置周围相邻八个位置有多少个雷,直到玩家失败或者赢掉此游戏。

3.2游戏构思细节
由于本游戏玩家看到的界面是由9* 9大小的方格构成并用字符* 对B雷盘进行覆盖的画面,但当我们计算一个非雷的位置周围八个相邻位置是否有雷时,这样就会导致数组越界,为了防止越界,我们将雷盘设置为11乘11。因为是字符* 覆盖,所以对B雷盘创建用的是字符类型的二维数组,同时为了方便实现一次声明,两次调用等操作。我们把a雷盘也用字符类型的二维数组进行创建。

3.3 游戏设计实现

3.3.1 游戏分三个模块,test.c,game.c和game.h。
(1)以模块化的函数思想进行设计,使游戏整体思路更加清晰。首先打开Visual Studio 2019,创建扫雷游戏的空项目,创建test.c源文件,和game.c源文件,一个game.h头文件。c语言中头文件中一般定义了函数的声明、结构体的定义、宏定义。(常量和全局变量最好放到源文件中)。C语言源文件中我们放置一些函数。来将游戏的具体实现。 源文件(test.c)里面放主函数和游戏的整体功能。
3.3.2 在头文件中进行准备工作
(1)#define进行宏定义,进行 InitMine,SetMine,DisplayMine,FindMine等函数的声明。

//宏定义便于后期的更改
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS ROW + 2
//设置11*11的格子防止数组越界。
#define COLS COL + 2
#define ROW 9
#define COL 9
//以下是对函数的声明
void InitMine(char mine[ROWS][COLS], int row, int col, char set);
void SetMine(char mine[ROWS][COLS], int row, int col);
void DisplayMine(char show[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//设置雷的个数
#define minecount 10

3.3.3 test.c中游戏大致功能的实现
(1)生成菜单栏
对于玩家来说,游戏的开始之前需要一个菜单栏进行选择游戏的开始或者退出,这时候就要用do语句生成菜单栏,并在其中使用switch语句进行选择进入或退出游戏。

test()
{
	//用rand()函数之前需要先用srand函数。
	srand((unsigned int)time(NULL));
	int n = 0;
	//游戏进去之后需要先有个菜单所以用上do语句
	do
	{
		//打印菜单
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新选择\n");
			break;
		}
	} while (n);
}
//程序的入口
int main()
{
	test();
	return 0;
}

(2)调用game函数
我们将A盘有mine数组表示,B盘用show数组表示。
在switch中调用game函数进行char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };等数组的创建。用InitMine(mine, ROWS, COLS, ‘0');InitMine(show, ROWS, COLS, ' * );进行雷盘的初始化。我们设置雷为字符1,非雷为字符0。首先,把A盘初始化为非0,即全都不是雷,把B盘初始化为*号。接着用SetMine(mine, ROW, COL);DisplayMine(show, ROW, COL)运用随机数生成函数,向A盘随机布置雷;//用B盘进行展示雷的信息和结果,接着用FindMine(mine, show, ROW, COL);进行排雷

game()
{
	system("cls");//对画面进行清屏,使页面简洁。
	char mine[ROWS][COLS] = { 0 };//创建11*11数组
	char show[ROWS][COLS] = { 0 };
	//第一次传mine数组名
	InitMine(mine, ROWS, COLS, '0');
	//第二次传show数组名
	InitMine(show, ROWS, COLS, '*');
	//在A雷盘布置雷,所以需要传mine数组名
	SetMine(mine, ROW, COL);
	//用B盘进行展示雷的信息和结果
	DisplayMine(show, ROW, COL);
	//进行排雷
	FindMine(mine, show, ROW, COL);
}

3.3.4game.c中功能具体实现
(1)InitMine运用双重for循环,初始化棋盘。
(2)SetMine运用随机数的生成,rand函数()函数,布置雷。
(3)DisplayMine用双重for循环遍历,展示棋盘
(4)FindMine用while循环和if的嵌套,期间关键在于调用SpreadMine函数进行递归,再调用is_win函数进行判断输赢。

关键部分代码(递归)

void SpreadMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	//调用CountMine函数进行查找周围八个位置雷的个数。
	int count = CountMine(mine, x, y);
	if (0 == count)
	{
		show[x][y] = ' ';
		if (show[x][y + 1] == '*')
			SpreadMine(mine, show, x, y + 1);
		if (show[x][y - 1] == '*')
			SpreadMine(mine, show, x, y - 1);
		if (show[x + 1][y] == '*')
			SpreadMine(mine, show, x + 1, y);
		if (show[x + 1][y - 1] == '*')
			SpreadMine(mine, show, x + 1, y - 1);
		if (show[x + 1][y + 1] == '*')
			SpreadMine(mine, show, x + 1, y + 1);
		if (show[x - 1][y] == '*')
			SpreadMine(mine, show, x - 1, y);
		if (show[x - 1][y + 1] == '*')
			SpreadMine(mine, show, x - 1, y + 1);
		if (show[x - 1][y - 1] == '*')
			SpreadMine(mine, show, x - 1, y - 1);
	}
	else
	{
		//如果该位置是雷,则将雷的个数显示在此位置
		show[x][y] = count + '0';
		//由于‘0'的的ASCII码值为48,‘1'的ASCII码值是49.
		// 所以
		//1 + '0' = '1'
		//2 + '0' = '2'
	}
}

4 结果与分析

本文实现了扫雷游戏的基本功能,根据提示,输入坐标从而实现扫雷。如果踩到雷就会退出游戏。如果剩下的*号等于雷数,则赢得游戏。如果输入坐标不对,则重新输入。最后通过递归实现了扫雷一片展开的功能。待有提高的是实现图形界面化和用鼠标操作界面可以学习EasyX来进一步优化。

5 总结

通过对此扫雷游戏的设计和实现,我们回顾了C语言的大半部分知识并对其中的细节进行了剖析。学习了C语言编程风格,了解了一些较常用的知识。我们对二维数组的应用,函数的声明,定义,和调用,以及if,switch选择语句和for,do,while循环语句有了更深刻的理解,提升了我们的逻辑思维能力。同时对ASCII码,随机数生成的应用也有了一些了解。另外,也提升了我们的模块化思维能力,比如我们用三个模块来构建此游戏。并且游戏中每个功能的实现都是由函数模块构成的。

GitHub源码链接:

https://github.com/CaoCoder/C_code

整体代码

头文件

//宏定义便于后期的更改
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS ROW + 2
//设置11*11的格子防止数组越界。
#define COLS COL + 2
#define ROW 9
#define COL 9
//以下是对函数的声明
void InitMine(char mine[ROWS][COLS], int row, int col, char set);
void SetMine(char mine[ROWS][COLS], int row, int col);
void DisplayMine(char show[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//设置雷的个数
#define minecount 10

源文件

#define _CRT_SECURE_NO_WARNINGS
#include "12_9game.h"//引用自己创建的头文件用双引号
//对9*9雷区遍历查*的数量和minecount进行比较。
int is_win(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int c = 0;
	for (i = 1; i <= row; i++)
	{
		for (j = 1; j <= col; j++)
		{
			if ('*' == show[i][j])
			{
				c++;
			}
		}
	}
	return c;
}
//用递归,进行实现一片展开的功能
void SpreadMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
	//调用CountMine函数进行查找周围八个位置雷的个数。
	int count = CountMine(mine, x, y);
	if (0 == count)
	{
		show[x][y] = ' ';
		if (show[x][y + 1] == '*')
			SpreadMine(mine, show, x, y + 1);
		if (show[x][y - 1] == '*')
			SpreadMine(mine, show, x, y - 1);
		if (show[x + 1][y] == '*')
			SpreadMine(mine, show, x + 1, y);
		if (show[x + 1][y - 1] == '*')
			SpreadMine(mine, show, x + 1, y - 1);
		if (show[x + 1][y + 1] == '*')
			SpreadMine(mine, show, x + 1, y + 1);
		if (show[x - 1][y] == '*')
			SpreadMine(mine, show, x - 1, y);
		if (show[x - 1][y + 1] == '*')
			SpreadMine(mine, show, x - 1, y + 1);
		if (show[x - 1][y - 1] == '*')
			SpreadMine(mine, show, x - 1, y - 1);
	}
	else
	{
		//如果该位置是雷,则将雷的个数显示在此位置
		show[x][y] = count + '0';
		//由于‘0'的的ASCII码值为48,‘1'的ASCII码值是49.
		// 所以
		//1 + '0' = '1'
		//2 + '0' = '2'
	}
}
//查找非雷位置周围八个位置有多少雷
int CountMine(char mine[ROWS][COLS], int x, int y)
{
	return  (mine[x - 1][y + 1] + mine[x][y + 1]
		+ mine[x + 1][y + 1] + mine[x - 1][y]
		+ mine[x + 1][y] + mine[x - 1][y - 1]
		+ mine[x][y - 1] + mine[x + 1][y - 1] - 8 * '0');
}
//扫雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int c = row * col - minecount;

	while (1)
	{
		printf("请输入坐标(x,y):");
		scanf("%d%d", &x, &y);
		//将输入的坐标限制在9*9的雷区
		if (x <= row && x >= 1 && y <= col && y >= 1)
		{
			if (mine[x][y] == '0')
			{
				SpreadMine(mine, show, x, y);
				system("cls");
				DisplayMine(show, ROW, COL);
				if (is_win(show, ROW, COL) == minecount)
				{
					printf("恭喜你赢了!\n");
					DisplayMine(mine, ROW, COL);
					break;
				}
			}
			else
			{
				printf("很遗憾你被炸死了~\n");
				DisplayMine(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("输入坐标越界,请重新输入:");
		}
	}
}
//初始化棋盘,一个函数,两次调用。
void InitMine(char mine[ROWS][COLS], int row, int col, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			mine[i][j] = set;
		}
	}
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{

	int c = 0;
	while (c != minecount)
	{
		int x = rand() % row + 1;
		//用rand()函数对9求余得到0~9这十个数,再加一就得到1~10.
		int y = rand() % col + 1;
		if (mine[x][y] == '0')
		{
			//如果此位置为‘0',即非雷
			//则设置为‘1',即雷
			mine[x][y] = '1';
			c++;
		}
	}
}
//运用双重循环打印9*9的B雷区
void DisplayMine(char show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			if (0 == i)
			{
				printf("%d ", j);
			}
			else
			{
				printf("%c ", show[i][j]);
			}
		}
		printf("\n");
	}
}

源文件

#define _CRT_SECURE_NO_WARNINGS
#include "12_9game.h"
game()
{
	system("cls");//对画面进行清屏,使页面简洁。
	char mine[ROWS][COLS] = { 0 };//创建11*11数组
	char show[ROWS][COLS] = { 0 };
	//第一次传mine数组名
	InitMine(mine, ROWS, COLS, '0');
	//第二次传show数组名
	InitMine(show, ROWS, COLS, '*');
	//在A雷盘布置雷,所以需要传mine数组名
	SetMine(mine, ROW, COL);
	//用B盘进行展示雷的信息和结果
	DisplayMine(show, ROW, COL);
	//进行排雷
	FindMine(mine, show, ROW, COL);
}
menu()
{
	printf("┏━━━━━━┓━━━━━━━━━━━━━━━━━━━━┓━━━━━━━━━━━┓\n");
	printf("┣━━━━━━┫━━━━━━1.PLAY━━━━━━━━┫━━━━━━━━━━━┫\n");
	printf("┣━━━━━━┫━━━━━━1.EXIT━━━━━━━━┫━━━━━━━━━━━┫\n");
	printf("┗━━━━━━┛━━━━━━━━━━━━━━━━━━━━┛━━━━━━━━━━━┛\n");
}
test()
{
	//用rand()函数之前需要先用srand函数。
	srand((unsigned int)time(NULL));
	int n = 0;
	//游戏进去之后需要先有个菜单所以用上do语句
	do
	{
		//打印菜单
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新选择\n");
			break;
		}
	} while (n);
}
//程序的入口
int main()
{
	test();
	return 0;
}

到此这篇关于基于C语言扫雷游戏的设计与实现的文章就介绍到这了,更多相关C语言扫雷游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言实现扫雷游戏小项目

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 一.基本实现功能 1.建立一个游戏菜单 2.创建游戏盘,一个埋雷,一个显示. 3.打印游戏盘. 4.翻开坐标如若没踩到雷显示周围一圈8个有几个雷. 5.判断胜利 翻开的格子数等于没埋雷的个数. 二.源代码展示 1.头文件  minesweep.h #pragma once #include <stdio.h> #include <Windows.h> #include <string.h> #i

  • C语言扫雷游戏的简单实现

    今天来用c语言做一个扫雷功能的简单实现,首先创建一个test.c来用于在写代码的途中测试扫雷代码,game.h来存放实现扫雷函数需要用到的头文件,game.c来存放最终的成品. 首先用函数打印一个菜单,让玩家选择进行游玩扫雷游戏或者退出,考虑到玩家会输入1和2以外的数字,我们加上一个fefault,将菜单放入do-while循环中,while的结束条件为choose为0,玩家在结束一场游戏后可以重新走一边循环,保证用户在结束一把扫雷之后可以选择继续进行下一局或是退出游戏. void menu()

  • 基于C语言实现简单的扫雷小游戏

    本文实例为大家分享了C语言实现简单的扫雷小游戏的具体代码,供大家参考,具体内容如下 首先来规划一下扫雷游戏实现的几个步骤: 初始化棋盘:二维数组的遍历及赋值 为了后续代码的简洁方便,我们用'0'来初始化 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { int i = 0; int j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++

  • C语言实现经典扫雷游戏流程

    目录 扫雷小游戏简介 一.分析与实现 1.设计棋盘 2.放置雷以及排雷 二.扫雷小游戏演示 三.源码 总结 扫雷小游戏简介 想必很多人小时候电脑没网的时候都玩儿过这个经典的小游戏,也都被它折磨过.其实这个游戏很简单,通过点击相应位置显示的数字来确定周围雷的数量,在避免踩到雷的同时找出所有的雷就能获得胜利. 这次我们用C语言来实现一个简单的扫雷小游戏. 一.分析与实现 1.设计棋盘 要玩儿扫雷游戏,我们首先应该有一个棋盘.这个棋盘中的雷应该是在开始玩儿游戏的时候就已经布置好了,不能随意变化.但是呢

  • c语言实现含递归清场版扫雷游戏

    目录 一,设计思路 二.实现方式 1.菜单的打印 2.game函数 3.棋盘的初始化与打印  4.雷的放置,雷的个数 5.递归实现一片效果  6.排查雷  三.完整代码 总结 一,设计思路 想必大家都玩过扫雷  这便是一个标准的扫雷,换做代码实现,我们需要考虑以下几点: 1.棋盘的设计与初始化 2.在棋盘中放入雷 3.统计雷数 4.如何实现"一片"的效果 5.输赢的判断 接下来我们进行具体操作. 二.实现方式 1.菜单的打印 对任意一个游戏,菜单是必不可少的,也是最简单的部分,直接上代

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

    目录 一.理清逻辑 二.创建文件 三.具体步骤 1.打印菜单 2.创建二维数组 3.初始化二维数组并打印棋盘 4.布置雷 5.排查雷(内含判断胜负) 四.完整代码 五.待改进 一.理清逻辑 我们先来看一下实现扫雷的基本逻辑 1.打印游戏菜单 2.创建并初始化二维数组 3.布置雷 4.进行排雷 二.创建文件 我创建了三个文件,分别为test.c.game.h和game.c test.c文件用于实现进入游戏.退出游戏.判断输赢.打印菜单等逻辑 game.c用于编写游戏的主要实现方法 game.h存放

  • 基于C语言扫雷游戏的设计与实现

    目录 1 引言 2 相关工作 3 本文方法 4 结果与分析 5 总结 整体代码 1 引言 伴随着信息技术的快速发展,近年来,人们的生活已经离不开计算机.生活娱乐几乎都是在计算机上进行的.其中的扫雷游戏就是之一.扫雷游戏是微软公司在1992年在windows系统上发布的一款益智类小游戏,直到今天这款小游戏依然存在,可见此款游戏的成功.本文将用Visual Studio 2019作为开发工具来模拟实现扫雷游戏.经过大一第一学期的学习,我们对C语言的理论及其相关知识有了一定的认识和了解.本文可以把我们

  • C语言扫雷游戏的实现方法

    本文实例为大家分享了C语言扫雷游戏的实现代码,供大家参考,具体内容如下 实现扫雷 1.创建俩12*12的字符数组,一个用作放雷,一个呈现给用户 2.利用随机数往防雷数组中产生雷 3.设计呈现给用户的数组 4.利用输入坐标判断--如果有雷,游戏结束并呈现放雷数组:如果无雷,计算周围一圈雷的数量并显示 代码如下 头文件 #define _CRT_SECURE_NO_WARNINGS #pragma once #include<stdio.h> #include<windows.h> #

  • C语言扫雷游戏的实现

    本文实例为大家分享了C语言扫雷游戏的具体代码,供大家参考,具体内容如下 扫雷游戏的实现 1.game.h模块 代码实现如下: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> #define EASY_COUNT 10 #define ROW 9 #define COL 9 #define ROWS ROW+2 #define COLS C

  • 老程序员教你一天时间完成C语言扫雷游戏

    目录 扫雷游戏 1.菜单 2.初始化棋盘 3.打印棋盘 4.布置雷 5.排查雷 6.整体效果展示 7.代码分享 7.1 test.c 7.2 game.c 7.3 game.h 总结 扫雷游戏 今天我们就要设计一款这样的游戏,首先需要设置棋盘,然后对棋盘进行随机布雷,最后在排雷. 1.菜单 首先制作一个简易菜单 int main() { int input; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:\n");

  • C语言扫雷游戏的实现代码

    这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹.扫描炸弹.标记炸弹.百分百第一次不被炸死等功能. 编译器:vs2015 功能模块图 源代码 #include<stdio.h> #include<stdlib.h> #include<time.h> void show(int cbd[10][10],int u[10][10]) //界面输出函数 { int i, j; //for (i = 0; i < 10; i++) //输出全部炸弹信息(上帝视角

  • C语言俄罗斯方块游戏课程设计

    本文实例为大家分享了C语言实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 1.设计流程 2.相关程序 #include<stdio.h> #include<stdlib.h> #include<graphics.h> #include<time.h> #include<dos.h> #include<bios.h> #define LEFT 0x4b00 /*键盘码*/ #define RIGHT 0x4d00 #define

  • C语言实现第一次防死版扫雷游戏

    目录 前言 一.功能描述 二.实现的步骤 1.菜单的打印函数: 2.初始化雷盘函数: 3.打印雷盘函数: 4.埋雷函数: 5.排雷函数: 6.防止第一次死的函数: 7.展开函数: 总结 前言 扫雷这款经典的游戏想必大多数人都玩过了,今天用C语言实现了扫雷小游戏,小伙伴们快来看看吧. 一.功能描述 扫雷代码有以下功能: 1.若输入的坐标周围没雷,可以直接展开 2.防止第一次玩就直接踩雷,被炸死 3.若输入的坐标周围有雷,会显示周围雷的个数 4.若排雷失败,会展示出雷图的雷分布是怎样的 二.实现的步

  • C语言简易扫雷游戏

    本文实例为大家分享了C语言扫雷游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAX_ROW 9 #define MAX_COL 9 #define MINE_C0UNT 10 void menu() { printf("************************\n"); printf("***** 1.play *

  • C语言实现扫雷游戏详解(附源码)

    目录 1.游戏的功能 2.游戏实现的基本思路 2.1实现菜单给玩家选择 2.2初始化棋盘 2.3数组大小的问题 2.4对棋盘赋值 2.5打印棋盘 2.6布置雷 2.7排查雷 3.代码基本实现部分 3.1主函数部分 3.2 初始化棋盘 3.3对两个棋盘进行赋值 3.4打印棋盘 3.5布置雷 3.6排查雷  3.7函数声明 4.扫雷游戏的源代码 总结 1.游戏的功能 游戏的主要功能有 1:棋盘内有若干个雷 2:玩家输入要排查雷的坐标 3:在玩家输入的坐标处显示周围八个坐标有几个雷 3:若玩家将所有的

随机推荐