C语言实现扫雷游戏

       话不多说直接上代码

头文件:

C语言实现扫雷游戏_第1张图片

头文件游戏配置:

#ifndef __CONFIG_H__
#define __CONFIG_H__

#include
#include
#include

#define Wide		9
#define Length		9
#define Count_Mine  10

#include"Game.h"

void Game_Start();


#endif

头文件游戏内容:

#ifndef __GAME_H__
#define __GAME_H__

#include"Config.h"

void Game();
void Init_Board(char Board[Wide][Length], int wide, int length, char Set);
void Dis_Board(char Board[Wide][Length], int wide, int length);
void Creat_Mine(char Board[Wide][Length], int wide, int length);
void Find_Mine(char Mine[Wide][Length], char Show[Wide][Length], int wide, int length);

#endif

主函数:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Config.h"

int main()
{
	Game_Start();//启动游戏
	return 0;
}

 游戏初始化:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Config.h"


void menu()
{
	printf("###########################\n");
	printf("#####1.Play     0.Exit#####\n");
	printf("###########################\n");
}

void Game_Start()
{
	int Choice = 0;
	do
	{
		menu();
		printf("请选择是否游玩扫雷:");
		scanf("%d", &Choice);
		switch (Choice)
		{
		case 1:
			printf("游戏开始\n");
			Game();
			break;
		case 0:
			printf("结束游戏\n");
			break;
		default:
			printf("输入错误请重新输入:\n");
			break;
		}
	} while (Choice);
}

//初始化棋盘内容
void Init_Board(char Board[Wide][Length], int wide, int length, char Set)
{
	int i = 0;

	for (i = 0; i < wide; i++)
	{
		int j = 0;
		for (j = 0; j < length; j++)
		{
			Board[i][j] = Set;
		}
	}
}

//显示棋盘外观和地雷区域
void Dis_Board(char Board[Wide][Length], int wide, int length)
{
	int i = 0;

	for (i = 0; i < wide + 1; i++)		//+1为显示出最下面的一行
	{
		int j = 0;
		for (j = 0; j < length; j++)	//显示行
		{
			printf(" ---");
		}
		printf("\n");					//换行
		if (i < wide)					//跳出与行循环次数相同
		{
			for (j = 0; j < length; j++)
			{
				if (j == 0)
				{
					printf("|");
				}
				printf(" %c |", Board[i][j]);
			}
			printf("\n");
		}
	}
}

//生成雷
void Creat_Mine(char Board[Wide][Length], int wide, int length)
{
	int count = Count_Mine;
	int x = 0, y = 0;		//地雷坐标
	//创建Count_Mine个地雷
	while (count)
	{
		x = rand() % Wide;
		y = rand() % Length;
		Board[x][y] = '1';
		count--;
	}
}

//判断选择的数的周围有多少雷
static int Get_Mine_Count(char Mine[Wide][Length], int x, int y)
{
	//四个角落
	if (x == 1 && y == 1)
	{
		return Mine[x - 1][y] + Mine[x][y] + Mine[x][y - 1] - 3 * '0';
	}
	if (x == 1 && y == Length)
	{
		return Mine[x - 1][y - 2] + Mine[x][y - 1] + Mine[x][y - 2] - 3 * '0';
	}
	if (x == Wide&&y == 1)
	{
		return Mine[x - 2][y - 1] + Mine[x - 2][y] + Mine[x - 1][y] - 3 * '0';
	}
	if (x == Wide&&y == Length)
	{
		return Mine[x - 1][y - 2] + Mine[x - 2][y - 2] + Mine[x - 2][y - 1] - 3 * '0';
	}
	//四周
	if (x == 1 && (y != 1) && (y != Length))
	{
		return Mine[x - 1][y - 2] + Mine[x - 1][y] + Mine[x][y] + Mine[x][y - 1] + Mine[x][y - 2] - 5 * '0';
	}
	if (x == Wide && (y != 1) && (y != Length))
	{
		return Mine[x - 2][y - 2] + Mine[x - 2][y - 1] + Mine[x - 2][y] + Mine[x - 1][y - 2] + Mine[x - 1][y] - 5 * '0';
	}
	if (y == 1 && (x != 1) && (x != Wide))
	{
		return Mine[x - 2][y - 1] + Mine[x - 2][y] + Mine[x - 1][y] + Mine[x][y] + Mine[x][y - 1] - 5 * '0';
	}
	if (y == Length && (x != 1) && (x != Wide))
	{
		return Mine[x - 2][y - 1] + Mine[x - 2][y - 2] + Mine[x - 1][y - 2] + Mine[x - 1][y - 2] + Mine[x][y - 1] - 5 * '0';
	}
	//中间
	else
	{
		return Mine[x - 2][y - 2] +
			Mine[x - 2][y - 1] +
			Mine[x - 2][y] +
			Mine[x - 1][y - 2] +
			Mine[x - 1][y] +
			Mine[x][y - 2] +
			Mine[x][y - 1] +
			Mine[x][y] - 8 * '0';
	}
}

//寻雷
void Find_Mine(char Mine[Wide][Length], char Show[Wide][Length], int wide, int length)
{
	int x = 0;
	int y = 0;
	int Win = 0;
	while (Win <= (wide*length) - Count_Mine)//一共的查找次数
	{
		printf("请输入查询坐标:");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= wide&&y >= 1 && y <= length)
		{
			if (Mine[x-1][y-1] != '1')
			{
				int Mine_count = Get_Mine_Count(Mine,x,y);
				Show[x - 1][y - 1] = Mine_count + '0';
				Dis_Board(Show, wide, length);
				Win++;
			}
			else
			{
				Dis_Board(Mine, Wide, Length);
				printf("\n踩雷了,游戏结束\n\n");
				break;
			}
		}
		else
			printf("输入错误\n");
	}
}

游戏内容函数调用:

#define _CRT_SECURE_NO_WARNINGS 1

#include"Config.h"

//游戏
void Game()
{
	srand((unsigned int)time(NULL));
	char Mine[Wide][Length] = { 0 };		//存放地雷
	char Show[Wide][Length] = { 0 };		//显示区域
	//初始化棋盘内容
	Init_Board(Show, Wide, Length, '*');
	//初始化地雷
	Init_Board(Mine, Wide, Length, '0');
	//显示棋盘
	Dis_Board(Show, Wide, Length);
	//生成地雷
	Creat_Mine(Mine, Wide, Length);
	//寻雷
	Find_Mine(Mine, Show, Wide, Length);

}

  讲解:

        该游戏的实现有注意的点,安置雷和不是雷的区域需要分为两个数组存放,在没有选择某个坐标的时候,以显示数组来操作,选择之后,将含雷数组的数据替换。然后别将代码写死,在宏定义中定义整个地图的大小,用与之后扩展。其余的所有功能代码中都有注释介绍,我就不多做赘述了。

 注:

        本代码与本人结合自己与他人的思想构成,整个代码还有很多可以优化的地方,但是本人还是新手,有很多功能不是很熟练,望见谅。该代码有一定的参考意义,想玩可以上去。

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