扫雷游戏(C语言)

目录

一、前言:

二、游戏规则:

三、游戏前准备

四、游戏实现

1、打印菜单

2、初始化棋盘

3、打印棋盘

4、布置雷

5、排雷

五、完整代码


一、前言:

用C语言完成扫雷游戏对于初学者来说,难度并不是很大,而且通过编程这个小游戏,会让你对函数调用,分支循环,连续输入等有很好的掌握,该过程并不涉及指针及以后的内容。

二、游戏规则:

扫雷游戏规则十分简单,比如9*9网格中,就是在81个网格中找到其中的10颗雷,并不被雷炸死。

三、游戏前准备

我们为了让代码更加简洁,将代码分成三个文件中编写,如图所示,在test.c文件中放主函数,

在game.h中放所需的头文件,在gam.c中放调用的函数。

四、游戏实现

为了方便下面的讲解,我先把主函数和头文件放出来

#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

 game.h文件中放入头文件,并定义全文所需的宏变量,这样方便改动,比如本篇讲述的是9*9网格的,你只需将定义的9改成其他数据,就可以得到一个10*10或其他的网格


#include"game.h"
void game()
{
    char mine[ROWS][COLS];
    char show[ROWS][COLS];
    //第一步,初始化棋盘
    Initboard(mine, ROWS, COLS,'0');
    Initboard(show, ROWS, COLS,'*');
    //第二步,打印棋盘
    Printboard(show, ROW, COL);
    //第三步,布置雷
    Setmine(mine, ROW, COL);
    //Printboard(mine, ROW, COL);
    //第四步,排雷
    Finemine(mine, show, ROW, COL);
}
void menu()
{
    printf("****************\n");
    printf("**** 1 play ****\n");
    printf("**** 0 exit ****\n");
    printf("****************\n");
}
int main()
{
    int count = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请输入你的选择:");
        scanf("%d", &count);
        switch (count)
        {
        case 1:
            game();
            break;
        case 0:
            printf("你已选择退出游戏\n");
            break;
        default:
            printf("这是一个不规范的选择,请重新选择\n");
            break;
        }
    } while (count);
    return 0;
}

通过主函数,你应该能看出来我们实现这个游戏的逻辑是先打印出菜单,告诉你不同的选择,然后通过你的选择来判断是否进入游戏,所以游戏大体分成以下几步:

1、打印菜单

2、初始化棋盘

3、随机布置十颗雷

5、打印棋盘

4、排雷

下面我们逐步实现这几点:

1、打印菜单

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

运行后可以打印出菜单

2、初始化棋盘

在game()函数中,我们定义了两个字符数组

char mine[ROWS][COLS];
char show[ROWS][COLS];
//第一步,初始化棋盘
Initboard(mine, ROWS, COLS,'0');
Initboard(show, ROWS, COLS,'*');

其中第一个数组是雷盘,布置雷在上面,第二个数组是展示的,告诉玩家游戏进行情况,我们用0表示无雷,可以先把雷盘全部初始化为‘0’,展示盘全部初始化为‘*’

具体函数如下:

void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

3、打印棋盘

在主函数中,我们就提到了初始化后打印棋盘,其实打印棋盘和布置雷两步可以互换先后顺序,但是这里打印棋盘还可以用来检测上面初始化是否成功

//第二步,打印棋盘
    Printboard(show, ROW, COL);

代码如下:

void Printboard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <=row; i++)
		printf("%d ", i);
	printf("\n");
	for (i = 1; i <= col; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= row; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

运行后结果如下:

4、布置雷

//第三步,布置雷
    Setmine(mine, ROW, COL);
    //Printboard(mine, ROW, COL);//这步可以用来检测雷是否布置成功,如果怕出错可以用上

初始化棋盘之后,就要在雷盘中随即找十个位置放雷,也就是说要放进去十颗雷

void Setmine(char board[ROWS][COLS], int row, int show)
{
	int num = mine_count;
	while (num)
	{
		int i = rand() % 9 + 1;
		int j = rand() % 9 + 1;
		if (board[i][j] == '0')
		{
			board[i][j] = '1';
			num--;
		}
	}
}

用‘1’表示雷,就是将mine数组中随即找十个位置,将‘0’换成‘1’,表示在这里埋雷

5、排雷

排雷过程中只有两种结果,一种是正好是雷,那么就会炸死,另一种则是不是雷,如果不是雷,我们应该把它周围有几个雷判断出来,不然几乎不可能通关

代码如下:

int lei_count(char mine[ROWS][COLS], int a, int b)
{
	int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]
		+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';
	return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int a, b;
	int wulei = row * col - mine_count;
	while (wulei)
	{
		printf("请输入你要检查的坐标:");
		scanf("%d %d", &a, &b);
		if (a > 0 && a <= row && b > 0 && b <= col)
		{
			if (mine[a][b] == '1')
			{
				printf("抱歉,这是雷,你被炸死了\n");
				break;
			}
			else
			{
				//既然不是雷,那就统计雷的数量
				int count = lei_count(mine, a, b);
				show[a][b] = count + '0';
				Printboard(show, ROW, COL);
				wulei--;
			}
		}
		else
			printf("此坐标不存在,请重新输入\n");
	}
}

