C语言之扫雷游戏(多文件实现)

目录

前言

一.思维的建立

二.创建游戏菜单

三.初始化棋盘

四.打印棋盘

五.布置雷的个数和位置

六.排查雷

七.整体代码

game.h

text.c

game.c


前言

扫雷是一个十分经典的游戏,一张棋盘中有很多个不确定是雷还是安全区域的格子,当点击之后若没有雷则会在该区域显示周围八个格子雷的数目,若有雷则游戏结束。今天我就跟大家分享一下如何用c语言实现初阶版扫雷。是一个利用书写坐标所实现的扫雷游戏。

本扫雷游戏涉及:

       game.c   用于游戏的实现

       text.c   用于游戏的检测

       game.h   用于游戏的函数引用,库函数的引用(将库函数的引用都放于头文件之中,这样可以使得代码不至于过于臃肿)

一.思维的建立

1. 这里我们需要注意,扫雷游戏是一个需" 两成 "的游戏,一层是需要用于埋雷,一层用于玩家观看。所以,我们是需要两个二维函数。

2. 扫雷游戏是一个,需要提醒周围(四周8块地)是否有雷,于是就会出现一个问题,最外面的四周是是比较难的,所以,我们使用多一层外圈专门用来便于计算。

C语言之扫雷游戏(多文件实现)_第1张图片

C语言之扫雷游戏(多文件实现)_第2张图片

二.创建游戏菜单

void mune()
{
	printf("*****************************\n");
	printf("**********  1.play  *********\n");
	printf("*****************************\n");
	printf("**********  0.exit  *********\n");
	printf("*****************************\n");
}


void text()
{
	mune();
	int input = 0;
	printf("请输入一个数字->");
	srand((unsigned int)time(NULL));
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入->");
			break;
		}
	} while (input);
}

int main()
{
	text();

	return 0;
}

三.初始化棋盘

        通过将初始化内容传输入函数,这样可以使得函数的初始化只需用一个函数实现即可,更加高效。

	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };

	//初始化数组
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret);
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = ret;
		}
	}
}

四.打印棋盘

        注意:此处最好打印行列表示,以防行列过多不易数清。

//打印雷区
void printf_board(char arr[ROWS][COLS], int rows, int cols)
void printf_board(char arr[ROWS][COLS], int row, int col)
{
	int j = 0;
	int i = 0;
	printf("  ");
	for (j = 1; j <= col; j++)
	{
		printf("%d ", j);
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}
	printf("\n-------扫雷游戏-------\n");
}

C语言之扫雷游戏(多文件实现)_第3张图片

五.布置雷的个数和位置

//雷的数目
#define COUNT_MUNE 10
//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col, int count_mine);
//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col,int count_mine)
{
	int x = 0;
	int y = 0;
	int i = 0;
	//用于检测雷是否够数
	//int count = 0;
	for (i = 0; i < count_mine; i++)
	{
		a:
		x = rand() % row + 1;
		y = rand() % col + 1;
		if ('0' == mine[x][y])
		{
			mine[x][y] = '1';
			//count++;
		}
		else
		{
			goto a;
		}
	}
	//printf("%d", count);
}

六.排查雷

        此处需要注意的是,玩家看见的是未经增加最外圈的二维数组,所以,我们需要传输的是,ROW,COL。

//排查雷
void check(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
	//排查雷
	check(mine, show, ROW, COL);
//是否排雷完成
int mune_end(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 1; i <= row - 2; i++)
	{
		int j = 0;
		for (j = 1; j < col - 2; j++)
		{
			if ('0' == mine[i][j])
			{
				return 1;
			}
		}
	}
	return 0;
}


//附近雷的数目
int get_count_mine(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][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * '0';
}


//排查雷
void check(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	printf_board(show, ROW, COL);
	while (1)
	{
		printf("请输入坐标->");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if ('1' == mine[x][y])
			{
				printf("雷炸了,游戏结束!\n");
			}
			else
			{
				int count = get_count_mine(mine, x, y);
				show[x][y] = '0' + count;
				printf_board(show, ROW, COL);
			}
		}
		int end = mune_end(mine, row, col);
		if (0 == end)
		{
			printf("游戏结束,排雷完成\n");
			break;
		}
	}
}

七.整体代码

game.h

#pragma once

#include 
#include 
#include 

#define ROW 9//行
#define COL 9//列

//便于排雷时报数
#define ROWS ROW + 2
#define COLS COL + 2

//雷的数目
#define COUNT_MUNE 10

//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret);

//打印雷区
void printf_board(char arr[ROWS][COLS], int rows, int cols);


//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col, int count_mine);

//排查雷
void check(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

text.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void game()
{
	//用于埋雷
	char mine[ROWS][COLS] = { 0 };
	//用于排查雷
	char show[ROWS][COLS] = { 0 };

	//初始化数组
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS, COLS, '*');

	打印检测
	//printf_board(mine, ROW, COL);
	//printf("\n");
	//printf_board(show, ROW, COL);

	//布置雷
	set_mune(mine, ROW, COL, COUNT_MUNE);
	
	打印检测
	//printf_board(mine, ROW, COL);

	//排查雷
	check(mine, show, ROW, COL);
}

void mune()
{
	printf("*****************************\n");
	printf("**********  1.play  *********\n");
	printf("*****************************\n");
	printf("**********  0.exit  *********\n");
	printf("*****************************\n");
}


void text()
{
	mune();
	int input = 0;
	printf("请输入一个数字->");
	srand((unsigned int)time(NULL));
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入->");
			break;
		}
	} while (input);
}

int main()
{
	text();

	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = ret;
		}
	}
}

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

//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col,int count_mine)
{
	int x = 0;
	int y = 0;
	int i = 0;
	//用于检测雷是否够数
	//int count = 0;
	for (i = 0; i < count_mine; i++)
	{
		a:
		x = rand() % row + 1;
		y = rand() % col + 1;
		if ('0' == mine[x][y])
		{
			mine[x][y] = '1';
			//count++;
		}
		else
		{
			goto a;
		}
	}
	//printf("%d", count);
}

//是否排雷完成
int mune_end(char mine[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 1; i <= row - 2; i++)
	{
		int j = 0;
		for (j = 1; j < col - 2; j++)
		{
			if ('0' == mine[i][j])
			{
				return 1;
			}
		}
	}
	return 0;
}

//附近雷的数目
int get_count_mine(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][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * '0';
}

//排查雷
void check(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	printf_board(show, ROW, COL);
	while (1)
	{
		printf("请输入坐标->");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if ('1' == mine[x][y])
			{
				printf("雷炸了,游戏结束!\n");
			}
			else
			{
				int count = get_count_mine(mine, x, y);
				show[x][y] = '0' + count;
				printf_board(show, ROW, COL);
			}
		}
		int end = mune_end(mine, row, col);
		if (0 == end)
		{
			printf("游戏结束,排雷完成\n");
			break;
		}
	}
}

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