扫雷游戏

扫雷游戏:如果翻开的不是雷,那么以翻开的这个数字x为中心,周围会有x个雷

扫雷游戏详解:

1.我们先定义两个二维数组,一个用来展示用户翻开的数字,即面向用户的界面show_map[][]

                                           一个用来布置雷阵,隐藏界面mine_map[][]

我们开始初始化这两个数组,并打印面向用户的界面数组show_map[][]

2.我们定义雷的个数,开始布置雷阵CreatMine();

3.我们提示用户输入坐标,如果坐标范围不合理,那么就提示用户输入错误,并且重新输入

    我们再来判断该坐标是否是雷所在坐标,如果是雷所在坐标,我们就直接打印雷阵,即隐藏的界面mine_map[][],并跳出游戏循环

                                                                   否则不是雷的个数就自增

    我们再来判断用户是否扫雷成功,如果(不是雷的个数==总的个数-雷的个数),那么用户就胜利,并打印出所有的雷阵,并跳出游戏循环

                                                       否则,我们就要给该坐标赋值,(该坐标的值是多少呢?我们需要判断该坐标的周围八个坐标中共有                                                                                                   几个雷,然后把此值赋值给该坐标)并打印出show_map[][]

4.  再次循环步骤3,

下面是游戏的分解代码

1.我们把show_map[][]初始化为'*',mine_map[][]初始化为字符为'0',并打印出show_map[][],这里我们用了memset()函数,包含在头文件string.h中,memset(pointer,value,size)

void Init()
{
	memset(mine_map, '0', (ROW + 2)*(COL + 2));
	memset(show_map, '*', (ROW + 2)*(COL + 2));
	Display(show_map);
}
Display(char map[ROW+2][COL+2])
{
	printf("  ");
	for (int row = 1; row <= ROW; row++)
	{
		printf(" %d", row);
	}
	printf("\n");
	for (int row = 1; row <= ROW; row++)
	{
		printf("---");
	}
	printf("\n");
//布置颜色的代码块,使得用户可观感增强
	for (int col = 1; col <= COL; col++)
	{
		if (g_color > 0)
		{
			if (g_color > 3)
			{
				system("color 0D");
			}
			else
			{
				system("color 0C");
			}
		}
		else
		{
			system("color 08");
		}
		printf("%02d|", col);
		for (int row = 1; row <= ROW; row++)
		{
			printf("%c ", map[col][row]);
		}
		printf("\n");
	}
}

2.布置雷阵 ,我们先设定好雷的个数,然后选取随机坐标,我们用到了rand(),srand()函数
,rand()%m,表示从0到m-1的值

void CreatMine()
{
	int mine_count = g_mine_count;
	srand(time(0));
	while (mine_count)
	{
		int row = rand() % 9 + 1;
		int col = rand() % 9 + 1;
		if (mine_map[row][col] == '0')
		{
			mine_map[row][col] = '1';
			mine_count--;
		}
	}
}

3.提示用户输入坐标,如果坐标范围不合理,重新输入 

                int row;
		int col;
		while (1)
		{
			printf("请输入坐标:");
			scanf("%d %d", &row, &col);
			if (row<0 || row>ROW || col<0 || col>COL)
			{
				printf("输入的坐标不合理,请重新输入\n");
				continue;
			}
			break;
		}

如果该坐标踩雷,打印雷阵,否则不是雷的个数自增

if (mine_map[row][col] == '1')
		{
			printf("游戏失败\n");
			Display(mine_map);
			g_color --;
			break;
		}
		else
		{
			not_mine_count++;
		}

如果游戏胜利,直接 打印所有的雷阵,否则给该坐标赋值

if (not_mine_count == ROW*COL - g_mine_count)
		{
			printf("游戏胜利\n");
			g_color++;
			Display(mine_map);
			break;
		}
		else
		{
			show_map[row][col] = (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 - 1][col + 1] - '0') + (mine_map[row + 1][col - 1] - '0')+
				(mine_map[row + 1][col] - '0') + (mine_map[row + 1][col + 1] - '0') + '0';
			Display(show_map);
		}
	

