扫雷游戏__9*9

目录

一、扫雷游戏的功能说明

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

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

3、扫雷的棋盘是9*9的格子

4、 默认随机布置10个雷

5、可以排查雷【如果位置不是雷,就显示周围有几个雷】【如果位置是雷,就炸死游戏结束】

6、把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束

二、数据结构分析

【越界问题的解决】:

【如何解决数据冲突呢?】:

【文件结构】:

三、扫雷代码

【game.h】

【game.c】

【test.c】

四、运行示意图

【被炸死了】

【未完待续】


一、扫雷游戏的功能说明


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

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

3、扫雷的棋盘是9*9的格子

4、 默认随机布置10个雷

5、可以排查雷
【如果位置不是雷,就显示周围有几个雷】
【如果位置是雷,就炸死游戏结束】

6、把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束

二、数据结构分析

1、扫雷时,我们需要创建一个数组来储存布置的雷和排查出的雷信息。

首先想到创立9*9的数组存放信息(这个位置布置雷放1,反之,则为0)

假设排查(2,4)这个坐标,访问它周围一圈8个方格位,统计周围雷的个数

【越界问题的解决】:

假设排查(1,8)这个坐标,访问它周围一圈8个方格位,统计周围雷的个数时,发现上面三个坐标会越界。

那我们就给数组扩大一圈,设计为11*11,雷的放置区域依旧是9*9,这样就解决这个问题啦。

当我们在棋盘上布置雷时,棋盘上雷的信息为1,无雷的信息为0;

假设我们排查一个位置的坐标后,它不是雷,统计它周围一圈雷的个数为1,我们需要把排查出的雷的数量信息记录储存,并且打印出来,作为排雷的重要参考信息。

但是这个雷的个数信息放哪里?如果是放在布置雷的数组中,那么雷的信息和周围一圈雷的个数信息,这两者会发生混淆和打印错误。

【如何解决数据冲突呢?】:

Plan A:布置雷时,不用数字,使用字符。【例:雷为(@),非雷为(^)】

Plan B:设置2个棋盘(11*11),一个放布置好雷的信息(对应数组mine),另一个放排查出的雷的信息(对应数组show)。【本文使用Plan B】:把雷布置于数组mine中,并在这里排查雷,排查出的数据放在数组show,并打印数组show为后面排查做参考。

char mine[11][11] = {0};  //存放布置好雷的信息
char show[11][11] = {0};  //存放排查出雷个数的信息
【文件结构】:
test.c   //文件中写游戏的运行测试逻辑
game.c   //文件中写游戏中函数的实现
game.h   //文件中写游戏需要使用的数据类型和函数声明

三、扫雷代码

【game.h】

#pragma once

#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 COL+2

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);

//布置雷的位置
void SetMine(char board[ROWS][COLS],int row,int col);

//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

【game.c】

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("----------  开始扫雷游戏  ----------\n");
	//打印数组show棋盘
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char board[ROWS][COLS], int row, int col)
{
	//布置十个雷
	//生成随机的坐标,布置雷
	int count = EASY_COUNT;     //count=10
	while (count)  
	//count=0时,雷都布置完了,不再进去循环了
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')  
		//设置这个条件,是防止一个地方重复布置雷
		{
			board[x][y] = '1';
			count--;
		}
	}
}


