当前位置: 首页 > news >正文

c基础扫雷

 和三子棋一样,主函数先设计游戏菜单界面,这里就不做展示了。

初始化棋盘

初级扫雷大小为9*9的棋盘,但排雷是周围一圈进行排雷(8格),而边界可能会越界。数组扩大了一圈,行和列都加了2,所以我们用一个11*11的数组来初始化棋盘。

同时为了让玩家定位哪一行哪一列的坐标,我们要将行列打印出来。

#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2
//初级10个雷
#define EASY_COUNT 10

由于是两个棋盘,初始化我们可以多传一个字符参数初始化不同棋盘

void init_mine(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;}}
}

棋盘打印

由于扫雷游戏的特殊性,我们要设计两个棋盘,一个用于放置雷的信息(存放两种字符,0为无雷,1为有雷),一个用于放排查出的雷信息(*为默认界面,数字字符代表周围8格雷的个数)。

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

 由于数组是从下标一开始的,这里我们防止打印的行列错位可以打印个0来对齐。

 设置雷

在9*9棋盘里随机放雷,雷用字符1表示,初级放10个雷。

void set_mine(char mine[ROWS][COLS], int row, int col)
{int n = EASY_COUNT;while (n--){int i = rand() % row+1;//1~9int j = rand() % col+1;if (mine[i][j] == '0')mine[i][j] = '1';}
}

 效果:

  

找雷

        找雷要分几个流程,先选择坐标然后显示该坐标是雷还是安全区,如果是雷游戏结束。如果是安全区还需判断4周有多少雷,获胜条件是将所有安全区标出即可胜利。 在此基础上还要检查坐标是否越界,以及是否被排查过等问题。

void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < col * row - EASY_COUNT){printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y>=1 && y<=col){if (mine[x][y] != '1'){if (show[x][y] == '*'){int ret = get_mine_count(mine, x, y);show[x][y] = ret + '0';//得到雷的个数(字符)display_board(show, ROW, COL);win++;}else printf("坐标被占用\n");}else{printf("踩雷了,游戏结束\n");break;}}else{printf("坐标非法\n" );}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");display_board(mine, ROW, COL);}
}

获取周围雷

我们用到0~1字符ascii码连续的特点(相差1),将8个坐标相加减去8个'0'的ASCII码值就得到雷的个数。

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

测试时我们可以将放雷的数组打印出来,方便观察周围是否有相应个数的雷,测试游戏胜利也可以将雷的个数设置多一些,判断胜利是否正常输出。 

完整代码

//game.c
#include "game.h"
void init_mine(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 display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}
void set_mine(char mine[ROWS][COLS], int row, int col)
{int n = EASY_COUNT;while (n--){int i = rand() % row+1;//1~9int j = rand() % col+1;if (mine[i][j] == '0')mine[i][j] = '1';}
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0');}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < col * row - EASY_COUNT){printf("请输入要排查雷的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y>=1 && y<=col){if (mine[x][y] != '1'){if (show[x][y] == '*'){int ret = get_mine_count(mine, x, y);show[x][y] = ret + '0';//得到雷的个数(字符)display_board(show, ROW, COL);win++;}else printf("坐标被占用\n");}else{printf("踩雷了,游戏结束\n");break;}}else{printf("坐标非法\n" );}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");display_board(mine, ROW, COL);}
}
//test.c#include "game.h"void menu()
{printf("            1. play          \n");printf("            0. exit          \n");
}
void game()
{char board[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };init_mine(show, ROWS, COLS, '*');init_mine(board, ROWS, COLS, '0');set_mine(board, ROW, COL);display_board(board, ROW, COL);display_board(show, ROW, COL);find_mine(board, show, ROW, COL);display_board(show, ROW, COL);
}
int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}
//game.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void init_mine(char board[ROWS][COLS], int row, int col, char set);//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

相关文章:

c基础扫雷

和三子棋一样&#xff0c;主函数先设计游戏菜单界面&#xff0c;这里就不做展示了。 初始化棋盘 初级扫雷大小为9*9的棋盘&#xff0c;但排雷是周围一圈进行排雷(8格)&#xff0c;而边界可能会越界。数组扩大了一圈,行和列都加了2&#xff0c;所以我们用一个11*11的数组来初始化…...

端点中心(Endpoint Central)的软件许可证管理

软件许可证管理 &#xff08;SLM&#xff09; 是从单个控制台管理整个组织中使用的软件许可证的过程。软件许可证是由软件发行商或分销商制作的法律文件&#xff0c;提供有关软件使用和分发的规则和指南&#xff0c;本文档通常包含条款和条件、限制和免责声明。 软件许可证管理…...

SpringCloud源码探析(九)- Sentinel概念及使用

1.概述 在微服务的依赖调用中&#xff0c;若被调用方出现故障&#xff0c;出于自我保护的目的&#xff0c;调用方会主动停止调用&#xff0c;并根据业务需要进行对应处理&#xff0c;这种方式叫做熔断&#xff0c;是微服务的一种保护方式。为了保证服务的高可用性&#xff0c;…...

nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04

本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改&#xff0c;对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…...

Mysql 数据库增删改查

MySQL是目前最流行的关系型数据库。以下是MySQL数据库的增删改查操作。 1.数据库连接 在进行增删改查操作之前&#xff0c;需要先连接MySQL数据库。使用以下命令进行连接&#xff1a; import mysql.connectormydb mysql.connector.connect(host"localhost",user&…...

【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)

ECANet&#xff08;Efficient Channel Attention Network&#xff09;是一种用于图像处理任务的神经网络架构&#xff0c;它在保持高效性的同时&#xff0c;有效地捕捉图像中的通道间关系&#xff0c;从而提升了特征表示的能力。ECANet通过引入通道注意力机制&#xff0c;以及在…...

python爬虫的简单实现

当涉及网络爬虫时&#xff0c;Python中最常用的库之一是requests。它能够发送HTTP请求并获取网页内容。下面是一个简单的示例&#xff0c;展示如何使用requests库来获取一个网页的内容&#xff1a; import requests 指定要爬取的网页的URL url ‘https://example.com’ 发…...

如何正确的向chatgpt提问?

有没有发现&#xff0c;在使用ChatGPT的时候&#xff0c;他回答的一些问题并不是我们想要的甚至有的时候出现牛头不对马嘴的情况。 这时候就会感慨一句&#xff0c;人工智能也不怎么样嘛! 但是&#xff0c;有没有想过&#xff0c;是自己问的问题太宽泛&#xff0c;没有问到点上…...

一键部署 Umami 统计个人网站访问数据

谈到网站统计&#xff0c;大家第一时间想到的肯定是 Google Analytics。然而&#xff0c;我们都知道 Google Analytics 会收集所有用户的信息&#xff0c;对数据没有任何控制和隐私保护。 Google Analytics 收集的指标实在是太多了&#xff0c;有很多都是不必要的&#xff0c;…...

java种的hutool库接口说明和整理

1. Hutool库基本介绍 1.1. 地址 官网地址&#xff1a;https://www.hutool.cn/ 1.2. 基本介绍 Hutool是一个小而全的Java工具类库&#xff0c;通过静态方法封装&#xff0c;降低相关API的学习成本&#xff0c;提高工作效率&#xff0c;使Java拥有函数式语言般的优雅&#xf…...

控制国外各类电液伺服阀放大器

控制通用型不带反馈信号输入的伺服阀放大器&#xff0c;对射流管式电液伺服阀、喷嘴挡板式电液伺服阀及国外各类电液伺服阀进行控制。 通过系统参数有10V和4~20mA输入指令信号选择&#xff1b; 供电电源: 24VDC&#xff08;标准&#xff09; 输出电流&#xff1a;最大可达10…...

【go语言基础】go中的方法

先思考一个问题&#xff0c;什么是方法&#xff0c;什么是函数&#xff1f; 方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型&#xff0c;这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。 函数则…...

Go 语言并发编程 及 进阶与依赖管理

1.0 从并发编程本质了解Go高性能的本质 1.1 Goroutine 协程可以理解为轻量级线程&#xff1b; Go更适合高并发场景原因之一&#xff1a;Go语言一次可以创建上万协成&#xff1b; “快速”&#xff1a;开多个协成 打印。 go func(): 在函数前加 go 代表 创建协程; time.Sleep():…...

绽放趋势:Python折线图数据可视化艺术

文章目录 一 json数据格式1.1 json数据格式认识1.2 Python数据和Json数据的相互转换 二 pyecharts模块2.1 pyecharts概述2.2 pyecharts模块安装 三 pyecharts快速入门3.1 基础折线图3.2 pyecharts配置选项3.2.1 全局配置选项 3.4 折线图相关配置3.4.1 .add_yaxis相关配置选项3.…...

BGP小综合

实验要求及拓扑 一、思路 1.使用OSPF使R2-R7之间可通。 2.各自宣告AS区域&#xff0c;两个区域两两之间建邻&#xff0c;AS2两个小区域之间建联邦&#xff08;R2与R5、R4与R7&#xff09;。 3.使R3、R6为路由反射器 RR反射器选取各小区域的路由器作为客户端 、非客户端 4.优…...

一起学数据结构(3)——万字解析:链表的概念及单链表的实现

上篇文章介绍了数据结构的一些基本概念&#xff0c;以及顺序表的概念和实现&#xff0c;本文来介绍链表的概念和单链表的实现&#xff0c;在此之前&#xff0c;首先来回顾以下顺序表的特点&#xff1a; 1.顺序表特点回顾&#xff1a; 1. 顺序表是一组地址连续的存储单元依次存…...

9.2.1Socket(UDP)

一.传输层: 1.UDP:无连接,不可靠,面向数据报,全双工. 2.TCP:有连接,可靠,面向字节流,全双工. 注意:这里的可不可靠是相对的,并且和安不安全无关. 二.UDP数据报套接字编程: 1.socket文件:表示网卡的这类文件. 2.DatagramPacket:表示一个UDP数据报. 三.代码实现: 1.回显服务…...

9.1网络通信基础

一.基础概念: 1)IP地址:描述网络上的一个设备所在的位置. 2)端口号(port):区分一个主机上不同的进程,和pid一样的作用,但两者不同. 3)协议:网络通信传输数据的含义,协议表示一种约定,这种约定可以是任意的.协议分层之后,上层不需要知道下层协议的细节,可以灵活地调整,替换某…...

idea添加翻译插件并配置有道翻译

1、安装Translation插件 2、 创建有道云应用 有道智云控制台 3、设置idea 4、效果&#xff08;选中文本右键翻译&#xff0c;默认快捷键CtrlShiftY&#xff09;...

激光切割机的操作中蛙跳技术是什么意思

其实&#xff0c;蛙跳技术就是指在激光切割机运行的过程中&#xff0c;机器换位置的方式。打个比方&#xff0c;你刚刚在这儿把孔1切好了&#xff0c;接下来就得跑到那儿把孔2切了。 在这个过程中&#xff0c;激光切割机就像是一只青蛙&#xff0c;要从一个位置跳到另一个位置。…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...