扫雷

#扫雷游戏
这个扫雷游戏和之前的三子棋游戏有异曲同工之处,通过数组初始化棋盘,利用各个函数实现游戏的各个模块功能,玩家利用键盘输入坐标达到翻雷的目的。相似却不尽相同,扫雷游戏需要创作两张地图,一张是初始的图,一张是翻雷过后结果显示。
游戏创作思路:
利用宏定义棋盘的行(row)MAX_ROW 9
列 (col) MAX_COL 9
雷的个数 DEFAULT_MINE_COUNT 10
1、设计主菜单,让玩家选择游戏是否开始

int menu() {
	printf("======================\n");
	printf(" 1. 开始游戏\n");
	printf(" 0. 结束游戏\n");
	printf("======================\n");
	printf(" 请输入您的选择: ");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

游戏开始选择界面

   1、利用数组初始化两个棋盘“showMap”显示全都设为 * 和“mineMap”.还是利用时间戳随机生成雷(1)
void init(char showMap[MAX_ROW][MAX_COL],
	char mineMap[MAX_ROW][MAX_COL]) {
	// 1. 初始化 showMap, 全都设为 * 即可
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			showMap[row][col] = '*';
		}
	}
	// 2. 初始化 mineMap, 先全设为 '0', 然后随机生成 N 个 '1' 
	//    N 的值就是 DEFAULT_MINE_COUNT
	//    复制粘贴虽然爽, 但是一定要小心~~~ 
	for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			mineMap[row][col] = '0';
		}
	}
	int n = DEFAULT_MINE_COUNT;
	while (n > 0) {
		// 生成雷的随机位置. 
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (mineMap[row][col] == '1') {
			// 如果当前位置已经有雷了, 就直接进入下次循环, 重新
			// 产生随机位置. 
			continue;
		}
		mineMap[row][col] = '1';
		n--;
	}
}

   2、将游戏的两个地图打印出来且在玩家每次扫雷结束后更新地图
void printMap(char theMap[MAX_ROW][MAX_COL]) {
	/*for (int row = 0; row < MAX_ROW; row++) {
		for (int col = 0; col < MAX_COL; col++) {
			printf("%c ", theMap[row][col]);
		}
		printf("\n");
	}*/
	// 先打印出第一行, 第一行就是包含所有的列号
	// 然后在打印下面的每一行的时候再打印行号
	printf("  |");
	for (int col = 0; col < MAX_COL; col++) {
		printf("%d ", col);
	}
	printf("\n");
	printf("--+------------------\n");
	for (int row = 0; row < MAX_ROW; row++) {
		printf(" %d|", row);
		for (int col = 0; col < MAX_COL; col++) {
			printf("%c ", theMap[row][col]);
		}
		printf("\n");
	}
}

// 根据当前 row, col 的位置, 计算出当前位置周围有几个雷
// 并且更新显示到 showMap 中. 
void updateShowMap(char showMap[MAX_ROW][MAX_COL],
	char mineMap[MAX_ROW][MAX_COL], int row, int col) {
	int count = 0;
	for (int r = row - 1; r <= row + 1; r++) {
		for (int c = col - 1; c <= col + 1; c++) {
			if (r < 0 || r >= MAX_ROW
				|| c < 0 || c >= MAX_COL) {
				// r, c 下标越界, 就直接跳过
				continue;
			}
			if (mineMap[r][c] == '1') {
				count++;
			}
		}
	}
	// 此时 count 里面就已经存好了 row, col 周围 八个格子 的雷的个数
	// 把这个结果写到 showMap 中即可. 
	// 需要把数字 count 转成对应的字符
	// 例如 count 为 2, 就需要转成 '2' (ASCII 50)
	showMap[row][col] = count + '0';
}

打印两张地图
3、玩家通过界面显示的坐标输入想要翻开的坐标即可参与游戏即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值