前言

  自从大家学习c言语过后,想必大部分都会触摸这类游戏代码。扫雷,五子棋,围棋等等。本文将经过C言语简略的完成一个简易的扫雷代码。

扫雷前史

  1992年,微软公司的罗伯特杜尔和卡特约翰逊两位工程师在Windows 3.1系统上加载了该游戏,扫雷游戏才正式在全世界推行开来. 扫雷的游戏规矩十分简略:方格内的数字代表其周围的八个方格中含有的地雷数.经过不断地点击新的方块来取得新的数字,然后逐渐推断出地雷的方位,并点开所有不是雷的安全方块即可.

代码思路

  假如咱们要编写一个扫雷程序,咱们首先就要赋予它外形。如图所见,它是一个9*9的网格,共81个方位。很简单就会想到而二维数组。所以编写一个二维数组成为它的外形; 所以咱们初始的主意便是 char arr_size=[9][9]; 其次是它的表现形式;

1.灰色的方块(代表不知道) 2.数字(周围八个方格存在的雷数)

3.空白(周围八个方格没有雷)

4.雷

最终是它的规矩: 方格内的数字代表其周围的八个方格中含有的地雷数.经过不断地点击新的方块来取得新的数字,然后逐渐推断出地雷的方位。(依据规矩能够得到,咱们的代码需求格子检测周围的八个方格是否存在雷,其次若是边界的格子,周围没有八个格子,咱们该如何让代码不报错的正常运转。)

依据规矩可知,咱们需求它能检测周围的八个方位是否有雷,但是周围假如没有格子的话,咱们就得给它创造格子。所以咱们的9 * 9格子将会改成11*11的格子。依据它的表现形式,可知。咱们需求将它能显现的四种都表示出来,就需求再来一个11宫格。

“扫雷”游戏的简单易懂的c代码

代码第一步:初始化11宫格

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//需求的头文件全丢在这儿
#define ROW 9        //9宫格
#define COL 9
#define ROWS ROW+2   //11宫格
#define COLS COL+2
#define EASY_COUNT 10
//初始化11宫格
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//显现9宫格
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//安置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//检测
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);
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;
		}
	}
}

  当咱们初始化11宫格之后,就要就将其展现出来。但咱们需求的只是九宫格,而不是十一宫格。所以咱们 下列for代码块就会和初始化的有所不同。

显现9宫格

void DisplayBoard(char board[ROWS][COLS], int row, int col);

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	printf("----------扫雷-------------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)//   咱们的i是<=row而不是<=rows
	{
	        printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
	printf("\n");
	}
	printf("----------扫雷-------------\n");
}

  上面这些做完再写下面的一个代码调用就能够轻松的完成了打印九宫格

void game()
{
	char sizein[ROWS][COLS] = { 0 };
	char sizeon[ROWS][COLS] = { 0 };
	InitBoard(sizein, ROWS, COLS,  '0');
	InitBoard(sizeon, ROWS, COLS, '*');
	DisplayBoard(sizeon, ROW, COL);
	DisplayBoard(sizein, ROW, COL); //这个是给咱们内部人看(雷)的哦,记得把这一段给删掉。
}

“扫雷”游戏的简单易懂的c代码

舞台现已安置完毕,接下来便是安置人物(雷)了。想要将雷随机的分布在这上面,就少不了随机值的经典代码串 srand((unsigned int)time(NULL)),该代码出现在主函数中,没有看到的不必着急,请看到最终。

安置雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand()%row+1;//随机数模上row(9),余数0-8
		int y = rand()%col+1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}		
}

  当咱们进行到这一步的时分,咱们就初步完成了雷的安置。随后咱们要面对的问题是找雷和检测周围雷的个数。

“扫雷”游戏的简单易懂的c代码
  依据上图能得到当咱们输入的坐标是(x,y)时,咱们周围的八个坐标都能够得到。如何核算雷的数量呢 依据ascll码咱们可知’0’ascll码=48;’1’ascll码=49;因而咱们只需将周围的八个字符加起来减去8*’0′ 就能够得到雷的个数,代码如下。

核算周围雷的数量

int GetMineCount(char mine[ROWS][COLS], int x,int y)
{
	return
		mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y + 1] +
		mine[x + 1][y + 1] +
		mine[x + 1][y] +
		mine[x + 1][y - 1] +
		mine[x][y - 1] - 8 * '0';
}

  随后咱们需求做的有:
1.玩家输入坐标检测是否有雷;
2.有雷游戏结束;
3.无雷检测周围的雷数并持续;
4.所有的方位排查完玩家成功。

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 (x >= 1 && x <= row &&y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标已被排查,请从头输入:\n");
			}
			else if (mine[x][y] == '1')
			{
				printf("该坐标有雷,game over\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{//没有雷,排查周围八个坐标
				int z = GetMineCount(mine, x, y);
				show[x][y] = z + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		if (win == row * col - EASY_COUNT)
		{
			printf("恭喜你通关了\n");
		}
	}
}

  以上就以game.c为主体进行的代码解说。

完好代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
//初始化11宫格
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
//显现9宫格
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//安置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//检测
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);

#define  _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include<stdio.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;
	int j = 0;
	printf("----------扫雷-------------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("----------扫雷-------------\n");
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
	int count = EASY_COUNT;
	while (count)
	{
		int x = rand()%row+1;//随机数模上row(9),余数0-8
		int y = rand()%col+1;
		if (mine[x][y] == '0')
		{
			mine[x][y] = '1';
			count--;
		}
	}		
}
int GetMineCount(char mine[ROWS][COLS], int x,int y)
{
	return
		mine[x - 1][y - 1] +
		mine[x - 1][y] +
		mine[x - 1][y + 1] +
		mine[x][y + 1] +
		mine[x + 1][y + 1] +
		mine[x + 1][y] +
		mine[x + 1][y - 1] +
		mine[x][y - 1] - 8 * '0';
}
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 (x >= 1 && x <= row &&y >= 1 && y <= col)
		{
			if (show[x][y] != '*')
			{
				printf("该坐标已被排查,请从头输入:\n");
			}
			else if (mine[x][y] == '1')
			{
				printf("该坐标有雷,game over\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{//没有雷,排查周围八个坐标
				int z = GetMineCount(mine, x, y);
				show[x][y] = z + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		if (win == row * col - EASY_COUNT)
		{
			printf("恭喜你通关了\n");
		}
	}
}
#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{
	printf("*************************\n");
	printf("********1.进入游戏*******\n");
	printf("********2.退出游戏*******\n");
	printf("*************************\n");
}
void game()
{
	char mine[ROWS][COLS] = {0};
	char show[ROWS][COLS] = {0};
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	DisplayBoard(show, ROW, COL);
	//安置雷
	SetMine(mine, ROW, COL);
	//检测
	FindMine(mine, show, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请输入\n:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 2:
			printf("即将退出\n");
			break;
		default:
			printf("输入错误,请从头输入\n");
			break;
		}
	} while (input);
	return 0;
}