windows经典地雷小游戏(C语言实现)

实现游戏的流程

1.如何使用C语言表示双重身份的地雷图

我们可以使用一个showMap 并将它全部初始化为 * 并且每打印9个就换行
来表示对外显示的效果
再使用一个mineMap表示地雷地图

2.打印一下showMap

使用memset函数来直接赋初值 memset包含在string.h头文件中
memset(showMap, ‘*’, MAX_ROW * MAX_COL);
memset(mineMap, ‘0’, MAX_ROW * MAX_COL);
并且随机在mineMap中随机生成10个’1’表示地雷
使用rand 函数随机生成 row和col
int row = rand() % 9
int col = rand() % 9

3.让玩家输入坐标(row,col)

判断玩家输入的是否合法
如果row>MAX_ROW或者row<0
col>MAX_COL或者col<0
代表用户输入的不合法让用户重新输入
如果用户输入的位置已经被翻开了 也提示用户重新输入

4.判断玩家是否踩雷

5.更新地图

用户输入的坐标为(row,col)那么在他周围的坐标为:
在这里插入图片描述
那么我们只需要两重循环就可以判断出在(row,col)坐标周围有多少个地雷了并且将他表上’0’~‘8’
当然最重要的是如何将表更新
定义一个count 当旁边有雷就加1
那么就可以更新为:
showMap[row][col] = ‘0’ + count;

6.如何判断玩家获胜

其实这种方法很笨,是将不是雷的格子要全部翻开.
但是很可惜目前还没有学到使用第三方库,来显示扫雷中那种翻开是0的话旁边是0的格子全部自动翻开的样子

代码区域

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10
void init(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL]) {
    
    
	memset(showMap, '*', MAX_ROW * MAX_COL);
	memset(mineMap, '0', MAX_ROW * MAX_COL);
	srand( (unsigned int) time(0));
	int count = 0;
	while (count < MINE_COUNT)
	{
    
    
		int row = rand() % MAX_ROW;
		int col = rand() % MAX_COL;
		if (mineMap[row][col] == '1') {
    
    
			continue;
		}
		mineMap[row][col] = '1';
		count++;
	}
}
void printMap(char map[MAX_ROW][MAX_COL]) {
    
    
	for (int row = 0; row < MAX_ROW; row++) {
    
    
		for (int col = 0; col < MAX_ROW; col++) {
    
    
			printf("%c ", map[row][col]);
		}
		printf("\n");
	}
}

void updateMap(char showMap[MAX_ROW][MAX_COL],
	char mineMap[MAX_ROW][MAX_COL],int row, int col) {
    
    
	// count 表示翻开的位置的周围的地雷个数
	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) {
    
    
				// 坐标不合法 直接跳过
				continue;
			}
			if (r == row && c == col) {
    
    
				// 中间的位置不需要判断
				continue;
			}
			if (mineMap[r][c] == '1') {
    
    
				count++;
			}
		}
	}
	showMap[row][col] = '0' + count;
}
int main() {
    
    
	char showMap[MAX_ROW][MAX_COL] = {
    
     0 };
	char mineMap[MAX_ROW][MAX_COL] = {
    
     0 };
	init(showMap, mineMap);
	int openedCount = 0;
	while (1) {
    
    
		system("cls");
		printMap(showMap);
		// 打印地图
		int row = 0;
		int col = 0;
		// 让玩家输入地址来翻开
		printf("请输入一个坐标: (row col) \n");
		scanf("%d %d", &row, &col);
		// 判断玩家输入的坐标是否合法
		if (row<0 || row>MAX_ROW || col<0 || col>MAX_COL) {
    
    
			printf("您输入的坐标不合法,请重新输入!\n");
			continue;
		}
		if (showMap[row][col] != '*') {
    
    
			printf("您输入的位置已经翻开了! 请重新输入!\n");
			continue;
		}
		// 判断玩家是否踩雷
		if (mineMap[row][col] == '1') {
    
    
			printf("您踩雷了 game over\n");
			break;
		}
		// 更新地图
		updateMap(showMap, mineMap, row, col);
		openedCount++;
		if (openedCount == MAX_ROW * MAX_COL - MINE_COUNT) {
    
    
			printf("恭喜您终于获胜了!\n");
		}
	}
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_53804791/article/details/116201953