C语言编写扫雷小游戏

本文详细介绍了使用C语言编写的扫雷小游戏,包括游戏规则、数据结构设计、关键代码片段、随机布雷、雷数计算和用户交互。作者通过实际编码展示了如何实现这款游戏,旨在提升C语言技能和提供休闲娱乐体验。
摘要由CSDN通过智能技术生成

C语言编写扫雷小游戏

1. 引言

学完C语言不久,为加深C语言知识,所以编写了扫雷,这是一个很老并且很经典的小游戏,小时后经常玩,现在学习了C语言,会发现很容易实现它。

  • 简述扫雷游戏的玩法和目的

我写的扫雷游戏是一个在9乘9的方格棋盘中,通过输入坐标,排除不是雷的方格的一个小游戏。

2. 项目概述

  • 描述扫雷游戏的功能和规则
    游戏界面是一个方格状的雷区,每个方格内可能隐藏有雷或者没有雷。
    玩家通过输入方格坐标来进行游戏,如果该方格是有雷的方格则游戏结束,如果是没有雷的方格则显示该方格周围的雷的数量。
    直到没有雷的方格全部排除了,则游戏通关。

  • 讨论设计游戏的初衷和目标用户
    设计扫雷游戏的初衷是为了提供一款简单而有趣的休闲娱乐游戏,适合各个年龄段的用户。它可以锻炼玩家的逻辑思维能力和手眼协调能力,同时也可以帮助用户放松心情、缓解压力。但是我的这个可能会越玩越不好,没耐心的人是玩不下去的。

  • 说明选择C语言开发的原因
    目前我学会了c语言,为了锻炼敲代码的能力,所以我需要用C语言编写程序。

3. 游戏设计

游戏设计:

  1. 数据结构设计:

    • 棋盘使用二维字符数组表示,其中bomb数组用于存储地雷的位置,show数组用于显示玩家看到的棋盘。
    • ROWSCOLS分别表示棋盘的行数和列数,可以根据实际需求进行调整。
  2. 算法逻辑设计:

    • 初始化棋盘:通过调用InitBoard函数,将bombshow数组中的元素全部初始化为0或’*’。
    • 布雷:通过调用SetBomb函数,在bomb数组中随机设置地雷的位置。
    • 排雷:通过调用EliBomb函数,根据玩家的选择判断是否踩到地雷,并更新show数组中的显示内容。

关键代码片段解释:

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

这段代码定义了一个菜单函数menu,用于显示游戏的选项。通过打印不同的提示信息,玩家可以选择开始游戏或退出游戏。

void game()
{
    char bomb[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    // ...
    DisplayBoard(show, ROW, COL);
    // ...
    EliBomb(bomb,show, ROW, COL);
}

这段代码定义了游戏的主要逻辑。首先,通过初始化两个二维数组bombshow来创建棋盘。然后,通过调用DisplayBoard函数显示玩家看到的棋盘。接下来,通过调用EliBomb函数进行排雷操作。

界面设计和用户体验方面的考量

  • 界面设计简洁明了,通过菜单提示用户可以选择开始游戏或退出游戏。
  • 用户体验方面,游戏提供了直观的提示信息,让玩家能够清楚地了解当前的游戏状态和可执行的操作。同时,通过合理的布局和颜色搭配,增加了游戏的可玩性和吸引力。

5. 编码实现

初始化棋盘:通过调用InitBoard函数,将bombshow数组中的元素全部初始化为0或’*’。

//初始化布雷的棋盘,有雷表示1,无雷表示0,初始化全为0
//初始化展示出的棋盘
void InitBoard(char bomb[ROWS][COLS], int rows, int cols, int set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			bomb[i][j] = set;
		}
	}
}

打印棋盘:打印出当前棋盘的状态,包括已经揭示的位置和未揭示的位置。

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	//打印列号
	printf("---------扫雷---------\n");
	for (i = 0; i <= col; i++)
	{
		printf("%d ", i);
	}
	printf("\n");

	for (i = 0; i <= col; i++)
	{
		printf("--");
	}
	printf("\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d|", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("---------扫雷---------\n");

}

布置雷:在棋盘上随机布置一定数量的雷。

//布置雷
void SetBomb(char board[ROWS][COLS], int row, int col)
{
	
	
	int count = 10;//雷数
	while (count)
	{	
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;

		}
			
		
	}
}

计算周围雷的数量:给定一个位置,计算该位置周围的8个位置中雷的数量。

void GetBombCount(char bomb[ROWS][COLS], int x, int y)
{
	return bomb[x - 1][y - 1] + bomb[x][y - 1] + bomb[x + 1][y - 1]
		+ bomb[x + 1][y] + bomb[x + 1][y + 1] + bomb[x][y + 1]
		+ bomb[x - 1][y + 1] + bomb[x - 1][y] - 8 * '0';
}

排雷游戏:玩家输入一个位置,如果该位置有雷,则游戏结束;否则,揭示该位置并显示周围雷的数量。

//排雷
void EliBomb(char bomb[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<row*col-10)
	{
		printf("请输入排查坐标:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (bomb[x][y] == '1')
			{
				printf("很遗憾,你被炸死了\n");
				DisplayBoard(bomb, ROW, COL);
				break;
			}
			else
			{
				//统计周围有几个雷
				int c = GetBombCount(bomb, x, y);
				show[x][y] = c + '0';
				DisplayBoard(show, ROW, COL);
				win++;
			}
			
		}
		else
		{
			printf("输入非法,请重新输入");
		}
	}
	if (win == row * col - 10)
	{
		printf("恭喜你,通关了");
		DisplayBoard(bomb, ROW, COL);

	}
	
}

遇到的挑战和问题以及解决方案:

如何随机布置雷
解决方案:使用rand()函数生成随机数,根据随机数确定雷的位置。

如何计算周围雷的数量?
解决方案:遍历周围8个位置,统计雷的数量。

6. 测试与调试

  • 描述测试策略和调试过程
    在编写代码过程中,每完成一个功能模块我都会去进行测试,以确保代码功能正常。不至于在完成最终编写后有一堆错误,这样很影响效率。
  • 遇到的问题和bug,以及如何解决它们
  • 在功能测试中如果出现错误提示,则根据错误提示修改,如果没有出错提示,运行结果没有到效果,则是逻辑出错。我就会进行逐过程调试去找出问题所在。

7. 结语

这个小游戏我编写了几个小时,主见我对知识的不熟练。
最后加油吧。

8. 附录(可选)

代码见gitee上的开源:
https://gitee.com/Senior-l/bit111/commit/f802a702d35215db75bc1ca741a6fc27b3165788

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值