扫雷

#define _CRT_SECURE_NO_WARNINGS

#include “stdio.h”
#include “stdlib.h”
#include “time.h”

#define MAX_ROW 10
#define MAX_COL 10
#define MINE_COUNT 10
int blank_count;
void game_menu(){
/—随机种子—/
srand((unsigned)time(0));
/—开始菜单—/
printf("----------\n");
printf(“1.开始游戏\n”);
printf(“0.退出游戏\n”);
printf("----------\n");
}

/—显示地图和地雷地图的初始化—/
void map_init(char show_map[MAX_ROW + 2][MAX_COL + 2],
char mine_map[MAX_ROW + 2][MAX_COL + 2]){
/—显示地图的初始化—/
for (int i = 1; i <= MAX_ROW; i++){
for (int j = 1; j <= MAX_COL; j++){
show_map[i][j] = '’;
}
}
/
—地雷地图的初始化—/
for (int i = 0; i < MAX_ROW + 2; i++){
for (int j = 0; j < MAX_COL + 2; j++){
mine_map[i][j] = ‘0’;
}
}
/
—随机产生MINE_COUNT个雷,放入地雷地图中—/
int mine_count = 0;
while (mine_count < MINE_COUNT){
int row = 1 + rand() % (MAX_ROW - 1 + 1);
int col = 1 + rand() % (MAX_COL - 1 + 1);
if (mine_map[row][col] == ‘1’){
continue;
}
mine_map[row][col] = ‘1’;
mine_count++;
}
}
void map_display(char map[MAX_ROW + 2][MAX_COL + 2]){
/
—打印第一行,横坐标—/
printf(" “);
for (int i = 1; i <= MAX_ROW; i++){
printf(”%02d “, i);
}
printf(”\n");
/
—按行打印具体的地图—/
for (int i = 1; i <= MAX_ROW; i++){
/
—打印纵坐标—*/
printf("%02d|", i);
for (int j = 1; j <= MAX_COL; j++){

		printf("%-3c", map[i][j]);

	}

	printf("\n");

}

}
/—地图更新—/
void map_update(char show_map[MAX_ROW + 2][MAX_COL + 2],

char mine_map[MAX_ROW + 2][MAX_COL + 2],

int row, int col){
int mine_count = 0;

/*---统计(row, col)周围八格中的地雷总数---*/

mine_count = (mine_map[row - 1][col - 1] - '0')

	+ (mine_map[row - 1][col] - '0')

	+ (mine_map[row - 1][col + 1] - '0')

	+ (mine_map[row][col - 1] - '0')

	+ (mine_map[row][col + 1] - '0')

	+ (mine_map[row + 1][col - 1] - '0')

	+ (mine_map[row + 1][col] - '0')

	+ (mine_map[row + 1][col + 1] - '0');

show_map[row][col] = mine_count + '0';

blank_count++;

/*---(row, col)周围展开---*/

if (show_map[row][col] == '0'){

/*---当(row, col)为0时,遍历周围8个位置---*/
for (int i = row - 1; i <= row + 1; i++){

/*---横坐标越界判断---*/

if (i < 1 || i > MAX_ROW){

			continue;

		}

		for (int j = col - 1; j <= col + 1; j++){

			/*---纵坐标越界判断---*/

			if (j < 1 || j > MAX_COL){

				continue;

			}

			/*---跳过(row, col)位置---*/

			else if (i == row && j == col){

				continue;

			}

			else{

				/*---若该位置还未被翻开,则递归调用---*/

				if (show_map[i][j] == '*'){

					map_update(show_map, mine_map, i, j);

				}

			}

		}

	}

}

}

/—胜利判断—/

int win_check(char show_map[MAX_ROW + 2][MAX_COL + 2]){

int count = 0;

for (int i = 1; i <= MAX_ROW; i++){

	for (int j = 1; j <= MAX_COL; j++){

		if (show_map[i][j] == '*'){

			count++;

		}

	}

}

return count;

}

void game_run(){

int row = 0;

int col = 0;

char show_map[MAX_ROW + 2][MAX_COL + 2];

char mine_map[MAX_ROW + 2][MAX_COL + 2];

map_init(show_map, mine_map);

while (1){

	int input_check = 0;

	int win_flag = 0;

	map_display(show_map);

	/*---胜利检查---*/

	win_flag = win_check(show_map);

	if (win_flag == MINE_COUNT){

		printf("恭喜您扫雷成功!\n");

		map_display(mine_map);

		break;

	}
     printf("请输入坐标: \n");

	/*---清除输入缓冲区---*/

	fflush(stdin);

	input_check = scanf("%d %d", &row, &col);

	if (input_check != 2){

		printf("输入不合法,请重新输入! \n");

		continue;

	}

	if (row < 1 || row > MAX_ROW ||

		col < 1 || col > MAX_COL){

		printf("输入不合法,请重新输入! \n");

		continue;

	}

	if (mine_map[row][col] == '1'){

		printf("遗憾,您差一点就赢了!\n");

		map_display(mine_map);

		break;

	}

	map_update(show_map, mine_map, row, col);

}

}
int main(){
/—游戏开始标志—/
int game_start_flag = 0;

/*---游戏开始菜单打印---*/
game_menu();

/*---游戏运行---*/
while (1){
	/*---输入合法性的判断---*/
	int input_check = 0;
	printf("请输入命令: \n");
	/*---清除输入缓冲---*/
	fflush(stdin);
	input_check = scanf("%d", &game_start_flag);
	/*---输入不合法,重新输入---*/
	if (input_check != 1){
		printf("无效的命令,请重新输入!\n");
		continue;
	}
	/*---输入1游戏开始---*/
	else if (game_start_flag == 1){
		game_run();
		break;
	}
	/*---输入0游戏结束---*/
	else if (game_start_flag == 0){
		break;
	}
	/*---输入0和1以外的字符,无效---*/
	else{
		printf("无效的命令,请重新输入!\n");
		continue;
	}
}
system("pause");
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值