前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言实现小游戏之扫雷

C语言实现小游戏之扫雷

作者头像
摘星
发布2023-04-28 09:35:20
4500
发布2023-04-28 09:35:20
举报
文章被收录于专栏:C/C++学习

前言

相信大家都曾玩过一个经典的小游戏——扫雷,在学习了C语言有关于数组、循环语句、选择语句等知识后,我决定用C语言实现一个简易版的扫雷游戏,接下来我将在本篇文章中向大家介绍我的思路以及具体的实现过程。

一、主要实现功能

1.可控制棋盘的大小和雷的数量;

2.判断输入的坐标是否正确;

3.可以在棋盘中随机放置雷;

4.显示非雷坐标周围雷的个数;

5.展开功能(若所排查坐标周围没有雷,则展开一片,直到遇到雷或者棋盘边界等条件)

6.判断游戏的输赢

二、程序流程(思路)

玩家输入坐标,系统判断是否为雷:

如果是雷,则玩家被炸死,游戏结束;

如果不是雷,又分为两种情况:

该位置周围有雷,则显示周围雷的数量;

该位置周围没有雷,则展开一片。

如果所有非雷位置被玩家全部找到,则玩家胜利,游戏结束。

主程序流程

4a2bdcdae0954e9a8a030c510f080b06.png
4a2bdcdae0954e9a8a030c510f080b06.png

游戏部分流程

5e5fcab5d7f44e2598619c2b2209e98f.png
5e5fcab5d7f44e2598619c2b2209e98f.png

三、源代码及运行截图

为了方便大家的学习和交流,我将这个小游戏的源代码放置在下方,同时还有我的运行截图。

源代码

 初始化棋盘

代码语言:javascript
复制
//初始化布置雷的棋盘和展示给玩家的棋盘

void init_mine()
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			real_mine[i][j] = '0';
		}
	}
	for (i = 0; i < ROW - 2; i++)
	{
		for (j = 0; j < COL - 2; j++)
		{
			show_mine[i][j] = '*';
		}
	}

放置雷

代码语言:javascript
复制
//放置雷

void set_mine()
{
	int row = 0;
	int col = 0;
	int mine = MINE;
	while (mine--)
	{
		row = (rand() % (ROW - 2)+1);//产生随机的行数
		col = (rand() % (COL - 2)+1);//产生随机的列数
		if (real_mine[row][col] != '1')
		{
			real_mine[row][col] = '1';
		}
		else
		{
			mine++;
		}
	}
}

打印放置雷的棋盘

代码语言:javascript
复制
//打印放置雷的棋盘

void print_mine() 
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			printf("%c ", real_mine[i][j]);
		}
		printf("\n");
	}
}

打印展示给玩家的棋盘

代码语言:javascript
复制
//打印展示给玩家的棋盘

void print_show()
{
	int i = 0;
	int j = 0;
	printf("%2d ",0);
	for (j = 0; j < COL - 2; j++)
	{
		printf("%d ", j+1);
	}
	printf("\n");
	for (i = 0; i < ROW - 2; i++)
	{
		printf("%2d ", i+1);
		for (j = 0; j < COL - 2; j++)
		{
			printf("%c ", show_mine[i][j]);
		}
		printf("\n");
	}
}

 统计周围雷的个数

代码语言:javascript
复制
//统计周围雷的个数

int count_mine(int n,int m)
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = n - 1; i <= n + 1; i++)
	{
		for (j = m - 1; j <= m + 1; j++)
		{
			if (real_mine[i][j] == '1')
			{
				count++;
			}
		}
	}
	return count;
}

判断输入的坐标是否已经被查询过

代码语言:javascript
复制
//判断输入的坐标是否已经被查询过

