扫雷游戏(简陋版)

首先创立三个文件存放代码。

test.c(游戏的整体逻辑),game.h(声明函数),game.c(函数的实现)。

打印菜单——>初始化棋盘——>布置雷——>打印菜单观察雷的布置情况——>输入坐标排查雷——>排查完毕,游戏结束 || 被炸死,再次选择是否开始游戏。

函数都是在 game.h 中声明,在 game.c 中实现。

用函数来实现是否开始游戏,而且每次游戏前打印出菜单,再进行是否开始游戏的判断

1.打印菜单

#include<stdio.h> 
void menu()
{
	printf("*********************\n");
	printf("****1. 开始游戏  ****\n");
	printf("****0. 游戏结束  ****\n");
	printf("*********************\n");
}
int main()
{
	menu();
	return 0;
}

每次游戏结束后再开始游戏,并再次的进行打印菜单,循环语句来实现(用 do.....while()语句较为合适),并且设置选项,来选择是否进入游戏,菜单在游戏开始前就打印。由于输入 1 开始游戏,输入 0 结束游戏,输入其他的重新选择,所以while()中的判断语句应选择输入的值较为合适。

在选择 1 的时候,就要开始游戏的实现了,所以创建一个game()函数,存放在case 1 中,来实现游戏。

2.初始化棋盘

在进行布置雷之前,我们先进行棋盘的初始化,用 InitBoard() 函数来初始化棋盘,再用 DisPlayBoard()函数来进行打印棋盘,观察是否初始化成功,初始化后再进行存放雷。我们用 ‘0’ 来进行棋盘的初始化。并且用 ‘*’ 来挡住棋盘布置的雷。排雷的过程中是以3*3为范围的,在布置时多加两行两列来使最外围的雷可在排查范围内。在 game.h 中用 define 来表示棋盘大小,以及所布置的雷的个数。

在 game.h 中声明函数,在 game.c 中实现函数,在 test.c 中写出函数

test.c中

void game()
{
	char arr1[hangs][lanns] = { 0 };
	char arr2[hangs][lanns] = { 0 };

	InitBoard(arr1, hangs, lanns, '0');//初始化棋盘
	InitBoard(arr2, hangs, lanns, '*');

	DisPlayBoard(arr1, hang, lann);//打印棋盘
	DisPlayBoard(arr2, hang, lann);
}

game.h中

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h> 
#define hang 9  //行
#define lann 9  //列 
#define hangs hang + 2
#define lanns lann + 2
#define counts 10

//声明函数,初始化棋盘
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set);

//打印棋盘,标明行列号
void DisPlayBoard(char arr[hangs][lanns], int h, int l);

game.c中

#include "game.h"
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set)
{
	int i, j;
	for (i = 0; i < hs; i++)
	{
		for (j = 0; j < ls; j++)
		{
			arr[i][j] = set;
		}
	}
}

void DisPlayBoard(char arr[hangs][lanns], int h, int l)
{
	int i, j;
	printf(" -----扫雷游戏-----\n");
	for (j = 0; j <= l; j++)
	{
		printf("%2d ", j);
	}
	printf("\n");
	for (i = 1; i <= h; i++)
	{
		printf("%2d ", i);
		for (j = 1; j <= l; j++)
		{
			printf("%2c ", arr[i][j]);
		}
		printf("\n");
	}
}

3.布置雷

对初始化的 ‘0’ 进行布置雷,当 ‘0’ 变成 ‘1’ 时,则表示该位置是雷,我们用 Setarr1()函数来进行布置雷。为了使所布置的雷随机,我们使用 srand((unsigned int)time(NULL))(使每次生成的随机数都不同)和 rand()(a+rand()%(b-a+1)可以生成一个a-b之间的随机数)来实现安排雷的坐标随机,再用到 rand()和 srand()时包含对应头文件 #include<time.h> 和 #include<stdlib.h> 。由于我们在小的棋盘布置雷,大的棋盘排雷,所以布置的雷范围是 lang 和 lann 的值。只有在布置成功时,count(雷的个数)才会减 1 ,直到布满十个雷。

test.c 中

void game()
{
	char arr1[hangs][lanns] = { 0 };
	char arr2[hangs][lanns] = { 0 };

	InitBoard(arr1,hangs,lanns,'0');//初始化棋盘
	InitBoard(arr2,hangs,lanns,'*');

	Setarr1(arr1,hang,lann);//布置雷,存放在arr1数组中
}

game.c 中

void Setarr1(char arr[hangs][lanns], int h, int l)
{
	int count = counts;
	while(count)
	{
		int x = rand() % h + 1;
		int y = rand() % l + 1;
		{
			if (arr[x][y] == '0')
			{
				arr[x][y] = '1';
				count--;
			}
		}
	}
}

game.h 中

#include<stdio.h> 
#include<time.h>
#include<stdlib.h>

#define hang 9  //行
#define lann 9  //列 
#define hangs hang + 2
#define lanns lann + 2
#define counts 10

//声明函数,初始化棋盘
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set);

//打印棋盘,标明行列号
void DisPlayBoard(char arr[hangs][lanns], int h, int l);
 
//布置雷
void Setarr1(char arr[hangs][lanns], int h, int l);

4.打印棋盘布置情况

用 DisPlayBoard()函数来进行打印棋盘,观察是否布雷成功。

5. 排查雷

