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

控制台扫雷(C语言实现)

目录

  • 博文目的
  • 实现思路
  • 项目创建
    • 文件解释
  • 具体实现
    • 判断玩家进行游戏还是退出
    • 扫雷棋盘的确定
    • 地图初始化
    • 埋雷
    • 玩家扫雷的实现
    • 雷判断函数
  • 源码
    • game.c
    • game.h
    • 扫雷.c

博文目的

相信不少人都学习了c语言的函数,循环,分支那我们就可以写一个控制台的扫雷小游戏来检验自己学得如何。

在做一件事之前我们都要先考虑我们学要做哪些。同样要实现一个扫雷小游戏,我们首先要思考学要做什么。

实现思路

实现思路可以参考以下步骤:

  • 判断玩家进行游戏还是退出。

  • 将扫雷的棋盘确定。

  • 地图初始化。

  • 埋雷 。

  • 玩家扫雷的实现。

  • 对玩家扫的是不是雷判断,周围几颗雷判断

项目创建

在所有开始之前我们先建项目。
​​​​建项目

文件解释

对文件的解释如下:

  • 创一个头文件game.h里面放都要用到的头文件和参数。

  • 在game.c中实现我们的游戏逻辑。

  • 在扫雷.c中把游戏串起来。

具体实现

具体实现可以参考如下思路:

判断玩家进行游戏还是退出

使用一个menu函数将作为菜单打印。
在主函数中使用do-while循环来判断用户是玩还是退出。

void menu()
{printf("------------------------------\n");printf("----------1.play--------------\n");printf("----------0.exit--------------\n");printf("------------------------------\n");
}
int main()
{int a;do{menu();scanf("%d",&a);} while(a);return 0;
}

扫雷棋盘的确定

首先会先想到创建一个9 * 9的数组来表示棋盘。
9*9
但是我们就要考虑到判断周围雷个数时的判断,只创建9*9的棋盘,那在边界上的雷就不好判断周围有几颗雷,要判断就需要在写其他的判断方法不能与中间的判断方法统一了。

所以扩大一圈创建11 * 11的地图。
11*11

在头文件中使用宏定义出地图的长度和能访问的长度。

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2

地图初始化

我们将代表地图的数组有雷的设为1,无雷的设为0。

想到这我们又会考虑到 什么代表雷呢,我们就以字符0代表没雷1代表有雷;
难道我们在控制台输出0 1吗,那还玩个屁啊。
因此我们应该还要创建一个地图来输出。

在扫雷.c文件中定义出两个数组,在game.c文件中写数组初始化函数。

//扫雷.c中封装函数
void game()
{char map1[ROWS][COLS];char map2[ROWS][COLS];init(map1, '0');init(map2, '*');
}
//game.c中初始化棋盘函数
void init(char a[ROWS][COLS], char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){a[i][j] = ch;}}
}

埋雷

我们要埋雷而且还要是随机的,那我们就要用到随机数生成函数,
如果我们像这样布置雷,随机数生成后会不会相等,让同一位置布置多个雷了?
所以我们要判断生成的是否已经埋雷。

//埋雷函数
void LayMine(char map1[ROWS][COLS])
{int count = MINE_NUMBER;srand((unsigned int)time(NULL));while(count){ int x = rand() % ROW + 1;int y = rand() % COL + 1;if (map1[x][y] == '0'){map1[x][y] = '1';count--;}}
}

玩家扫雷的实现

玩家在控制台上扫雷是通过坐标来输入,那我们打印棋盘时就去提供每个坐标,不然输入时要玩家自己一个一个数坐标,本来就玩的不爽,就更不爽了。

/打印棋盘
void Print(char map[ROWS][COLS])
{printf("=====扫雷===========\n");for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++){printf("%d ", i);for (int j = 1; j <= COL; j++){printf("%c ", map[i][j]);}printf("\n");}
}

雷判断函数

对玩家扫的是不是雷判断,周围几颗雷判断 。

void FindMine(char map1[ROWS][COLS], char map2[ROWS][COLS])
{int count = 0;//记扫了几个雷while (count < MINE_NUMBER){int x = 0, y = 0;printf("请输入需要排查的坐标 ");scanf("%d%d", & x, & y);if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))//确保用户输入正确坐标{if (map1[x][y] == '1'){printf("踩雷结束\n");Print(map1);break;}else{count--;int num = 0;for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (map1[i][j] == '1'){num++;}}}map2[x][y] = num + '0';Print(map2);}}else{printf("错误输入\n");}}if (count == MINE_NUMBER){printf("过关牛逼\n");}
}

源码

源码呈上:

game.c

game.c文件下的代码

# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"//初始化棋盘函数
void init(char a[ROWS][COLS], char ch)
{for (int i = 0; i < ROWS; i++){for (int j = 0; j < COLS; j++){a[i][j] = ch;}}
}//埋雷函数
void LayMine(char map1[ROWS][COLS])
{int count = MINE_NUMBER;srand((unsigned int)time(NULL));while(count){ int x = rand() % ROW + 1;int y = rand() % COL + 1;if (map1[x][y] == '0'){map1[x][y] = '1';count--;}}
}//打印棋盘
void Print(char map[ROWS][COLS])
{printf("=====扫雷===========\n");for (int i = 0; i <= COL; i++){printf("%d ", i);}printf("\n");for (int i = 1; i <= ROW; i++){printf("%d ", i);for (int j = 1; j <= COL; j++){printf("%c ", map[i][j]);}printf("\n");}
}
void FindMine(char map1[ROWS][COLS], char map2[ROWS][COLS])
{int count = 0;//记扫了几个雷while (count < MINE_NUMBER){int x = 0, y = 0;printf("请输入需要排查的坐标 ");scanf("%d%d", & x, & y);if ((x >= 1 && x <= ROW) && (y >= 1 && y <= COL))//确保用户输入正确坐标{if (map1[x][y] == '1'){printf("踩雷结束\n");Print(map1);break;}else{count--;int num = 0;for (int i = x - 1; i <= x + 1; i++){for (int j = y - 1; j <= y + 1; j++){if (map1[i][j] == '1'){num++;}}}map2[x][y] = num + '0';Print(map2);}}else{printf("错误输入\n");}}if (count == MINE_NUMBER){printf("过关牛逼\n");}
}

game.h

game.h文件下的代码:

#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUMBER 10void init(char a[ROWS][COLS], char ch);
void LayMine(char map1[ROWS][COLS]);
void Print(char map[ROWS][COLS]);
void FindMine(char map1[ROWS][COLS], char map2[ROWS][COLS]);

扫雷.c

扫雷.c文件下的代码:

# define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{printf("------------------------------\n");printf("----------1.play--------------\n");printf("----------0.exit--------------\n");printf("------------------------------\n");
}void game()
{char map1[ROWS][COLS];char map2[ROWS][COLS];init(map1, '0');init(map2, '*');LayMine(map1);//Print(map1);Print(map2);FindMine(map1, map2);
}
int main()
{int a;do{menu();scanf("%d", &a);switch (a){case 1:game();break;case 0:printf("exit\n");break;default:printf("错误输入\n");break;}} while (a);return 0;
}

相关文章:

控制台扫雷(C语言实现)

目录 博文目的实现思路项目创建文件解释 具体实现判断玩家进行游戏还是退出扫雷棋盘的确定地图初始化埋雷玩家扫雷的实现雷判断函数 源码game.cgame.h扫雷.c 博文目的 相信不少人都学习了c语言的函数&#xff0c;循环&#xff0c;分支那我们就可以写一个控制台的扫雷小游戏来检…...

操作系统期末复习 | 批处理程序 | PV实现同步互斥 | 调度算法 | 页面置换算法 | 磁盘调度算法

操作系统引论 批处理程序 单道批处理&#xff1a;引入脱机输入/输出技术&#xff0c;并由监督程序负责控制作业的输入、输出。主要优点是缓解了一定程度的人机速度矛盾&#xff0c;资源利用率有所提升。主要缺点是内存中仅能有一道程序运行&#xff0c;只有该程序运行结束之后…...

字符串的六种遍历方式

在 Java 中&#xff0c;有多种遍历字符串的方法。以下是几种常见的遍历字符串的方法&#xff0c;并附有示例代码 1. 使用 for 循环 这是最常见和基础的遍历方法&#xff0c;通过索引访问每个字符。 public class StringTraversal {public static void main(String[] args) {S…...

在码云(Gitee)上建立分支(Branch)的步骤如下:

步骤一&#xff1a;登录码云 首先&#xff0c;打开码云的官方网站&#xff08;gitee.com&#xff09;&#xff0c;输入用户名和密码登录你的账号。 步骤二&#xff1a;创建仓库 登录后&#xff0c;在页面右上方的搜索框中输入仓库名称&#xff0c;并点击“创建”按钮创建新的仓…...

JVM专题四:JVM的类加载机制

Java中类的加载阶段 类加载 Java中的类加载机制是Java运行时环境的一部分&#xff0c;确保Java类可以被JVM&#xff08;Java虚拟机&#xff09;正确地加载和执行。类加载机制主要分为以下几个阶段&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;这个阶段&#x…...

Python爬取中国天气网天气数据.

一、主题式网络爬虫设计方案 1.主题式网络爬虫名称 名称&#xff1a;Python爬取中国天气网天气数据 2.主题式网络爬虫爬取的内容与数据特征分析 本次爬虫主要爬取中国天气网天气数据 3.主题式网络爬虫设计方案概述&#xff08;包括实现思路与技术难点&#xff09; reques…...

EXCEL快速填充空白内容

