扫雷小游戏

扫雷小游戏

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
/*
* 1) 先创建两个二维数组表示地图
*	show_map: 玩家看到的地图, 已翻开(数字)和未翻开(*)两种状态
*	mine_map: 地雷布局图, 每个位置是否为地雷(0 - 不是地雷/1 - 是地雷)
* 2) 初始化第一步的两个地图
*	show_map: 将每个数组元素设置为 *
*	mine_map: 随机生成 10 个地雷
* 3) 打印地图
* 4) 提示用户输入一个坐标, 表示翻开某个位置, 进行必要的合法性判断
* 5) 该位置是否是地雷; 如果是地雷 游戏结束
* 6) 如果不是地雷, 先判断游戏是否胜利(胜利 - 把所有不是地雷的格子都翻开)
* 7) 计算当前位置的周围有几个雷(未实现翻开一片的功能)
*/
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10

int Menu() {
	printf("---------------------------\n");
	printf("        1. 开始游戏        \n");
	printf("        2. 游戏结束        \n");
	printf("---------------------------\n");
	printf("请输入您的选择: ");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
void Init(char show_map[MAX_ROW][MAX_COL], char mine_map[MAX_ROW][MAX_COL]) {
	srand((unsigned int)time(0));
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			show_map[row][col] = '*';
		}
	}
	// 生成随机个地雷, 0 - 不是地雷/1 - 是地雷
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			mine_map[row][col] = '0';
		}
	}
	int n = MINE_COUNT;
	while (n > 0) {
		// 生成随机坐标
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (mine_map[row][col] == '1') {
			// 说明随机生成的坐标已经是地雷, 需要重新生成坐标
			continue;
		}
		else {
			mine_map[row][col] = '1';
			--n;
		}
	}
}
void PrintMap(char show_map[MAX_ROW][MAX_COL]) {
	// 
	printf("   |");
	for (int i = 0; i < MAX_COL; i++) {
		printf(" %d", i);
	}
	printf("\n---|------------------\n");
	for (int row = 0; row < MAX_ROW; row++) {
		printf(" %d | ", row);
		for (int col = 0; col < MAX_COL; col++) {
			printf("%c ", show_map[row][col]);
		}
		printf("\n");
	}
}
int UpdateShowMap(int row, int col, char show_map[MAX_ROW][MAX_COL],
	char mine_map[MAX_ROW][MAX_COL]) {
	// 根据当前位置来判定这个位置周围的 8 个格子有几个地雷
	// 并将计算的数字更新到 show_map 中去
	int num = 0;
	for (int i = row - 1; i <= row + 1; i++) {
		for (int j = col - 1; j <= col + 1; j++) {
			if (i >= 0 && j >= 0 && i < MAX_ROW
				&& j < MAX_COL && mine_map[i][j] == '1') {
				num++;
			}

		}
	}
	show_map[row][col] = '0' + num;
	return num;
}
void Game() {
	// 创建地图, 初始化
	char show_map[MAX_ROW][MAX_COL];
	char mine_map[MAX_ROW][MAX_COL];
	Init(show_map, mine_map);


	while (1) {
		// 打印地图
		PrintMap(show_map);
		// 用户输入坐标
		printf("请输入一组坐标: ");
		int row = 0, col = 0;
		// 已经翻开的非地雷的个数
		int block_mine_count_already_show = 0;
		scanf("%d %d", &row, &col);
		// 在这里清屏
		// system("cls");
		// 合法性检测
		if (row < 0 || row >= MAX_ROW || col < 0 || col > MAX_COL) {
			printf("您输入的坐标不合法, 请重新输入\n");
			continue;
		}
		if (show_map[row][col] != '*') {
			printf("您输入的坐标已翻开, 请重新输入\n");
			continue;
		}
		// 判定是否是地雷
		if (mine_map[row][col] == '1') {
			printf("游戏结束!\n");
			// 打印地雷地图
			PrintMap(mine_map);
			break;
		}
		// 判定游戏是否胜利
		//	判定所有非地雷的位置都被翻开
		++block_mine_count_already_show;
		if (block_mine_count_already_show == MAX_COL * MAX_ROW - MINE_COUNT) {
			printf("游戏胜利!\n");
			PrintMap(mine_map);
			break;
		}
		// 统计当前位置雷的个数
		int num = UpdateShowMap(row, col, show_map, mine_map);
		if (num == 0) {
			for (int i = row - 1; i <= row + 1; i++) {
				for (int j = col - 1; j <= col + 1; j++) {
					if (i == row && j == col) {
						continue;
					}
					if (i >= 0 && j >= 0 && i < MAX_ROW
						&& j < MAX_COL) {
						UpdateShowMap(i, j, show_map, mine_map);
					}
				}
			}
		}
	}
}


int main() {
	while (1) {
		int choice = Menu();
		if (choice == 1) {
			printf("游戏开始!\n");
			Game();
		}
		else if (choice == 2) {
			printf("游戏结束!\n");
			return 0;
		}
		else {
			printf("您的选择有误, 请重新输入您的选择!\n");
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值