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基础扫雷
和三子棋一样,主函数先设计游戏菜单界面,这里就不做展示了。 初始化棋盘 初级扫雷大小为9*9的棋盘,但排雷是周围一圈进行排雷(8格),而边界可能会越界。数组扩大了一圈,行和列都加了2,所以我们用一个11*11的数组来初始化…...
端点中心(Endpoint Central)的软件许可证管理
软件许可证管理 (SLM) 是从单个控制台管理整个组织中使用的软件许可证的过程。软件许可证是由软件发行商或分销商制作的法律文件,提供有关软件使用和分发的规则和指南,本文档通常包含条款和条件、限制和免责声明。 软件许可证管理…...
SpringCloud源码探析(九)- Sentinel概念及使用
1.概述 在微服务的依赖调用中,若被调用方出现故障,出于自我保护的目的,调用方会主动停止调用,并根据业务需要进行对应处理,这种方式叫做熔断,是微服务的一种保护方式。为了保证服务的高可用性,…...
nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04
本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改,对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…...
Mysql 数据库增删改查
MySQL是目前最流行的关系型数据库。以下是MySQL数据库的增删改查操作。 1.数据库连接 在进行增删改查操作之前,需要先连接MySQL数据库。使用以下命令进行连接: import mysql.connectormydb mysql.connector.connect(host"localhost",user&…...
【深度学习注意力机制系列】—— ECANet注意力机制(附pytorch实现)
ECANet(Efficient Channel Attention Network)是一种用于图像处理任务的神经网络架构,它在保持高效性的同时,有效地捕捉图像中的通道间关系,从而提升了特征表示的能力。ECANet通过引入通道注意力机制,以及在…...
python爬虫的简单实现
当涉及网络爬虫时,Python中最常用的库之一是requests。它能够发送HTTP请求并获取网页内容。下面是一个简单的示例,展示如何使用requests库来获取一个网页的内容: import requests 指定要爬取的网页的URL url ‘https://example.com’ 发…...
如何正确的向chatgpt提问?
有没有发现,在使用ChatGPT的时候,他回答的一些问题并不是我们想要的甚至有的时候出现牛头不对马嘴的情况。 这时候就会感慨一句,人工智能也不怎么样嘛! 但是,有没有想过,是自己问的问题太宽泛,没有问到点上…...
一键部署 Umami 统计个人网站访问数据
谈到网站统计,大家第一时间想到的肯定是 Google Analytics。然而,我们都知道 Google Analytics 会收集所有用户的信息,对数据没有任何控制和隐私保护。 Google Analytics 收集的指标实在是太多了,有很多都是不必要的,…...
java种的hutool库接口说明和整理
1. Hutool库基本介绍 1.1. 地址 官网地址:https://www.hutool.cn/ 1.2. 基本介绍 Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅…...
控制国外各类电液伺服阀放大器
控制通用型不带反馈信号输入的伺服阀放大器,对射流管式电液伺服阀、喷嘴挡板式电液伺服阀及国外各类电液伺服阀进行控制。 通过系统参数有10V和4~20mA输入指令信号选择; 供电电源: 24VDC(标准) 输出电流:最大可达10…...
【go语言基础】go中的方法
先思考一个问题,什么是方法,什么是函数? 方法是从属于某个结构体或者非结构体的。在func这个关键字和方法名中间加了一个特殊的接收器类型,这个接收器可以是结构体类型的或者是非结构体类型的。从属的结构体获取该方法。 函数则…...
Go 语言并发编程 及 进阶与依赖管理
1.0 从并发编程本质了解Go高性能的本质 1.1 Goroutine 协程可以理解为轻量级线程; Go更适合高并发场景原因之一:Go语言一次可以创建上万协成; “快速”:开多个协成 打印。 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区域,两个区域两两之间建邻,AS2两个小区域之间建联邦(R2与R5、R4与R7)。 3.使R3、R6为路由反射器 RR反射器选取各小区域的路由器作为客户端 、非客户端 4.优…...
一起学数据结构(3)——万字解析:链表的概念及单链表的实现
上篇文章介绍了数据结构的一些基本概念,以及顺序表的概念和实现,本文来介绍链表的概念和单链表的实现,在此之前,首先来回顾以下顺序表的特点: 1.顺序表特点回顾: 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、效果(选中文本右键翻译,默认快捷键CtrlShiftY)...
激光切割机的操作中蛙跳技术是什么意思
其实,蛙跳技术就是指在激光切割机运行的过程中,机器换位置的方式。打个比方,你刚刚在这儿把孔1切好了,接下来就得跑到那儿把孔2切了。 在这个过程中,激光切割机就像是一只青蛙,要从一个位置跳到另一个位置。…...
作为一名在读博士生,我在日常是如何与AI协作的?
前言:当同事,不当工具 我是一名人工智能方向的在读博士生,大概在 ChatGPT 出来以后还是 GPT-3.5 的时候就比较重度使用 AI 以及 AI 工具了。几年下来,AI 已经渗透到我工作和学习很多环节,有一些心得想分享一下~ 当同…...
计算机视觉算法优化方法
计算机视觉算法优化方法:提升效率与精度的关键路径 计算机视觉作为人工智能的核心领域之一,广泛应用于自动驾驶、医疗影像、安防监控等场景。随着任务复杂度的提升,算法的计算效率、精度和泛化能力面临巨大挑战。如何优化算法成为研究者关注…...
TEKLauncher:方舟生存进化终极管理工具,5分钟搞定游戏配置
TEKLauncher:方舟生存进化终极管理工具,5分钟搞定游戏配置 【免费下载链接】TEKLauncher Launcher for ARK: Survival Evolved 项目地址: https://gitcode.com/gh_mirrors/te/TEKLauncher TEKLauncher是一款专为《方舟:生存进化》设计…...
部署与可视化系统:大厂内网监控常见架构:Streamlit + OpenCV 构建工业级多路摄像头并发检测流
一、写作动机:为什么要谈“内网监控”和“Streamlit + OpenCV”? 最近三个月内,多家大厂的内部技术博客和开源社区讨论中出现了一个高频趋势:用 Python 生态中的 Streamlit + OpenCV 组合替代传统 C/S 架构的监控客户端,快速构建内网视频分析可视化系统。这件事情在几年前…...
Unity Shader实战:用Dither抖动实现《碧蓝幻想Relink》同款遮挡透明效果(附完整代码)
Unity Shader实战:用Dither抖动实现《碧蓝幻想Relink》同款遮挡透明效果(附完整代码) 在3D游戏开发中,摄像机穿墙问题一直是影响玩家体验的痛点之一。想象一下,当玩家操控角色靠近墙壁时,镜头突然陷入墙体内…...
硬件指纹保护实战:三分钟掌握EASY-HWID-SPOOFER核心功能
硬件指纹保护实战:三分钟掌握EASY-HWID-SPOOFER核心功能 【免费下载链接】EASY-HWID-SPOOFER 基于内核模式的硬件信息欺骗工具 项目地址: https://gitcode.com/gh_mirrors/ea/EASY-HWID-SPOOFER 你是否曾因硬件指纹追踪而无法享受新用户优惠?或是…...
Sunshine游戏串流完全指南:从零开始搭建自托管游戏服务器
Sunshine游戏串流完全指南:从零开始搭建自托管游戏服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款强大的自托管游戏串流服务器,专为M…...
如何用ChatGLM-6B打造完美旅游计划:从景点推荐到行程规划的AI指南
如何用ChatGLM-6B打造完美旅游计划:从景点推荐到行程规划的AI指南 【免费下载链接】ChatGLM-6B ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型 项目地址: https://gitcode.com/gh_mirrors/ch/ChatGLM-6B ChatGLM-6B是一款开…...
大龄程序员转行AI大模型:高薪风口与实战学习指南,为啥要转行大模型AI大模型?
本文为计划转行至AI大模型领域的大龄程序员提供实用建议。文章首先阐述了转行原因,包括高薪机遇、技术前沿性、市场需求增长及持续学习机会。随后,分析了大模型的优势,如通用能力、泛化能力、灵活性和强大性能。文章还强调了大模型风口的现状…...
自托管云端IDE:Cherry Studio架构解析与部署实践
1. 项目概述:一个面向开发者的云端集成开发环境最近在和一些独立开发者朋友聊天时,大家普遍提到一个痛点:随着项目复杂度的提升,本地开发环境的搭建和维护越来越像一场“打地鼠”游戏。不同项目依赖的Node.js版本、Python环境、数…...