使用 Findarr1()函数来进行雷的排查,由于需要多次输入,用 while()循环来实现,判断条件为排查完的坐标即 w < h * l - counts 时候,循环继续;当w <==h * l - counts 时,排查完毕,获得胜利。在函数中使用 GetArr1Count()函数来计算周围雷的个数。先在 Findarr1()函数中使用 if()语句判断输入的坐标是否合法,再判断该坐标是否为雷,若为雷,则跳出循环,若不是雷,则用 GetArr1Count()函数统计周围雷的个数。

Findarr1()函数和 GetArr1Count()函数

int GetArr1Count(char arr1[hangs][lanns],int x,int y)// 统计坐标周围雷的个数
{
	int count = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			count += (arr1[i][j] - '0');
		}
	}
	return count;
}


void Findarr1(char arr1[hangs][lanns], char arr2[hangs][lanns], int h, int l)
{
	int x = 0;
	int y = 0;
	int w = 0;
	while(w < h * l - counts)
	{
		printf("请输入排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= h && y >=1 && y<= l) //判断坐标的有效性 
		{
			if (arr1[x][y] == '1')//输入坐标是雷
			{
				printf("很遗憾,你被炸死了\n");
				DisPlayBoard(arr1, hang, lann);
				break;
			}
			else
			{
			int count =GetArr1Count(arr1,x,y);//该坐标不是雷,周围有几个雷。
			arr2[x][y] = count + '0';
			DisPlayBoard(arr2, hang, lann);// 每次排完显示棋盘
			w++;
			}
		}
		else
		{
			printf("坐标不合适,请重新输入\n");
		}
		
	}
	if (w == h * l - counts)
	{
		printf("恭喜你,排雷成功\n");
		DisPlayBoard(arr1, hang, lann);
	}
} 

最后整体代码如下:(所使用头文件包含于 game.h 中,game.c 和 test.c 引用 #include "game.h"即可使用头文件)

game.h 中

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h> 
#include<time.h>
#include<stdlib.h>

#define hang 9  //行
#define lann 9  //列 
#define hangs hang + 2
#define lanns lann + 2
#define counts 10

//声明函数,初始化棋盘
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set);

//打印棋盘,标明行列号
void DisPlayBoard(char arr[hangs][lanns], int h, int l);
 
//布置雷
void Setarr1(char arr[hangs][lanns], int h, int l);

//排查雷
void Findarr1(char arr1[hangs][lanns], char arr2[hangs][lanns], int h, int l);

game.c 中

#define  _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char arr[hangs][lanns], int hs, int ls, char set)
{
	int i,j;
	for (i = 0; i < hs; i++)
	{
		for (j = 0; j < ls; j++)
		{
			arr[i][j] = set;
		}
	}
}

void DisPlayBoard(char arr[hangs][lanns], int h, int l)
{
	int i,j;
	printf(" -----扫雷游戏-----\n");
	for (j = 0; j <= l; j++)
	{
		printf("%2d ", j);
	}
	printf("\n");
	for (i = 1; i <= h; i++)
	{
		printf("%2d ", i);
		for (j = 1; j <= l; j++)
		{
			printf("%2c ",arr[i][j]);
		}
		printf("\n");
	}
}

void Setarr1(char arr[hangs][lanns], int h, int l)
{
	int count = counts;
	while(count)
	{
		int x = rand() % h + 1;
		int y = rand() % l + 1;
		{
			if (arr[x][y] == '0')
			{
				arr[x][y] = '1';
				count--;
			}
		}
	}
}

int GetArr1Count(char arr1[hangs][lanns],int x,int y)// 统计坐标周围雷的个数
{
	int count = 0;
	for (int i = x - 1; i <= x + 1; i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			count += (arr1[i][j] - '0');
		}
	}
	return count;
}


void Findarr1(char arr1[hangs][lanns], char arr2[hangs][lanns], int h, int l)
{
	int x = 0;
	int y = 0;
	int w = 0;
	while(w < h * l - counts)
	{
		printf("请输入排查的坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= h && y >=1 && y<= l) //判断坐标的有效性 
		{
			if (arr1[x][y] == '1')//输入坐标是雷
			{
				printf("很遗憾,你被炸死了\n");
				DisPlayBoard(arr1, hang, lann);
				break;
			}
			else
			{
			int count =GetArr1Count(arr1,x,y);//该坐标不是雷,周围有几个雷。
			arr2[x][y] = count + '0';
			DisPlayBoard(arr2, hang, lann);// 每次排完显示棋盘
			w++;
			}
		}
		else
		{
			printf("坐标不合适,请重新输入\n");
		}
		
	}
	if (w == h * l - counts)
	{
		printf("恭喜你,排雷成功\n");
		DisPlayBoard(arr1, hang, lann);
	}
} 

test.c 中

#define  _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
	printf("*********************\n");
	printf("****1. 开始游戏  ****\n");
	printf("****0. 游戏结束  ****\n");
	printf("*********************\n");
}
void game()
{
	char arr1[hangs][lanns] = { 0 };
	char arr2[hangs][lanns] = { 0 };

	InitBoard(arr1,hangs,lanns,'0');//初始化棋盘
	InitBoard(arr2,hangs,lanns,'*');

	Setarr1(arr1,hang,lann);//布置雷,存放在arr1数组中

	DisPlayBoard(arr1, hang, lann);//打印棋盘
	DisPlayBoard(arr2, hang, lann);

	Findarr1(arr1,arr2,hang,lann);//排查雷

}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请输入一个数\n");
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();//实现扫雷游戏
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("选择错误,请从新选择\n");
			break;
		}
	} while(input);
	return 0;
}

运行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值