简易版扫雷游戏---C语言版

简易版扫雷游戏

  • 游戏要求逻辑
  • 扫雷游戏的解决逻辑
  • 游戏基本框架
  • 扫雷的初始化和打印棋盘
  • 布置雷
  • 排查雷
  • 游戏代码

游戏要求逻辑

输出效果图简易版扫雷游戏---C语言版_第1张图片
1.扫雷游戏要使游戏可以多次玩。
2.在9×9的格子里放10个雷
3.扫雷游戏选中坐标显示出坐标周围的雷数。
4.游戏排完全部非雷的位置游戏成功结束,若排查到雷游戏失败结束

扫雷游戏的解决逻辑

1.对于游戏可以多次玩就直接在主函数设置一个数字来决定玩了一局后是否继续
2.对于解决2,3要求之前,我们应该先完成扫雷棋盘的初始化,扫雷游戏9×9的位置中要放雷也要排查雷时没有雷的位置统计周围雷的个数显示在屏幕上以及未进行排雷显示在屏幕上的‘*’。

  • 设计两个数组一个存储雷,一个存储排显示在屏幕上排雷数据

3.生成在棋盘范围内的随机数以存储雷
4.设计排查雷的函数,游戏排完全部非雷的位置游戏成功结束,若排查到雷游戏失败结束

游戏基本框架

要有菜单而且可以重复玩,
选1开始游戏
选0退出游戏
选其他数字选择错误请重新选择

#include
void menu()
{
	printf("**************************************\n");
	printf("**********  1.play  0.exit  **********\n");
	printf("**************************************\n");
}
int main()
{
	int input = 0;//判断是否进行游戏
	do
	{
		menu();
		printf("请选择;>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:printf("开始游戏\n");//这里只是进行测试进行游戏时会设计game()函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

简易版扫雷游戏---C语言版_第2张图片
这是游戏的基本框架,接下来会把printf(“开始游戏\n”);替换成game()函数进行游戏设计

扫雷的初始化和打印棋盘

扫雷初始化应该初始化两个数组,一个存放雷的一个存放屏幕显示信息的。
在进行扫雷的时候,统计一个你排查坐标若没有雷时周边的雷个数,9×9区域中边上和内部无法用统一的方法进行统计,所以你把存放雷的数组周边加上一周没有雷的位置,放雷的时候也不放进去雷到加边的位置。
简易版扫雷游戏---C语言版_第3张图片
正如右上角黑色位置的排查,若该位置没有雷,就统计它周围8个位置的雷的信息,由于1 2 3 5 8位置都默认为没有雷那么排查雷的信息还是在棋盘内的,不会影响排查结果。所以存放雷的数组应该变为(9+2)×(9+2),存放显示字符的要与存放排雷的数组相对应所以也得设置(9+2)×(9+2)的。
为了使扫雷更通用定义宏来处理数组数据和布置雷数据
//布置雷区间行数和列数
#define ROW 9
#define COL 9
//数组的行数和列数
#define ROWS ROW+2
#define COLS COL+2
//布置雷的数量
#define EASY_COUNT 10

初始化的时候两个数组初始化的内容也不一样,所以应该设第四个参数接收初始化内容。

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("-------扫雷游戏-----\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

打印棋盘时注意行列标清楚。

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("-------扫雷游戏-----\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

布置雷

把雷随机布置到9×9区域内,

  • int x = rand() % row + 1;
  • int y = rand() % col + 1;

设置变量num为要布置雷数,布置雷数等于num就结束布置雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
	
	int num = EASY_COUNT;
	while (num > 0)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			num--;
		}
	}
}

排查雷

1.排查位置为雷直接炸死结束游戏
2.排查位置没雷统计该坐标周围雷数
3.排查坐标等于非雷坐标数游戏结束排雷成功

int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	int i = -1;
	int j = -1;
	int sum = 0;
	for (i = -1; i <= 1; i++)
	{
		for (j = -1; j <= 1; j++)
		{
			if (i != 0 || j != 0)
			{
				sum += mine[x + i][y + j]-'0';
			}
		}
	}
	return sum;
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < ROW * COL - EASY_COUNT)
	{
		printf("请输入你要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (show[x][y] == '*')
		{
			if (mine[x][y] == '0')
			{
				show[x][y] = get_mine_count(mine, x, y) + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
			else
			{
				printf("很遗憾你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("坐标选择错误请重新选择\n");
		}
	}
	if (win == ROW * COL - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
}

游戏代码

game.h

#include
#include
#include
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

#define EASY_COUNT 10

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);

void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

test.c

#include"game.h"

void menu()
{
	printf("**************************************\n");
	printf("**********  1.play  0.exit  **********\n");
	printf("**************************************\n");
}
void  game()
{
	char mineboard[ROWS][COLS];
	char showboard[ROWS][COLS];
	InitBoard(mineboard, ROWS, COLS, '0');
	InitBoard(showboard, ROWS, COLS, '*');
	DisplayBoard(showboard, ROW, COL);
	SetMine(mineboard, ROW, COL);
	FindMine(mineboard, showboard, ROW, COL);
}
>test.c
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do 
	{
		menu();
		printf("请选择;>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误请重新选择\n");
		}
	} while (input);
	return 0;
}

game.c

#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	printf("-------扫雷游戏-----\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
	
	int num = EASY_COUNT;
	while (num > 0)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			num--;
		}
	}
}
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
	int i = -1;
	int j = -1;
	int sum = 0;
	for (i = -1; i <= 1; i++)
	{
		for (j = -1; j <= 1; j++)
		{
			if (i != 0 || j != 0)
			{
				sum += mine[x + i][y + j]-'0';
			}
		}
	}
	return sum;
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < ROW * COL - EASY_COUNT)
	{
		printf("请输入你要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (show[x][y] == '*')
		{
			if (mine[x][y] == '0')
			{
				show[x][y] = get_mine_count(mine, x, y) + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
			else
			{
				printf("很遗憾你被炸死了\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
		}
		else
		{
			printf("坐标选择错误请重新选择\n");
		}
	}
	if (win == ROW * COL - EASY_COUNT)
	{
		printf("恭喜你,排雷成功\n");
	}
}

你可能感兴趣的:(c语言,游戏,c++)