当前位置:   article > 正文

C语言之扫雷(递归、文件)_vb递归扫雷

vb递归扫雷

这是一个C语言版本的扫雷小游戏,自我感觉还比较完善,首先我们先来说一下扫雷的游戏思路
//1、打印菜单(1、 开始游戏 2 、退出游戏)
//2、开始游戏后,需要打印玩家地图
//3、初始地图为*表示,字符‘o’代表地雷
//4、玩家开始排雷(分四种情况:1、玩家踩雷,游戏结束 2、玩家没有踩雷,提示周围有多少颗雷 3、如果周围没有地雷,则递归找出该位置相应的没有地雷的位置 4、玩家排雷完成,游戏胜利)
//5、游戏结束,打印雷区分布图,显示玩家耗时,排名(这里用文件保存所用时间,按时间排名)
示例代码如下

//扫雷游戏思路
//1、打印菜单(1、 开始游戏 2 、退出游戏)
//2、开始游戏后,需要打印玩家地图
//3、初始地图为*表示,字符‘o’代表地雷
//4、玩家开始排雷(分三种情况:1、玩家踩雷,游戏结束 2、玩家没有踩雷,提示周围有多少颗雷 3、玩家排雷完成,游戏胜利)
//5、游戏结束,打印雷区分布图
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define MINE_COUNT 10

char player_map[ROW + 2][COL + 2]; //玩家地图
char mine_map[ROW + 2][COL + 2];   //雷区地图


//打印玩家扫雷地图
void print(char map[ROW+2][COL+2])
{
	printf("  ");
	for (int i = 1; i <= ROW; i++)
	{
		printf(" %d", i);
	}
	printf("\n");
	printf("   -----------------\n");
	for (int row = 1;  row<= ROW; row++)
	{
		printf("%d| ", row);
		printf("%c %c %c %c %c %c %c %c %c",map[row][1], map[row][2], map[row][3], map[row][4],
			map[row][5], map[row][6], map[row][7], map[row][8], map[row][9]);
		
		printf("\n");
	}
}


//玩家没有踩雷,判断该位置周围存在几颗雷
int  exist_mine(char mine_map[ROW + 2][COL + 2], char player_map[ROW + 2][COL + 2], int row, int col) {

	if (player_map[row][col] == '*') {
		int num = 0;
		for (int i = row - 1; i <= row + 1; i++)
		{
			for (int j = col - 1; j <= col + 1; j++)
			{
				if (mine_map[i][j] == 'o')
				{
					num++;
				}
			}
		}
		player_map[row][col] = num + '0';
		if (player_map[row][col] == '0'&&row >= 1 && row <= ROW && col >= 1 && col <= COL) {
			return (exist_mine(mine_map, player_map, row - 1, col) +
				exist_mine(mine_map, player_map, row - 1, col - 1) +
				exist_mine(mine_map, player_map, row - 1, col + 1) +
				exist_mine(mine_map, player_map, row, col - 1) +
				exist_mine(mine_map, player_map, row, col + 1) +
				exist_mine(mine_map, player_map, row + 1, col - 1) +
				exist_mine(mine_map, player_map, row + 1, col) +
				exist_mine(mine_map, player_map, row + 1, col + 1)) + 1;
		}
		else 
		{
			if (row >= 1 && row <= ROW && col >= 1 && col <= COL) 
			{
				return 1;
			}
			return 0;
		}
	}
	else {
		return 0;
	}
}

int check_mine(char mine_map[ROW + 2][COL + 2], int row, int col) {
	//判定是不是扫到了雷,如果是扫到了就直接退出游戏并且打印棋盘
	if (mine_map[row][col] == 'o') {
		print(mine_map);
		return 1;
	}
	//如果不是扫到了雷就统计周围雷的数量并且打印出现在的棋盘
	return 0;
}


//初始化(初始化玩家地图为“*”,初始化雷区分布)
void Init(char player_map[ROW + 2][COL + 2],char mine_map[ROW+2][COL+2])
{
	for (int row = 1; row <= ROW; row++)
	{
		for (int col = 1; col <= COL; col++)
		{
			player_map[row][col] = '*';
			mine_map[row][col] = '*';
		}
	}
	int count = MINE_COUNT;//count 为雷的个数
	while (count!=0)
	{
		int row = rand() % 9 + 1;
		int col = rand() % 9 + 1;
		if (mine_map[row][col] == '*')
		{
			mine_map[row][col] = 'o';
			count--;
		}
		else
		{
			continue;
		}

	}
}

//开始游戏,玩家开始扫雷
void Start_Game()
{
	int start_time = (unsigned)time(0);
	FILE * fp = fopen("time.txt", "r");
	int current_time;
	fscanf(fp, "%d", &current_time);
	fclose(fp);
	//printf("您扫雷用时:%d秒\n", current_time);
	int count = 0;
	while (1)
	{
		print(player_map);
		printf("\n");
		printf("请您输入您想要排雷的位置(x y):");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		if (row<1 || row>ROW || col<1 || col>COL)
		{
			printf("您的输入有误请重新输入:\n");
			continue;
		}
		if (player_map[row][col]!='*')
		{
			printf("该位置已经被翻开过,请重新输入:\n");
			continue;
		}
		if (check_mine(mine_map, row, col)) {
			printf("您踩到雷了,请重新开始\n");
			break;
		}
		else {
			//打印出不是雷的数字,用递归进行
			count += exist_mine(mine_map, player_map, row, col);

		}
		if (count == (ROW*COL - MINE_COUNT))
		{
			printf("恭喜您,扫雷成功!\n");
			print(mine_map);
			int end_time = (unsigned)time(0);
			int time = end_time - start_time;
			if (time < current_time)
			{
				printf("恭喜您,您打破了最高纪录,您扫雷用时间是%d秒\n", time);
				fp = fopen("time.txt", "w");
				fprintf(fp, "%d", time);
				fclose(fp);
				break;
			}
			printf("真遗憾!您所用时间是%d秒,未能打破纪录,再接再厉。\n", time);
			break;
		}
	}
}


//打印菜单选项
void menu()
{
	printf("**********************\n");
	printf("1、开始游戏\n");
	printf("2、退出游戏\n");
	printf("**********************\n");
}

int main()
{
	srand((unsigned)time(0));//产生一个随机种子
	while (1)
	{
		menu(); //打印菜单
		int choice = 0;
		scanf("%d", &choice);
		if (choice == 1)//选择开始游戏
		{
			printf("\n"); //为了好看
			Init(player_map, mine_map);//初始化地图
			Start_Game();//开始游戏,玩家输入坐标  
		}
		if (choice == 2)
		{
			printf("游戏结束!\n");
			break;
		}
	}
	system("pause");
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209

虽然看起来不是特别难,但当你实际去写的时候会发现各种各样的问题,在我实际去写代码时,其实普通的扫雷问题并不大,但对我来说要加上递归去实现没有雷的地方递归打印,这是一个比较难理解的地方,我也是花了好久才写正确,最后加入文件实现排名并不难,总体来说。这个扫雷小游戏还是挺有意思的,大家不妨可以试着玩下,看看你花了多长时间成功,悄悄地透漏一下,我扫雷花了不到一分钟,哈哈 , 欢迎来战! 运行结果如下图,部分截取。
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/748828
推荐阅读
相关标签
  

闽ICP备14008679号