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

C语言 扫雷程序设计

目录

1.main函数

2.菜单打印menu函数

3.游戏game函数

4.宏定义

5.界面初始化

6.打印界面

7.设置雷

8.统计排查坐标周围雷的个数

9.排查雷

10.总代码

test.c代码

game.h代码

game.c代码

结语:


一个简单的扫雷游戏,通过宏定义可以修改行列的大小以及雷的数量,通过输入坐标选择要排查的位置。

1.main函数

int main()
{//设置随机数的生成srand((unsigned int)time(NULL));int input = 0;do{printf("扫雷游戏\n");menu();printf("请选择(1/0):>");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");default:printf("输入错误\n");}}while (input);return 0;
}

2.菜单打印menu函数

//打印菜单
void menu()
{printf("******************\n");printf("*****  1.play  ***\n");printf("*****  0.exit  ***\n");printf("******************\n");}

3.游戏game函数

void game()
{//布置好雷的信息char mine[ROWS][COLS] = {0};//排查出雷的信息char show[ROWS][COLS] = {0};//初始化数组的内容为指定内容//mine数组在没有布置雷的时候,都是‘0’board_Init(mine,ROWS,COLS,'0');//show数组在没有排查雷的时候都是‘*’board_Init(show,ROWS,COLS,'*');//打印数组//Display_board(mine, ROW, COL);//Display_board(show, ROW, COL);//设置雷Set_mine(mine, ROW, COL);//Display_board(mine, ROW, COL);Display_board(show, ROW, COL);//排查雷Fine_Mine(mine, show, ROW, COL);}

4.宏定义

//设置行和列的大小
#define ROW 9
#define COL 9
//设置雷的数量
#define COUNT 80

5.界面初始化

初始化数组的内容为指定内容

mine数组在没有布置雷的时候,都是‘0‘

show数组在没有排查雷的时候都是‘*’

//数组初始化
void board_Init(char board[ROWS][COLS], int rows, int cols,char x)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = x;}}
}

6.打印界面

//打印数组
void Display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----扫雷游戏-----\n");printf("  ");for (j = 1; 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");}printf("-----扫雷游戏-----\n");printf("\n");}

7.设置雷

//设置雷
void Set_mine(char board[ROWS][COLS], int row, int col)
{//定义雷的数量int count = COUNT;//行1-9//列1-9while (count){int x = rand() % row + 1;//在一行中随机生成一个数int y = rand() % col + 1;//在一列中随机生成一个数if (board[x][y] == '0'){board[x][y] = '1';count--;}}}

8.统计排查坐标周围雷的个数

//统计排查坐标周围雷的个数
int get_mine_count(char board[ROWS][COLS], int x, int y)
{return board[x - 1][y - 1] +board[x - 1][y] +board[x - 1][y + 1] +board[x][y + 1] +board[x + 1][y + 1] +board[x + 1][y] +board[x + 1][y - 1] +board[x][y - 1] - 8 * '0';
}

9.排查雷

//排查雷
void Fine_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-COUNT){printf("请输入要排查的坐标>:");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != 'x'){printf("该坐标已被排查过了,不能重复排查\n");}else{//如果是雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");Display_board(mine, ROW, COL);break;}else//如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';//转换成数字字符Display_board(show, ROW, COL);}}}elseprintf("输入坐标非法,请重新输入\n");}if (win == row*col - COUNT){printf("恭喜你,排雷成功\n");Display_board(mine, ROW, COL);}
}

10.总代码

