快快来扫雷(扫雷详解)

本文详细介绍了如何在控制台上实现经典扫雷游戏,包括使用9x9棋盘和10个随机雷的布局,通过二维数组数据结构存储雷和排查信息,以及文件结构的设计,如game.h、test.c和game.c的分工。作者还展示了关键代码段,如初始化、打印棋盘和雷的操作,以及用户交互部分。
摘要由CSDN通过智能技术生成

1.扫雷游戏的分析和设计

1.1扫雷游戏的功能说明

*使用控制台实现经典的扫雷游戏

*游戏可以通过菜单实现继续玩或者退出游戏

*扫雷的棋盘是经典的9*9的格子

*默认随机布置10个雷

*可以排查雷

1.2游戏的分析和设计

1.2.1数据结构的分析

扫雷过程中,布置的雷和排查出的雷的信息都需要储存,所以我们需要一定的数据结构来储存这些信息,因此我们可以创建两个9*9的二维数组来达到储存的目的。一个数组名mine,另一个数组名为show。mine数组用来储存布置雷的信息,show数组用来储存排查出雷的信息。

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数是1. 假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下⾯的三 个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11 是⽐较合适。

mine数组最开始初始化为'0',show数组初始化为'*'.

布置完雷后的mine数组

show数组

1.2.2文件结构设计

这里设计了三个文件

(1)头文件game.h(文件中需要的函数声明和一些数据类型)

(2)test.c(文件中游戏逻辑)

(3)game.c(文件中函数的实现)

2.扫雷游戏代码

game.h

#pragma once
#include<stdlib.h>
#define EASY_COUNT 10
#define Row 9
#define Col 9
#define Rows Row+2
#define Cols Col+2
//对两个数组进行初始化
void Initarr(char arr[Rows][Cols], int rows, int cols, char set);
//打印show数组
void displayarr(char arr[Rows][Cols], int row, int col);
//布置雷
void setarr(char arr[Rows][Cols], int row, int col);
//找雷
void findarr(char arr1[Rows][Cols], char arr2[Rows][Cols], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include<stdio.h>
void Initarr(char arr[Rows][Cols], int row, int col, char set)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			arr[i][j] = set;
		}
	}
}
void displayarr(char arr[Rows][Cols], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
}
void setarr(char arr[Rows][Cols], int row, int col)
{

	int count = EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}
void findarr(char arr1[Rows][Cols], char arr2[Rows][Cols], int row, int col)
{
	int x = 0, y = 0, win = 0;
	while (win < (row * col - EASY_COUNT))
	{
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		if(x>=1&&x<=row&&y>=1&&y<=col)
		{

			if (arr1[x][y] == '1')
			{
				printf("oh!你被炸死了!\n");
				displayarr(arr1, Row, Col);
				break;
			}
			else
			{
				win++;
				int count = 0;
				count = arr1[x - 1][y - 1] + arr1[x - 1][y] + arr1[x - 1][y + 1] + arr1[x][y - 1] + arr1[x][y + 1] + arr1[x + 1][y - 1] + arr1[x + 1][y] + arr1[x + 1][y + 1] - 8 * '0';
				arr2[x][y] = count+'0';
				displayarr(arr2, Row, Col);
			}
		}
		else
		{
			printf("非法坐标,请重新输入。\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,扫雷成功了!\n");
		displayarr(arr1, Row, Col);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{
	printf("*******************\n");
	printf("***** 1.play ******\n");
	printf("***** 0.exit ******\n");
	printf("*******************\n");
}
void game()
{
	printf("-----扫雷游戏开始-----\n");
	char mine[Rows][Cols], show[Rows][Cols];
	//对数组初始化,mine初始化为'0',show初始化为'*'
	Initarr(mine, Rows, Cols, '0');
	Initarr(show, Rows, Cols, '*');
	//打印棋盘
	displayarr(show, Row, Col);
	//设置雷
	setarr(mine, Row, Col);
	//找雷
	findarr(mine, show, Row, Col);
}
void test()
{
	int x;
	do
	{
		menu();
		scanf("%d", &x);
		switch (x)
		{
		case 1:
			game();
			break;
		case 0:break;
		default:printf("输入错误,请重新输入\n");
		}
	} while (x);
}
int main()
{
	test();
	return 0;
}

扫雷游戏到此就结束咯!当然还有更高难度的扫雷游戏,例如16*16棋盘的,30*16棋盘的等等。

大家可以试着去写写哦!目前雯雯文能力有限,和你们一起努力!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值