int has_queried(int n, int m)
{
	if (show_mine[n - 1][m - 1] != '*')
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

 展开一片(展开该坐标周围的坐标,一直到限制条件)

代码语言:javascript
复制
//展开一片(展开该坐标周围的坐标,一直到限制条件)

void open_mine(int n, int m)
{
	int i = 0;
	int j = 0;
	//结束标志:
	//1.坐标是雷
	//2.坐标越界
	//3.坐标已被查找
	if (n <= (ROW - 2) && n >= 1 && m <= (ROW - 2) && m >= 1 && show_mine[n - 1][m - 1] == '*' && real_mine[n][m] == '0')
	{
		real_mine[n][m] = '2';//将查找过的坐标进行标记
		if (!count_mine(n, m))
		{
			show_mine[n - 1][m - 1] = ' ';//把周围没有雷的坐标显示为空白
			for (i = n - 1; i <= n + 1; i++)
			{
				for (j = m - 1; j <= m + 1; j++)
				{
					open_mine(i, j);
				}
			}
		}
		else
		{
			show_mine[n - 1][m - 1] = count_mine(n, m) + '0';//加0x30或者加‘0’都可以将数值转为字符
		}
	}
}

 扫雷函数

代码语言:javascript
复制
//扫雷函数

int sweep_mine(int n, int m)
{
	if (real_mine[n][m] == '1')//踩到雷
	{
		return 0;
	}
	else
	{
		int count = count_mine(n, m);//没踩到,统计周围雷的个数
		if (count)
		{
			show_mine[n - 1][m - 1] = count + 0x30;//该坐标处应展示的值 (普通整数要转换为字符,需要加上‘0’的ASCII码值,即0x30)
		}
		else
		{
			open_mine(n, m);
		}
		return 1;
	}
}

 判断是否赢得游戏

代码语言:javascript
复制
//判断是否赢得游戏

int is_win()
{
	int i = 0, j = 0;
	int count = 0;
	for (i = 0; i < ROW - 2; i++)
	{
		for (j = 0; j < COL - 2; j++)
		{
			if (show_mine[i][j] == '*')
			{
				count++;
			}
		}
	}
	if (count == MINE)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

 game.h文件

代码语言:javascript
复制
//函数的声明
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define COL 12
#define ROW 12
#define MINE 10
char show_mine[ROW-2][COL-2];//展示给玩家的棋盘的数组
char real_mine[ROW][COL];
void init_mine();//初始化布置雷的棋盘和展示给玩家的棋盘
void set_mine();//放置雷
void print_mine(); //打印放置雷的棋盘
void print_show();//打印展示给玩家的棋盘
int count_mine();//统计周围雷的个数
int has_queried(int n, int m);//判断输入的坐标是否已经被查询过
int sweep_mine();//扫雷函数
int is_win();//判断是否赢得游戏

 game.c文件

代码语言:javascript
复制
#define _CRT_SECURE_NO_WARNINGS
#include"saolei.h"
//测试游戏逻辑
void game()
{
	int n = 0, m = 0;
	init_mine();//初始化布置雷的棋盘和展示给玩家的棋盘
	set_mine();//放置雷
	while (1)
	{
		print_mine(); //打印放置雷的棋盘(方便观察是否有错误,实现整个游戏后进行隐藏)
		printf("\n");
		print_show();//打印展示给玩家的棋盘
		printf("请输入您想排查雷的坐标:>");
		scanf("%d %d", &n, &m);
		if (n<1 || n>10 || m<1 || m>10)
		{
			printf("您输入的坐标无效,请重新输入\n");
			continue;
		}
		int ret1 = has_queried(n, m);//判断输入的坐标是否已经被查询过
		if (!ret1)
		{
			printf("该位置已经被查询,请重新输入\n");
			continue;
		}
		int ret2 = sweep_mine(n, m);//扫雷函数
		if (!ret2)
		{
			printf("您已被炸死!\n");
			break;
		}
		int ret3 = is_win();//判断是否赢得游戏
		if (!ret3)
		{
			printf("游戏胜利!\n");
			break;
		}
	}
}

void menu()
{
	printf("*****************************\n");
	printf("********   1. Play   ********\n");
	printf("********   0. Exit   ********\n");
	printf("*****************************\n");
}

int main()
{
	srand((unsigned int)time(NULL));//设置随机数的起始值
	int input = 0;
	do
	{
		menu();//主菜单
		printf("请输入您的操作:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//进入游戏
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误请重新输入:>");
			break;
		}
	} while (input);
	return 0;
}

运行截图:

0e6a22fbfe4047f582e54d2317c2c966.png
0e6a22fbfe4047f582e54d2317c2c966.png
091e94fdb9d9486c8589ce90c9ef2681.png
091e94fdb9d9486c8589ce90c9ef2681.png
b42264f0d0fa43ab97aa9aa48e5f8e17.png
b42264f0d0fa43ab97aa9aa48e5f8e17.png

由运行截图可以看出部分游戏的功能,为了方便大家的学习和交流,文中以及将所有代码都展示出来了,大家可以自行测试。

总结

 以上就是今天要讲的内容,本文简单的介绍了用C语言实现扫雷小游戏的思路,还进一步展示了代码的运行结果验证了作者的思路。用学习到的知识来实现一个小游戏确实是一个成就感满满的事情,正在学习C语言的你也跟着一起来实现这个小游戏吧。

本文的作者也只是一个正在学习C语言等编程知识的萌新,若这篇文章中有哪些不正确的内容,请在评论区向作者指出(也可以私信作者),欢迎大佬们指点,也欢迎其他正在学习C语言的萌新和作者进行交流。

最后,如果本篇文章对你有所启发的话,也希望可以支持支持作者,后续作者也会定期更新学习记录。谢谢大家!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、主要实现功能
  • 二、程序流程(思路)
    • 主程序流程
      • 游戏部分流程
      • 三、源代码及运行截图
        • 源代码
          • 运行截图:
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档