初阶扫雷游戏

在扫雷游戏中难度分为初阶,中阶和高阶,对于初阶扫雷,其为9*9的棋盘,其中有10个雷,若玩家踩到其中一个雷,即游戏失败。下面为用C语言编写初阶扫雷游戏的方法

1.文件存放代码

用三个文件存放代码,分别为SaoLei.c , SaoLei.h , SaoLeiHanShu.c,其中SaoLei.c存放该游戏的逻辑代码,即该游戏是如何运行的;SaoLei.h存放代码的头文件、函数声明和全局变量的定义;SaoLeiHanShu.c存放函数定义,即函数的主体部分。

2.游戏菜单的编写

用若干个printf函数打印游戏的菜单,函数如下(该函数无返回值):

void Menu()
{
	printf("------扫雷游戏----\n");
	printf("-------0.退出-----\n");
	printf("-------1.开始-----\n");
	printf("------------------\n");
}

3.游戏棋盘

1)棋盘的格式

由于该游戏在9*9的棋盘上进行,于是可能有人会想到用一个9行9列的二维数组存放棋盘的信息,可是在接下来的游戏中,要根据玩家输入的行和列对指定位置周围的8个位置进行遍历,来判断周围有几个雷,对于边界的位置(如9行7列),在遍历时会产生数组越界,导致运行错误,所以在设计棋盘时,应最好设计11*11的棋盘,将无雷的位置设置为‘0’(字符),有雷的位置设置成‘1’(字符),如下图所示:

 可是还有一个问题,玩家不能看到该棋盘,不然信息就泄露了,所以在设计棋盘时,设计两个棋盘,一个供我们自己调试(MeSee),另一个供玩家看(YouSee)

                          MeSee                                                      YouSee

所以,棋盘的初始化代码如下

void Init(char arr[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0, j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}
Init(MeSee, ROWS, COLS, '0');
Init(YouSee, ROWS, COLS, '*');

在函数头中的 arr[ROWS][COLS]代表需初始化的棋盘,set代表想要对二维数组赋的字符, rows 代表 ROWS , cols 代表 COLS ,下同;

2)变量的定义

在该代码中有两个基本变量,即行(ROW)、列(COL),同时还需要行+2(ROWS)、列+2(COLS),这四个变量为全局变量,定义合适如下

#define ROW 9
#define COL 9

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

需在头文件中定义,即 SaoLei.h

4.雷的布置

在9*9的棋盘中随机布置10个雷,需要用到rand函数,需包含头文件 <stdlib.h> ,要生成1-9范围内的随机数,应该使用 rand()%ROW+1 和 rand()%COL+1 ,为了保证每一次代码运行时雷的位置均不同,则要使用 srand 函数和 time 函数,需包含头文件 <time.h>,将雷的位置设为'1'(字符), 代码如下:

void SetLei(char arr[ROWS][COLS], int row, int col, char set)
{
	srand(time(NULL));
	int i = 0, j = 0;
	int count = 0;
	while (count != 10)
	{
		i = rand() % row + 1;   //在1-9之间
		j = rand() % col + 1;
		if (arr[i][j] != set)
		{
			arr[i][j] = set;
			count++;
		}
	}
}
SetLei(MeSee, ROW, COL, '1');

row 代表 ROW , col 代表 COL  ;

5.棋盘的打印

在打印棋盘时,有一部分与打印二维数组中的元素相同,但是为了方便玩家辨别行和列,我们需要打印出对应的行与列,代码如下:

void Print(char arr[ROWS][COLS], int row, int col)
{
	printf("-----扫雷游戏-----\n");
	int i = 0, j = 0;
	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 ", arr[i][j]);
		}
		printf("\n");
	}
}

6.正式游戏

玩家需输入行和列,在对输入的数据检查是否合法后,若该位置是雷,则提示“你被炸死了”,若不是,则遍历该位置周围的8个位置,并统计雷的个数,将个数转化为字符后替换 YouSee 数组中的对应位置,以提醒玩家周围有几个雷,当排查的位置个数为 ROW*COL-10时,代表所有的雷均未被踩到,提示“游戏胜利”,代码如下:

void PlayGame(char MeSee[ROWS][COLS], char YouSee[ROWS][COLS], int row, int col)
{
	int m = 0, n = 0;
	int count1 = 0;
	while (count1 != ROW * COL - 10)
	{
		printf("请输入行 列:");
		scanf("%d %d", &m, &n);
		while (m < 1 || m>9 || n < 1 || n>9)
		{
			printf("输入非法,重新输入\n");
			scanf("%d %d", &m, &n);
		}
		if (MeSee[m][n] == '1')
		{
			printf("你被炸死了\n");
			Print(MeSee, ROW, COL);
			break;
		}
		else
		{
			int count2 = SearchLei(m, n, MeSee, ROW, COL);
			YouSee[m][n] = count2 + '0';
			Print(YouSee, ROW, COL);

			count1++;
		}
	}
	if (count1 == ROW * COL - 10)
	{
		printf("游戏胜利\n");
	}
}
int SearchLei(int m, int n, char MeSee[ROWS][COLS], int row, int col)
{
	int i = 0, j = 0;
	int count = 0;
	for (i = m - 1; i <= m + 1; i++)
	{
		for (j = n - 1; j <= n + 1; j++)
		{
			if (MeSee[i][j] == '1')
			{
				count++;
			}
		}
	}
	return count;
}

 第二个代码为搜索周围有几个雷,将雷的个数传到第一个函数中;

7.

在 main 函数中,需使用一个循环和 switch 语句,代码如下:

int main()
{
	int choice = 0;
	Menu();
	char MeSee[ROWS][COLS] = { '0' };
	char YouSee[ROWS][COLS] = { '*' };
	do
	{
		printf("请选择:");
		scanf("%d", &choice);
		switch(choice)
		{
		case 1:
			Init(MeSee, ROWS, COLS, '0');
			Init(YouSee, ROWS, COLS, '*');
			SetLei(MeSee, ROW, COL, '1');
			Print(YouSee, ROW, COL);
			PlayGame(MeSee, YouSee, ROW, COL);
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,重新输入:\n");
		}
		
	} while (choice);


	return 0;
}

8.总结

以上即为初阶扫雷的代码,对于该游戏,还有许多可拓展的地方,如:如果排查位置不是雷,周围也没有雷,可以展开周围的一片、是否可以标记雷等,读者可以继续思考,完善代码。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值