test.c代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"//打印菜单
void menu()
{printf("******************\n");printf("*****  1.play  ***\n");printf("*****  0.exit  ***\n");printf("******************\n");}
void game()
{//布置好雷的信息char mine[ROWS][COLS] = {0};//排查出雷的信息char show[ROWS][COLS] = {0};//初始化数组的内容为指定内容//mine数组在没有布置雷的时候,都是‘0’board_Init(mine,ROWS,COLS,'0');//show数组在没有排查雷的时候都是‘*’board_Init(show,ROWS,COLS,'*');//打印数组//Display_board(mine, ROW, COL);//Display_board(show, ROW, COL);//设置雷Set_mine(mine, ROW, COL);//Display_board(mine, ROW, COL);Display_board(show, ROW, COL);//排查雷Fine_Mine(mine, show, ROW, COL);}
int main()
{//设置随机数的生成srand((unsigned int)time(NULL));int input = 0;do{printf("扫雷游戏\n");menu();printf("请选择(1/0):>");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");default:printf("输入错误\n");}}while (input);return 0;
}

game.h代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
//设置行和列的大小
#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2//设置雷的数量
#define COUNT 10
//初始化数组
void board_Init(char mine[ROWS][COLS], int rows, int cols, char x);
//打印数组
void Display_board(char board[ROWS][COLS], int row, int col);
//设置雷
void Set_mine(char board[ROWS][COLS], int row, int col);
//排查雷
void Fine_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c代码

define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//数组初始化
void board_Init(char board[ROWS][COLS], int rows, int cols,char x)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = x;}}
}//打印数组
void Display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----扫雷游戏-----\n");printf("  ");for (j = 1; 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");}printf("-----扫雷游戏-----\n");printf("\n");}//设置雷
void Set_mine(char board[ROWS][COLS], int row, int col)
{//定义雷的数量int count = COUNT;//行1-9//列1-9while (count){int x = rand() % row + 1;//在一行中随机生成一个数int y = rand() % col + 1;//在一列中随机生成一个数if (board[x][y] == '0'){board[x][y] = '1';count--;}}}//统计排查坐标周围雷的个数
int get_mine_count(char board[ROWS][COLS], int x, int y)
{return board[x - 1][y - 1] +board[x - 1][y] +board[x - 1][y + 1] +board[x][y + 1] +board[x + 1][y + 1] +board[x + 1][y] +board[x + 1][y - 1] +board[x][y - 1] - 8 * '0';
}//排查雷
void Fine_Mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win<row*col-COUNT){printf("请输入要排查的坐标>:");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] != 'x'){printf("该坐标已被排查过了,不能重复排查\n");}else{//如果是雷if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");Display_board(mine, ROW, COL);break;}else//如果不是雷{win++;//统计mine数组中x,y坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count + '0';//转换成数字字符Display_board(show, ROW, COL);}}}elseprintf("输入坐标非法,请重新输入\n");}if (win == row*col - COUNT){printf("恭喜你,排雷成功\n");Display_board(mine, ROW, COL);}
}

结语:

技术有限可能有些BUG没有发现,可以往里面添点有意思的程序,比如弄个关机程序进去,扫到雷直接关机,那样会很酷吧

相关文章:

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…...

CSS语言的文件操作

CSS语言文件操作浅析 CSS&#xff08;层叠样式表&#xff09;是一种用于描述HTML文档表现的样式表语言。它负责设置网页的视觉效果&#xff0c;包括文字、颜色、布局等。然而&#xff0c;CSS不仅仅是用于修饰页面&#xff0c;它在现代开发中的作用正变得愈发重要。在本文中&am…...

前端-计算机网络篇

一.网络分类 1.按照网络的作用范围进行分类 &#xff08;1&#xff09;广域网WAN(Wide Area Network) 广域网的作用范围通常为几十到几千公里,因而有时也称为远程网&#xff08;long haul network&#xff09;。广域网是互联网的核心部分&#xff0c;其任务是长距离运送主机…...

行为分析:LSTM、3D CNN、SlowFast Networks。这三者的优缺点

在行为分析任务中&#xff0c;**LSTM**、**3D CNN** 和 **SlowFast Networks** 是三种常用的深度学习模型。它们各有优缺点&#xff0c;适用于不同的场景和需求。以下是它们的详细对比&#xff1a; --- ### **1. LSTM&#xff08;Long Short-Term Memory&#xff09;** LSTM …...

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务&#xff0c;解决屏幕录制音乐播放等操作不被挂起 一、前言 1.后台是什么&#xff1f; 了解后台任务和长时任务前&#xff0c;我们需要先明白鸿蒙的后台特性&#xff1a;所谓的后台&#xff0c;指的是设备返回主界面、锁屏、…...

STM32-WWDG/IWDG看门狗

WWDG/IWDG一旦开启不能关闭&#xff0c;可通过选项字节在上电时启动硬件看门狗&#xff0c;看门狗计数只能写入不能读取。看门狗启用时&#xff0c;T6bit必须置1&#xff0c;防止立即重置。 一、原理 独立看门狗-超时复位 窗口看门狗-喂狗&#xff08;重置计数器&#xff0c;…...

基于视觉惯性 SLAM(VSLAM)、相机和 IMU 数据的融合执行 6 自由度位姿跟踪

案例来源&#xff1a;https://spectacularai.github.io/docs/sdk/wrappers/oak.html 适配相机&#xff1a;带IMU的 OAK-D 系列相机 基于视觉惯性 SLAM&#xff08;VSLAM&#xff09;、相机和 IMU 数据的融合执行 6 自由度位姿跟踪 ~~~~~~~&#xff08;分界线&#xff09;~~~~~…...