五、完整代码

game.h

#include<stdio.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10
void Initboard(char board[ROWS][COLS], int rows,int cols,char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Finemine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

test.c

#include"game.h"
void game()
{
    char mine[ROWS][COLS];
    char show[ROWS][COLS];
    //第一步,初始化棋盘
    Initboard(mine, ROWS, COLS,'0');
    Initboard(show, ROWS, COLS,'*');
    //第二步,打印棋盘
    Printboard(show, ROW, COL);
    //第三步,布置雷
    Setmine(mine, ROW, COL);
    //Printboard(mine, ROW, COL);
    //第四步,排雷
    Finemine(mine, show, ROW, COL);
}
void menu()
{
    printf("****************\n");
    printf("**** 1 play ****\n");
    printf("**** 0 exit ****\n");
    printf("****************\n");
}
int main()
{
    int count = 0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请输入你的选择:");
        scanf("%d", &count);
        switch (count)
        {
        case 1:
            game();
            break;
        case 0:
            printf("你已选择退出游戏\n");
            break;
        default:
            printf("这是一个不规范的选择,请重新选择\n");
            break;
        }
    } while (count);
    return 0;
}

game.c

#include"game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}
void Printboard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <=row; i++)
		printf("%d ", i);
	printf("\n");
	for (i = 1; i <= col; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= row; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
void Setmine(char board[ROWS][COLS], int row, int show)
{
	int num = mine_count;
	while (num)
	{
		int i = rand() % 9 + 1;
		int j = rand() % 9 + 1;
		if (board[i][j] == '0')
		{
			board[i][j] = '1';
			num--;
		}
	}
}
int lei_count(char mine[ROWS][COLS], int a, int b)
{
	int count = mine[a - 1][b - 1] + mine[a - 1][b] + mine[a - 1][b + 1] + mine[a][b - 1] + mine[a][b + 1]
		+ mine[a + 1][b - 1] + mine[a + 1][b] + mine[a + 1][b + 1] - 8 * '0';
	return count;
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int a, b;
	int wulei = row * col - mine_count;
	while (wulei)
	{
		printf("请输入你要检查的坐标:");
		scanf("%d %d", &a, &b);
		if (a > 0 && a <= row && b > 0 && b <= col)
		{
			if (mine[a][b] == '1')
			{
				printf("抱歉,这是雷,你被炸死了\n");
				break;
			}
			else
			{
				//既然不是雷,那就统计雷的数量
				int count = lei_count(mine, a, b);
				show[a][b] = count + '0';
				Printboard(show, ROW, COL);
				wulei--;
			}
		}
		else
			printf("此坐标不存在,请重新输入\n");
	}
}

用C语言解决扫雷游戏还是非常有意思的,上面这种还是最简单的,还有许多有趣的东西值得探索,比如如何搞一个20*20的棋盘,或如何用递归的方法实现快速展开,如果想了解更多,点击关注,去学习更多C语言的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/356491.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux的优先级说明

一、背景 在工作中&#xff0c;不少同学对nice&#xff0c;priority&#xff0c;schedue策略&#xff0c;实时优先级&#xff0c;普通进程优先级的概念混淆&#xff0c;导致最后的代码可能引入bug&#xff0c;本文将统一进行说明&#xff0c;部分内容参考网络大佬的文章 &…

有趣的css - 第一个字符串自动生成文字图标

在设计 app 界面的时候&#xff0c;要展示一部分最新的资讯入口&#xff0c;然后出了一张下面的 UI 稿。 UI稿截图如下&#xff1a; 列表设计比较简单&#xff0c;就是列表前面的圆形图标这块&#xff0c;我个人觉得还是有点意思的。 一般的话&#xff0c;大概率都是用js限制…

MYSQL基本查询(CURD:创建、读取、更新、删除)

文章目录 前言一、Create1.全列插入2.指定列插入3.插入否则更新4.替换 二、Retrieve1.SELECT列2.WHERE条件3.结果排序4.筛选分页结果 三、Update四、Delete1.删除数据2.截断表 五、插入查询结果六、聚合函数 前言 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型…

OJ_糖果分享游戏

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;void ShareCandy(vector<int>& student) {int size student.size();vector<int> share(size); //保存每个同学交换前&#xff0c;糖果数量…

[机器学习]简单线性回归——梯度下降法

一.梯度下降法概念 2.代码实现 # 0. 引入依赖 import numpy as np import matplotlib.pyplot as plt# 1. 导入数据&#xff08;data.csv&#xff09; points np.genfromtxt(data.csv, delimiter,) points[0,0]# 提取points中的两列数据&#xff0c;分别作为x&#xff0c;y …

【hcie-cloud】【23】容器编排【k8s】【Kubernetes常用工作负载、Kubernetes调度器简介、Helm简介、缩略词】【下】

文章目录 单机容器面临的问题、Kubernetes介绍与安装、Kubernetes对象的基本操作、Kubernetes YAML文件编写基础Kubernetes常用工作负载Kubernetes常用工作负载简介创建一个无状态nginx集群无状态工作负载Deployment说明无状态工作负载Deployment常见操作创建一个有状态的MySQL…

单链表实现通讯录(增删查改)

前言 之前写了很多次通讯录&#xff0c;一次比一次复杂&#xff0c;从静态到动态&#xff0c;再到文件操作&#xff0c;再到顺序表&#xff0c;今天要好好复习一下单链表&#xff0c;于是乎干脆用单链表再写一遍。 首先我们之前已经用单链表写过他的增删查改了&#xff0c;于…

1.28回溯(中等)

目录 1.格雷编码 2. 复原 IP 地址 3. 火柴拼正方形 1.格雷编码 n 位格雷码序列 是一个由 2n 个整数组成的序列&#xff0c;其中&#xff1a; 每个整数都在范围 [0, 2n - 1] 内&#xff08;含 0 和 2n - 1&#xff09;第一个整数是 0一个整数在序列中出现 不超过一次每对 相…

备战蓝桥杯----贪心算法(二进制)

已经差不多掌握了贪心的基本思想&#xff0c;让我们看几道比较趣的题吧&#xff01; 先来个比较有意思的题热热身&#xff1a; 法1.我们可以先把l,r化成二进制的形式。 然后分俩种情况&#xff1a; &#xff08;1&#xff09;若他们位数不一样并且位数高的全为1&#xff0c;…

在Shopee菲律宾站点进行选品时的策略

随着电子商务的快速发展&#xff0c;越来越多的卖家开始将目光投向了海外市场。作为东南亚地区最大的电商平台之一&#xff0c;Shopee菲律宾站点吸引了众多卖家的关注。然而&#xff0c;在这个竞争激烈的市场上&#xff0c;卖家需要制定一系列的策略&#xff0c;才能在选品中脱…

arcgis 批量删除字段

一、打开ArcToolbox-数据管理工具-字段-删除字段。 二、在输入表中选择要删除字段的要素&#xff0c;在删除字段栏中选择要删除的字段&#xff0c;点击确认即可。

git配置用户名和邮箱

1.git 1.配置用户名和邮箱 2.git初体验 git init 初始化git仓库 管理项目让git管理你的本次代码变更 git add .git commit -m “你完成的功能” 后续如果新增/修改/删除代码&#xff0c; 完成新功能时 重复2 3.查看日志 1.git log 4.版本回退 1.查看提交的版本记录 git l…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明&#xff08;经常忘记怎么用&#xff1f;&#xff09;&#xff08;常改&#xff09; 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门&#xff1b;Close关门&#xff1b;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

基于saltstack开发自动化开通主机防火墙策略工具

一、前言 企业安全防护策略中会要求操作系统开启防火墙&#xff0c;开启iptables防火墙后&#xff0c;对于业务网络访问意味着要经常去变更调整iptables防火墙策略。如果是管理几台服务器&#xff0c;手工登录操作下还能接受。但在实际大型IT架构中&#xff0c;可能涉及到的服…

【JavaScript基础入门】05 JavaScript基础语法(三)

JavaScript基础语法&#xff08;三&#xff09; 目录 JavaScript基础语法&#xff08;三&#xff09;数组概述数组语法多维数组 操作数组修改数组获取数组长度数组和字符串之间的转换添加和删除数组项 Null 和 Undefined字符串连接字符串字符串转换获取字符串的长度在字符串中查…

后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 1…

合合信息技术能力

体验中心网址&#xff1a; https://www.textin.com/TextIn体验中心 - 在线免费体验中心https://www.textin.com/ 合合技术团队CSDN&#xff1a; 合合技术团队的博客_CSDN博客-基于深度学习的文本检测与识别技术白皮书,【通用文本信息抽取技术白皮书】,【技术应用】领域博主 …

xss靶场实战

靶场链接&#xff1a;https://pan.baidu.com/s/1ors60QJujcmIZPf3iU3SmA?pwd4mg4 提取码&#xff1a;4mg4 XSS漏洞原理 XSS又叫CSS&#xff08;Cross Site Script&#xff09;&#xff0c;跨站脚本攻击。因为与html中的css样式同&#xff0c;所以称之为XSS。在OWASP top 1…

Python Tornado 实现SSE服务端主动推送方案

一、SSE 服务端消息推送 SSE 是 Server-Sent Events 的简称&#xff0c; 是一种服务器端到客户端(浏览器)的单项消息推送。对应的浏览器端实现 Event Source 接口被制定为HTML5 的一部分。相比于 WebSocket&#xff0c;服务器端和客户端工作量都要小很多、简单很多&#xff0c…

深度强化学习(王树森)笔记05

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…