四.如何用C语言完成最简单的扫雷?

前言:当我们学习了循环、数组和函数以后,我们就可以做一个简易版的扫雷游戏(控制台扫雷)

1.扫雷游戏的制作思路和设计

游戏思路

相信大家对扫雷都有所了解,现在我来讲一下

1.实现游戏菜单:继续玩或者退出游戏

2.棋盘9*9

3.默认10个雷,并随机分布

4.如果这个位置不是雷,就显示周围有几个雷

5.如果位置是雷,炸死,游戏结束

6.如果正确锁定10个雷,并把所有位置排完,排雷成功,游戏结束

游戏界面

游戏结构

我们需要布置雷、排查雷等,这些信息需要储存,既然是9*9的棋盘,那么我们首先想到的就是用9*9的数组来存放这些信息

如果这个位置布置雷,我们就存放1,没有布置雷就存放0

假设我们要排查(3,3)这个坐标时,我们要统计周围一圈八个黄色位置

但是如果我们排查(8,3)这个位置时,我们会发现,没有足够的八个数组元素让我们排查,所有我们要给数组扩大一圈,这一圈不布置雷就行

我们再继续分析,我们一个有两个信息,一个是雷的信息,一个是非雷的信息,当我们排查完雷的时候我们要存储信息,但是对于我们雷的个数也是一个信息,那么为了不混淆它们的信息,我们可以这样:

  我们先设置好一个棋盘,这个棋盘可以是任何统一的符号比如

(图1)

我们再设置一个棋盘

(图2)

我们在图1选择坐标后,把坐标传给图2,同时存放数据,这样我们就不容易混淆代码了

同时,为了不显示出雷,我们让图1作为初始化棋盘

2.扫雷游戏的代码实现

对于扫雷游戏,代码的实现不算特别简单,由此根据我们之前函数所学内容,我们可以分为多个文件,实现函数声明、定义、以及代码运行

 test.c  :  游戏代码的运行

game.c  :游戏代码函数的实现

game.h  :  游戏函数声明

下面,我将解释如何操作

制作菜单(test.c)


#include "game.h"

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

​

对菜单操作(test.c)

#include <stdio.h>
#include "game.h"

void menu()
{
	printf("***********************\n");
	printf("****    1. play    ****\n");
	printf("****    0. exit    ****\n");
	printf("***********************\n");
}
int main()
{
	int input = 0;
	do {

		menu();//执行“void menu”
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}//break跳出switch语句
	} while (input);

	return 0;
}

do while语句 和 switch语句是最经典的菜单语句,希望大家可以熟练运用

运行结果(test.c)

创造游戏部分(test.c)

#include <stdio.h>
#include "game.h"

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

void game()//游戏部分!!!!!!!!!!!!!!!!!!!!!!!!
{

}

int main()
{
	int input = 0;
	do {

		menu();//执行“void menu”
		printf("请输入:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//注意这里的变化!!!!!!!!!!!!!!!!!!!!!
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}//break跳出switch语句
	} while (input);

	return 0;
}

定义行列数(game.h)

 ROW COL     →9行 

 ROWS COLS  →11行

引进两个数组(test.c)

char mine[ROW][COL] (布置雷)    char show[ROW][COL] (初始化*)

初始化棋盘 initboard (test.c)

声明函数 initboard (game.h)

定义函数 initboard (game.c)

打印*棋盘displayboard(test.c)

展现出来的是 9*9 的棋盘(ROE COL)

声明函数displayboard

定义函数displayboard(game.c)

打印效果(test.c)

为辅助玩家,加上坐标号(game.c)

布置雷函数 setmine (test.c)

声明函数 setmine (game.h)

定义函数setmine(game.c)

生成随机数(test.c)

声明主要函数(game.h)

排查雷函数findmine(test.c)

声明函数findmine(game.h)

mine中排查,把信息放到show里面