** EXCEL快速填充空白内容 ** 1.全选所有需要填充的内容&#xff0c;按住电脑的F5或者CTRLG点击定位 2.可以看到空白处被自动选定&#xff0c;之后按电脑和⬆&#xff0c;最后CTRLenter 可以看到空白处已经被填充。...

CBSD创建和管理bhyve容器Ubuntu@FreeBSD

bhyve介绍&#xff1a;bhyve&#xff1a;FreeBSD下的原生虚拟机管理器_freebsd 虚拟化平台bhyve-CSDN博客 两个bhyve的管理软件&#xff1a;使用bvm管理bhyve虚拟机管理系统FreeBSD-CSDN博客 vm-bhyve&#xff1a;bhyve虚拟机的管理系统FreeBSD-CSDN博客 现在&#xff0c;我…...

STM32开发实战:SPI接口在W25Q64 Flash存储器中的应用

摘要 本文将深入探讨STM32微控制器如何利用SPI接口与W25Q64 Flash存储器进行通信。W25Q64是一款常用的SPI串行Flash存储器&#xff0c;具有8Mbit的存储容量。本教程将指导读者完成硬件连接、SPI配置、读写操作&#xff0c;并提供实际的代码实现。 1. SPI接口概述 SPI是一种串…...

python一些进阶用法:hook 钩子函数以及Registry机制

写在前面 一句话讲&#xff0c;register机制 和 hook 都是函数/类 调用和传参机制的一种灵活运用&#xff0c;将函数作为传参对象&#xff0c;进行回调和封装&#xff0c;通常扩展了或修改了原始函数的行为&#xff1b;这些高级用法都是编程经验中沉淀下来的常用范式&#xff0…...

工作实践:11种API性能优化方法

一、索引优化 接口性能优化时&#xff0c;大家第一个想到的通常是&#xff1a;优化索引。 确实&#xff0c;优化索引的成本是最小的。 你可以通过查看线上日志或监控报告&#xff0c;发现某个接口使用的某条SQL语句耗时较长。 此时&#xff0c;你可能会有以下疑问&#xff…...

正版软件 | WIFbox:智能化文件管理工具,让效率与隐私并行

在数字化办公日益普及的今天&#xff0c;文件管理成为了提升工作效率的关键。WIFbox 一款智能文件管理工具&#xff0c;利用强大的人工智能技术&#xff0c;帮助您快速对文件进行分类&#xff0c;完成复杂的智能文件分类任务。 智能分类&#xff0c;效率倍增 WIFbox 通过精细化…...

Postman接口工具实战

为了更好地展示Postman接口测试的实战过程&#xff0c;我将以一个简单的实战示例来说明如何使用Postman完成一个API的测试。假设我们要测试一个假想的天气查询API&#xff0c;该API允许用户通过城市名查询天气情况。我们将执行以下步骤&#xff1a; 1. 准备工作 确保已经安装…...

江协科技51单片机学习- p17 定时器

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

【D3.js in Action 3 精译】前言

早在 2017 年&#xff0c;我还是一名渴望迈出职业生涯关键一步的前端开发者。虽然我很热衷于网站开发&#xff0c;但总感觉缺了点什么。我一直希望自己的工程专业背景和对教学的热爱能与新的编程技能相结合。就在这时&#xff0c;搭档建议我学学数据可视化。出于某种原因&#…...

Java SE入门及基础(58) 并发 进程与线程概念

目录 并发 进程和线程 1. 进程和线程 2. 进程 3.线程 总结 并发 并发(Concurrency) Computer users take it for granted that their systems can do more than one thing at a time. They assume that they can continue to work in a word processor, while other app…...

放松一下,简简单单了

哈哈哈哈哈...

【智能制造-5】数采和电机

既然可以采集PLC的数据&#xff0c;为什么要采集电机的数据&#xff1f; 采集PLC&#xff08;可编程逻辑控制器&#xff09;的数据和采集电机的数据是两个不同的概念和目的。 PLC是用于控制和监控工业自动化过程的设备&#xff0c;它可以接收传感器的输入信号并根据预设的逻辑…...

【软考论文】论信息系统的安全性与保密性设计

目录 一、题目二、论文2.1 摘要2.2 正文三、扩展3.1 信息安全包括5个基本要素3.2 国产秘钥算法3.3 等保(信息安全等级保护)3.4 其他一、题目 在企业信息化推进的过程中,需要建设许多信息系统,这些系统能够实现高效率、低成本的运行,为企业提升竞争力。但在设计和实现这些…...

【图文教程】电脑查看显卡GPU温度方法:小白也能秒懂!

在电脑操作中&#xff0c;显卡是电脑的重要组件之一&#xff0c;其温度控制对于保持系统稳定运行是特别重要的。但是&#xff0c;许多新手用户不知道要怎么操作才能查看电脑显卡CPU的温度&#xff1f;接下来小编给大家介绍三种简单有效的查看显卡温度方法&#xff0c;操作简单&…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...