栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言扫雷详解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言扫雷详解

这篇文章将会以一个头文件,两个源文件来讲解
头文件:一些宏定义以及有关函数的声明
源文件:1. 游戏运行逻辑代码
2. 游戏函数实现代码

游戏运行逻辑代码 进入游戏前的准备代码实现
#include "game.h"

void menu()
{
	printf("**************************n");
	printf("**************************n");
	printf("*******  1. Enter  *******n");
	printf("*******  0. Exit   *******n");
	printf("*******  3. Rules  *******n");
	printf("**************************n");
	printf("**************************n");

}

void rules()
{
	printf("游戏规则如下:n");
	printf("数字代表格子周围的8个格子有多少个雷n");
	printf("扫完到雷或者扫完全部的雷,游戏才会结束n");
}

void game()
{

}
int main()
{
	menu();
	int input = 0;

	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("正在进入游戏n");
			game();
			break;
		case 0:
			printf("正在退出n");
			break;
		case 3:
			rules();
			printf("进入游戏n");
			game();
			break;
		default:
			printf("输入错误,请重新输入n");
			break;
		}
	}while (input != 0);
	return 0;
}

相信不需要过多的解释,运行的效果就是输入1进入游戏,输入0退出游戏,如果输入错误就重新输入,并且可以循环玩扫雷

game()函数的实现


如图所示,如果点开黑色的格子,那么就需要检测周围的八个格子有多少个雷,
所以就需要创建一个二维数组,假设1是雷,0不是雷,然后再放入二维数组之中
但是如果这样,点开了最外圈的格子,那么访问周围的八个格子就会存在数组越界

可以通过if来判断是否为边界从来执行是否访问周边元素,但是执行效率就很低,因为有那么多的格子,所以可以在初始化的时候初始化大一圈

这样数组就不会越界访问了。
所以,就需要两个字符数组,一个放置雷,一个用来展示
并且还需要一个打印棋盘的代码

代码实现

// 初始化数组内元素 
void Init_arr0(char mine[Rows][Cols],char show[Rows][Cols], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			mine[i][j] = '0';
			show[i][j] = '*';
		}
	}
}

// 放置雷
void Set_mine(char mine[Rows][Cols], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = Easy;

	while (count)
	{
		i = rand() % row + 1;
		j = rand() % col + 1;
		if (mine[i][j] == '0')
		{
			mine[i][j] = '1';
			count--;
		}
	}
}

// 打印棋盘
void Display(char mine[Rows][Cols], int row, int col)
{
	int i = 0;
	printf("0 ");
	for (i = 1; i < row; i++)
	{
		printf("%d ", i);
	}
	printf("n");
	for (i = 1; i < col; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j < col ; j++)
		{
			printf("%c ", mine[i][j]);//玩家棋盘数组
		}
		printf("n");
	}
}

我无了,哪个大佬帮帮我看看源代码哪里错了

头文件

#define Col 10

#define Easy 10


// 初始化为0, *
void Init_arr0(char mine[Rows][Cols], char show[Rows][Cols], int, int);

// 布置雷
void Set_mine(char mine[Rows][Cols], int, int);

// 打印棋盘
void Display(char mine[Rows][Cols], int, int);

// 扫雷函数
void Saolei(char mine[Rows][Cols], char show[Row][Col], int, int);

// 检测周围有多少雷
int Count(char mine[Rows][Cols], int, int);


#include 
#include 
#include 

游戏函数源代码

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

// 初始化数组内元素 
void Init_arr0(char mine[Rows][Cols],char show[Rows][Cols], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			mine[i][j] = '0';
			show[i][j] = '*';
		}
	}
}

// 放置雷
void Set_mine(char mine[Rows][Cols], int row, int col)
{
	int i = 0;
	int j = 0;
	int count = Easy;

	while (count)
	{
		i = rand() % row + 1;
		j = rand() % col + 1;
		if (mine[i][j] == '0')
		{
			mine[i][j] = '1';
			count--;
		}
	}
}

// 打印棋盘
void Display(char mine[Rows][Cols], int row, int col)
{
	int i = 0;
	printf("0 ");
	for (i = 1; i < row; i++)
	{
		printf("%d ", i);
	}
	printf("n");
	for (i = 1; i < col; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j < col ; j++)
		{
			printf("%c ", mine[i][j]);//玩家棋盘数组
		}
		printf("n");
	}
}

// 检测周围有多少雷
int Count(char mine[Rows][Cols],int x, int y)
{
	int count = 0;
	if (mine[x - 1][y - 1] == '1')
		count++;
	if (mine[x - 1][y] == '1')
		count++;
	if (mine[x - 1][y + 1] == '1')
		count++;
	if (mine[x][y - 1] == '1')
		count++;
	if (mine[x][y + 1] == '1')
		count++;
	if (mine[x + 1][y - 1] == '1')
		count++;
	if (mine[x + 1][y] == '1')
		count++;
	if (mine[x + 1][y + 1] == '1')
		count++;
	return count;
}
// 扫雷函数
void Saolei(char mine[Rows][Cols], char show[Row][Col], int row, int col)
{
	printf("请输入坐标:>");
	int x = 0, y = 0;
	

	while (1)
	{
		scanf("%d %d", &x, &y);
		if ((x > 0 && x < row) && (y > 0 && y < col))
		{
			if (mine[x][y] == '0')
			{
				char ch = '0';
				int count = Count(mine, x, y);
				show[x][y] = ch + count;
				Display(show, Row, Col);
			}
			else
			{
				printf("被炸死n");
				break;
			}
		}
	}
}

游戏逻辑实现代码

#include "game.h"

void menu()
{
	printf("**************************n");
	printf("**************************n");
	printf("*******  1. Enter  *******n");
	printf("*******  0. Exit   *******n");
	printf("*******  3. Rules  *******n");
	printf("**************************n");
	printf("**************************n");

}

void rules()
{
	printf("游戏规则如下:n");
	printf("数字代表格子周围的8个格子有多少个雷n");
	printf("扫完到雷或者扫完全部的雷,游戏才会结束n");
}

void game()
{
	srand((unsigned int)time(NULL));
	char mine[Rows][Cols] = { 0 };
	char show[Rows][Cols] = { 0 };
	// 初始化数组
	Init_arr0(mine, show, Rows, Cols);
	// 布置雷
	Set_mine(mine, Row, Col);
	// 打印棋盘
	// Display(mine, Rows, Cols);
	Display(show, Row, Col);
	Saolei(mine, show, Rows, Cols);


}
int main()
{
	
	int input = 0;

	do
	{
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("正在进入游戏n");
			game();
			break;
		case 0:
			printf("正在退出n");
			break;
		case 3:
			rules();
			printf("进入游戏n");
			game();
			break;
		default:
			printf("输入错误,请重新输入n");
			break;
		}
	}while (input != 0);
	return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/873192.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号