int GetMineCount(char mine[ROWS][COLS], int x, int y)
//统计我们选择的坐标(它不是雷)周围一圈的雷个数
{
	return(mine[x - 1][y]
		+ mine[x - 1][y - 1]
		+ mine[x][y - 1]
		+ mine[x + 1][y - 1]
		+ 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 win = 0;
	while (win < row * col - EASY_COUNT)
	{
		printf("请输入要排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
			//防止输入的坐标超过棋盘范围
		{
			if (mine[x][y] == '1')
			//点到雷了
			{
				printf("很遗憾,你被炸死啦!\n");
				//展示数组mine中雷的位置
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
          //没点到雷,统计这个坐标周围一圈雷的个数
			{
				int count = GetMineCount(mine, x, y);
				show[x][y] = count + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		//输入的坐标超出范围
		{
			printf("输入坐标错误,重新输入!\n");
		}
	}
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功啦!!\n");
		DisplayBoard(mine, ROW, COL);
	}

}

【test.c】

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()  // 打印玩游戏开始菜单
{
	printf("************************\n");
	printf("*******  1.play  *******\n");
	printf("*******  0.exit  *******\n");
	printf("************************\n");
}

void game( )
{
	char mine[ROWS][COLS];   //存放布置好的雷
	char show[ROWS][COLS];   //存放已经排查出的雷的信息

	//对棋盘进行初始化
	InitBoard(mine, ROWS, COLS, '0');   //数组mine开始全为0
	InitBoard(show, ROWS, COLS, '*');   //数组show开始全为*

	//打印棋盘
	//DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);

	//布置雷的位置
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);

	//排查雷
	FindMine(mine, show, ROW, COL);

}

int main( )
{
	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);

	return 0;
}

四、运行示意图

【被炸死了】

【未完待续】

以下是一个基于C语言的9x9扫雷游戏代码示例,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROWS 9 #define COLS 9 #define ROW 9 #define COL 9 #define COUNT 10 void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch); void DisplayBoard(char board[ROWS][COLS], int row, int col); void SetMine(char board[ROWS][COLS], int row, int col, int count); int GetMineCount(char board[ROWS][COLS], int x, int y); int main() { char mine[ROW][COL] = {0}; // 扫雷棋盘 char show[ROW][COL] = {0}; // 显示棋盘 int x, y; // 坐标 int win = 0; // 是否胜利 int total = ROW * COL - COUNT; // 扫雷总数 // 初始化棋盘 InitBoard(mine, ROW, COL, '0'); InitBoard(show, ROW, COL, '*'); DisplayBoard(show, ROW, COL); // 布雷 srand((unsigned int)time(NULL)); SetMine(mine, ROW, COL, COUNT); while (win < total) { printf("请输入坐标(x,y):\n"); scanf("%d%d", &x, &y); if (x < 1 || x > ROW || y < 1 || y > COL) { printf("坐标非法,请重新输入!\n"); continue; } x--; y--; if (mine[x][y] == 'X') // 踩雷 { printf("很遗憾,你踩雷了!\n"); DisplayBoard(mine, ROW, COL); break; } else if (show[x][y] != '*') // 重复操作 { printf("该位置已经被打开,请重新输入!\n"); continue; } else // 打开格子 { int count = GetMineCount(mine, x, y); show[x][y] = count + '0'; DisplayBoard(show, ROW, COL); win++; if (win == total) // 胜利 { printf("恭喜你,扫雷成功!\n"); DisplayBoard(mine, ROW, COL); break; } } } return 0; } // 初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch) { int i, j; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { board[i][j] = ch; } } } // 显示棋盘 void DisplayBoard(char board[ROWS][COLS], int row, int col) { int i, j; printf(" "); for (i = 1; 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 ", board[i - 1][j - 1]); } printf("\n"); } } // 布雷 void SetMine(char board[ROWS][COLS], int row, int col, int count) { int i, x, y; for (i = 0; i < count; i++) { do { x = rand() % row; y = rand() % col; } while (board[x][y] == 'X'); board[x][y] = 'X'; } } // 计算周围雷数 int GetMineCount(char board[ROWS][COLS], int x, int y) { int count = 0; if (x > 0 && board[x - 1][y] == 'X') count++; if (x < ROW - 1 && board[x + 1][y] == 'X') count++; if (y > 0 && board[x][y - 1] == 'X') count++; if (y < COL - 1 && board[x][y + 1] == 'X') count++; if (x > 0 && y > 0 && board[x - 1][y - 1] == 'X') count++; if (x > 0 && y < COL - 1 && board[x - 1][y + 1] == 'X') count++; if (x < ROW - 1 && y > 0 && board[x + 1][y - 1] == 'X') count++; if (x < ROW - 1 && y < COL - 1 && board[x + 1][y + 1] == 'X') count++; return count; } ``` 该代码实现了一个基本的9x9扫雷游戏,具有布雷、打开格子、计算周围雷数等功能。但是,该代码仅供参考,完整的扫雷游戏需要进一步完善和优化。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值