Matlab仿真径向受压圆盘光弹图像

Matlab仿真径向受压圆盘光弹图像-十步相移法 主要参数 % 定义圆盘参数 R 15; % 圆盘半径&#xff0c;单位&#xff1a;mm h 5; % 圆盘厚度&#xff0c;单位&#xff1a;mm P 300; % 径向受压载荷大小&#xff0c;单位&#xff…...

网络安全抓包

#知识点&#xff1a; 1、抓包技术应用意义 //有些应用或者目标是看不到的&#xff0c;这时候就要进行抓包 2、抓包技术应用对象 //app,小程序 3、抓包技术应用协议 //http&#xff0c;socket 4、抓包技术应用支持 5、封包技术应用意义 总结点&#xff1a;学会不同对象采用…...

WebSocket 测试调试:工具与实践

在前五篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发、客户端实现、安全实践和性能优化。今天,让我们把重点放在测试和调试上,看看如何确保 WebSocket 应用的质量和可靠性。我曾在一个实时通讯项目中,通过完善的测试和调试策略,将线上问题的发现时间从小时级缩短到…...

ArmSoM RK3588/RK3576核心板,开发板网络设置

ArmSoM系列产品都搭配了以太网口或WIFI模块&#xff0c;PCIE转以太网模块、 USB转以太网模块等&#xff0c;这样我们的网络需求就不止是上网这么简单了&#xff0c;可以衍生出多种不同的玩法。 1. 网络连接​ 连接互联网或者组成局域网都需要满足一个前提–设备需要获取到ip&a…...

【学Rust开发CAD】1 环境搭建

文章目录 一、搭建C/C编译环境二、安装Rust三、配置 PATH 环境变量四、验证安装结果五、安装编辑工具 一、搭建C/C编译环境 Rust 的编译工具依赖 C 语言的编译工具&#xff0c;这意味着你的电脑上至少已经存在一个 C 语言的编译环境。如果你使用的是 Linux 系统&#xff0c;往…...

数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)

将有序数组转换为二叉搜索树 https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列请你将其转换为一棵 平衡 二叉搜索树 示例 1 输入&#xff1a;nums [-10,-3,0,5,9…...

Java 多线程之@Async

SpringBoot 中使用 Async 使用 Async 注解步骤&#xff1a; 添加 EnableAsync 注解。在主类上或者 某个类上&#xff0c;否则&#xff0c;异步方法不会生效 添加 Async注解。在异步方法上添加此注解。异步方法不能被 static 修饰需要自定义线程池&#xff0c;则可以配置线程池…...

代码随想录day38 动态规划6

题目&#xff1a;322.零钱兑换 279.完全平方数 139.单词拆分 多重背包 背包总结 需要重做&#xff1a;322&#xff0c;139 322. 零钱兑换 思路&#xff1a;零钱&#xff0c;可取多次-》完全背包。 注意&#xff1a; 五部&#xff1a; 1.dp[j]:价值为j的时候&#xff0c;最…...

LabVIEW无标题的模态VI窗口的白框怎么去除?

在LabVIEW中&#xff0c;如果你遇到无标题的模态&#xff08;modal&#xff09;VI窗口显示有一个白框&#xff0c;通常是由于VI界面的一些属性或者控件设置问题导致的。为了去除这个白框&#xff0c;可以尝试以下几种方法&#xff1a; 1. 检查VI窗口属性设置 确保你的VI窗口属…...

iOS - 原子操作

在 Objective-C 运行时中&#xff0c;原子操作主要通过以下几种方式实现&#xff1a; 1. 基本原子操作 // 原子操作的基本实现 #if __has_feature(c_atomic)#define OSAtomicIncrement32(p) __c11_atomic_add((_Atomic(int32_t) *)(p), 1, __ATOMIC_RELAXED) #define …...

Go语言的语法

Go语言入门与实战 引言 在当今的开发环境中&#xff0c;随着互联网的快速发展&#xff0c;程序员们面临着越来越复杂的系统需求。针对这些需求&#xff0c;Go语言&#xff08;又称Golang&#xff09;作为一种新的编程语言应运而生。Go语言由Google开发&#xff0c;它具有简单…...

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…...

什么是 ES6 “模板语法” ?

ES6 提出了“模板语法”的概念。在 ES6 以前&#xff0c;拼接字符串是很麻烦的事情 var name css var career coder! var hobby [coding ,"writing] var finalString my name is name &#xff0c;I work as a career I love hobby[0] and hobby[1]仅仅几…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...