下面是游戏的源代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h> 
#include<stdlib.h>
#define ROW 9
#define COL 9
char mine_map[ROW + 2][COL + 2];
char show_map[ROW + 2][COL + 2];
int g_mine_count = 10;
int not_mine_count = 0;
int g_color = 4;
//扫雷
//界面
//定义两个二维数组,ShowMap[][],MineMap[][],
//ShowMap[][]是给用户展示的界面,MineMap[][]是布置雷阵的
//初始化两个数组,
//进行游戏
Display(char map[ROW+2][COL+2])
{//布置颜色
	printf("  ");
	for (int row = 1; row <= ROW; row++)
	{
		printf(" %d", row);
	}
	printf("\n");
	for (int row = 1; row <= ROW; row++)
	{
		printf("---");
	}
	printf("\n");
	for (int col = 1; col <= COL; col++)
	{
		if (g_color > 0)
		{
			if (g_color > 3)
			{
				system("color 0D");
			}
			else
			{
				system("color 0C");
			}
		}
		else
		{
			system("color 08");
		}
		printf("%02d|", col);
		for (int row = 1; row <= ROW; row++)
		{
			printf("%c ", map[col][row]);
		}
		printf("\n");
	}
}
void Init()
{
	memset(mine_map, '0', (ROW + 2)*(COL + 2));
	memset(show_map, '*', (ROW + 2)*(COL + 2));
	Display(show_map);
}
void CreatMine()
{
	int mine_count = g_mine_count;
	srand(time(0));
	while (mine_count)
	{
		int row = rand() % 9 + 1;
		int col = rand() % 9 + 1;
		if (mine_map[row][col] == '0')
		{
			mine_map[row][col] = '1';
			mine_count--;
		}
	}
}
void Game()
{
	//布置雷阵void Display(char map[ROW + 2][COL + 2])
	CreatMine();
	while (1)
	{
		int row;
		int col;
		while (1)
		{
			printf("请输入坐标:");
			scanf("%d %d", &row, &col);
			if (row<0 || row>ROW || col<0 || col>COL)
			{
				printf("输入的坐标不合理,请重新输入\n");
				continue;
			}
			break;
		}
		if (mine_map[row][col] == '1')
		{
			printf("游戏失败\n");
			Display(mine_map);
			g_color --;
			break;
		}
		else
		{
			not_mine_count++;
		}
		if (not_mine_count == ROW*COL - g_mine_count)
		{
			printf("游戏胜利\n");
			g_color++;
			Display(mine_map);
			break;
		}
		else
		{
			show_map[row][col] = (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 - 1][col + 1] - '0') + (mine_map[row + 1][col - 1] - '0')+
				(mine_map[row + 1][col] - '0') + (mine_map[row + 1][col + 1] - '0') + '0';
			Display(show_map);
		}
	}
}
//用户输入坐标
//坐标范围合理判定,不合理重新输入
//该坐标是否踩雷,踩雷,游戏失败,打印雷阵
//判断用户是否胜利,(如果用户翻开的个数等于总的个数减去雷的个数,那么用户胜利),如果用户胜利,则游戏胜利,打印雷阵
//如果用户并未胜利,那游戏继续,继续让用户输入坐标
//用户所输入坐标对应的数字是多少呢,这是由周围的雷的个数决定的
int menu()
{
	printf("************************\n");
	printf("1 开始游戏   0  退出游戏\n");
	printf("************************\n");
	printf("请输入选择:");
	int choice;
	scanf("%d", &choice);
	return choice;
}

int main()
{   
	system("color 0B");
	while (menu()==1)
	{
		Init();
		Game();
	}
	system("pause");
	return 0;
}

 

 

 

 

 

                                                       

              

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值