定义函数findmine(game.c)

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 - EASYCOUNT)//简单难度十个雷,再此不特别强调
	{
		printf("请输入要排查的坐标:>\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y]=='1')
			{
				printf("很遗憾,你被炸死了\n");
				displayboard(show, ROW, COL);
				break;
			}
			else
			{
				//如果该位置不是雷,扫描这个位周围有几个雷
				int count = getminecount(mine, x, y);
				show[x][y] = count + '0';
				displayboard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}


}

那么代码写到这也差不多了,但是这只是扫雷的简单版本,也不是唯一版本

扫雷拓展

游戏还可以继续设计

——简单(10颗雷),中等(40颗雷),困难(99颗雷)

——如果排查处不是雷,可以展开周围一片

——时间

——标记雷

等等

总结:游戏玩法千千万,这是需要动脑筋的,但不管怎样,希望这篇博客对你有帮助

作者留言:制作不易,本人是初学者,如有错误或不恰当的地方,欢迎大家指出!😊

            创作时间:2023.11.29

  

 

扫雷是一款非常经典的小游戏,它最早是在Windows系统中自带的游戏之一,也是很多人在电脑上消磨时间的首选游戏之一。下面是一个简单C语言实现的扫雷游戏的例子。 实现思路: 1. 定义一个二维数组存储地图信息(数字代表周围雷数,'X'代表地雷) 2. 随机生成若干个地雷坐标并将地雷位置存入地图数组 3. 循环读入玩家输入的坐标,如果输入的坐标为地雷,则游戏结束,否则显示周围雷数并继续游戏 4. 判断游戏是否胜利,若胜利则结束游戏 下面是简单的代码实现,仅供参考: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define MINE_NUM 10 void InitMap(char map[][COL], int row, int col) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { map[i][j] = '0'; } } } void PrintMap(char map[][COL], int row, int col) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { printf("%c ", map[i][j]); } printf("\n"); } } void SetMine(char map[][COL], int row, int col) { int i, j, k; int x, y; srand(time(NULL)); for (k = 0; k < MINE_NUM; k++) { do { x = rand() % row; y = rand() % col; } while (map[x][y] == 'X'); map[x][y] = 'X'; } } int GetMineCount(char map[][COL], int x, int y) { int count = 0; int i, j; for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i >= 0 && i < ROW && j >= 0 && j < COL && map[i][j] == 'X') { count++; } } } return count; } void ExpandMap(char mine[][COL], char show[][COL], int x, int y) { if (x < 0 || x >= ROW || y < 0 || y >= COL) { return; } if (show[x][y] != '0') { return; } show[x][y] = mine[x][y]; if (mine[x][y] == 'X') { return; } int count = GetMineCount(mine, x, y); if (count > 0) { show[x][y] = count + '0'; return; } ExpandMap(mine, show, x - 1, y - 1); ExpandMap(mine, show, x - 1, y); ExpandMap(mine, show, x - 1, y + 1); ExpandMap(mine, show, x, y - 1); ExpandMap(mine, show, x, y + 1); ExpandMap(mine, show, x + 1, y - 1); ExpandMap(mine, show, x + 1, y); ExpandMap(mine, show, x + 1, y + 1); } int IsWin(char mine[][COL], char show[][COL]) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (mine[i][j] == 'X' && show[i][j] != 'X') { return 0; } if (mine[i][j] != 'X' && show[i][j] == '0') { return 0; } } } return 1; } void PlayGame(char mine[][COL], char show[][COL]) { int x, y; while (1) { printf("Please input coordinate(x,y): "); scanf("%d%d", &x, &y); if (mine[x][y] == 'X') { printf("Game Over!\n"); break; } ExpandMap(mine, show, x, y); PrintMap(show, ROW, COL); if (IsWin(mine, show)) { printf("You Win!\n"); break; } } } int main() { char mine[ROW][COL]; char show[ROW][COL]; InitMap(mine, ROW, COL); InitMap(show, ROW, COL); SetMine(mine, ROW, COL); PrintMap(mine, ROW, COL); PlayGame(mine, show); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值