C语言实现扫雷

今天用C语言写一个扫雷的代码

扫雷其实和我们之前写的三子棋有点相似,首先是打印菜单,进行选择

我们还是像之前一样有三个文件,一个是game.h game.c test.c

test.c实现我们的扫雷逻辑

gam.c实现我们的游戏需要的函数

game.h来声明

那么我们首先应该有个菜单,并进行选择

void menu()
{printf("************************\n");printf("*******  1. Play  ******\n");printf("*******  0. Exit  ******\n");printf("************************\n");
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("扫雷游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);   //进入循环的条件是input为真return 0;
}

下一步就是如何实现这个逻辑,那我们需要一个game函数里写下我们的创建过程

第一步来初始化棋盘

//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}

第二部我们应该打印我们的棋盘

//打印棋盘
void PrintfBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("****** 扫雷 ******\n");for (i = 0; i <= row; i++){printf("%d ", i);}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 SetMine(char mine[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int count = EASY_COUNT;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}

布置雷之后,就是应该想我们输入坐标来排雷

//统计雷的个数
int GetMineCount(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 FindMine(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 - EASY_COUNT){printf("请输入你要排查的坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,游戏失败\n");PrintfBoard(mine, ROW, COL);break;}else{//统计雷的个数int ret = GetMineCount(mine, x, y);show[x][y] = ret + '0';PrintfBoard(show, ROW, COL);win++;}}else{printf("该坐标已被排查,请重新输入:\n");}}else{printf("输入错误,请重新输入:\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!\n");PrintfBoard(mine, ROW, COL);}
}

完整代码

game.h

#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 InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void PrintfBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//统计雷的个数
int GetMineCount(char mine[ROWS][COLS], int x, int y);

game.c

#define _CRT_SECURE_NO_WARNINGS 1//源文件game.c
#include "game.h"//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘
void PrintfBoard(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("****** 扫雷 ******\n");for (i = 0; i <= row; i++){printf("%d ", i);}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 SetMine(char mine[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int count = EASY_COUNT;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}
//统计雷的个数
int GetMineCount(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 FindMine(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 - EASY_COUNT){printf("请输入你要排查的坐标");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,游戏失败\n");PrintfBoard(mine, ROW, COL);break;}else{//统计雷的个数int ret = GetMineCount(mine, x, y);show[x][y] = ret + '0';PrintfBoard(show, ROW, COL);win++;}}else{printf("该坐标已被排查,请重新输入:\n");}}else{printf("输入错误,请重新输入:\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!\n");PrintfBoard(mine, ROW, COL);}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void game()
{//创建一个二维数组用来放置我们排雷时所看到的棋盘//再创建一个二维数组用来布置雷char mine[ROWS][COLS] = { 0 };   //用来显示雷的位置char show[ROWS][COLS] = { 0 };   //用来排雷//初始化棋盘InitBoard(mine, ROWS, COLS, '0');InitBoard(show, ROWS, COLS, '*');//打印棋盘PrintfBoard(show, ROW, COL);//PrintfBoard(mine, ROW, COL);//布置雷SetMine(mine, ROW, COL);PrintfBoard(mine, ROW, COL);//排雷FindMine(mine, show, ROW, COL);
}void menu()
{printf("************************\n");printf("*******  1. Play  ******\n");printf("*******  0. Exit  ******\n");printf("************************\n");
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("扫雷游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);   //进入循环的条件是input为真return 0;
}

主要是分享一个扫雷的代码,讲解并不是特别多,谢谢大家

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

轻量级Web报表工具ActiveReportsJS全新发布v4.0,支持集成更多前端框架!

ActiveReportsJS 是一款基于 JavaScript 和 HTML5 的轻量级Web报表工具&#xff0c;采用拖拽式设计模式&#xff0c;不需任何服务器和组件支持&#xff0c;即可在 Mac、Linux 和 Windows 操作系统中&#xff0c;设计多种类型的报表。ActiveReportsJS 同时提供跨平台报表设计、纯…

将Python远控隐藏在文档图片中的行动分析

1、概述 ** **近日&#xff0c;安天CERT通过网络安全监测发现了一起恶意文档释放Python编写的远控木马事件。通过文档内容中涉及的组织信息和其中攻击者设置的诱导提示&#xff0c;安天CERT判断该事件是一起针对阿塞拜疆共和国国家石油公司进行的定向攻击活动。此次事件中&…

godot引擎c++源码深度解析系列二

记录每次研究源码的突破&#xff0c;今天已经将打字练习的功能完成了一个基本模型&#xff0c;先来看下运行效果。 godot源码增加打字练习的demo 这个里面需要研究以下c的控件页面的开发和熟悉&#xff0c;毕竟好久没有使用c了&#xff0c;先来看以下代码吧。 //第一排 显示文本…

13、ffmpeg使用nvidia显卡对OAK深度相机进行解码和编码

基本思想&#xff1a;简单使用nvidia的硬件解码进行oak相机的编码和解码学习 一、在本机rtx3060配置好显卡驱动和cuda之后进行下面操作50、ubuntu18.04&20.04CUDA11.1cudnn11.3TensorRT7.2/8.6Deepsteam5.1vulkan环境搭建和YOLO5部署_ubuntu18.04安装vulkan_sxj731533730的…

README.md 文档使用 treer 生成树形项目结构

一、前言 前后端编写 README.md 文档的时候&#xff0c;常常需要描写项目的结构&#xff0c;使用 tree 命令生成的目录又不能忽略某个目录&#xff0c;不方便。后来我找到了可以忽略某些目录的 treer命令 &#xff0c;特此记录一下: 二、使用 treer 生成项目结构 全局安装tr…

Redis 基础知识和核心概念解析:探索 Redis 的数据结构与存储方式

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

攻略|如何成为Moonbeam收集人

Moonbeam与其他PoS机制EVM公链类似&#xff0c;仰赖节点的运营保持网络的顺利运行以及安全。Moonbeam作为同时兼容Substrate和以太坊API的开发平台&#xff0c;同以太坊主网相比仍存在差异。 在Moonbeam的生态中&#xff0c;节点运营者被称为收集人&#xff0c;负责收集来自Mo…

SQLite的应用

2023年7月27日 据我所知&#xff0c;使用了SQLite数据库的软件有&#xff1a; 火狐浏览器Joplin 火狐浏览器 火狐浏览器用SQLite数据库来存储历史记录、访问过的网址等。 Joplin Joplin是GitHub上一个很火的开源记事本软件&#xff0c; Joplin用SQLite来存储笔记里面的文…

Python-Go python模块与包 - GO问题 - GO容量测试

目录 go 模块与包复习&#xff08;Init函数 - go mod&#xff09; init函数有什么用&#xff1f;init函数是什么&#xff1f; go.mod文件是什么&#xff1f;有什么作用&#xff1f; python的模块与包 python中包的分类 1、内置模块&#xff1a;不需要安装&#xff0c;直接…

前端工作中常用 CSS 知识点整理

1.1文字溢出省略号 文字单行溢出: overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 多行文字溢出: overflow: hidden; // 溢出隐藏 text-overflow: …

C# 反汇编 dnSpy

反汇编工具&#xff1a;dnSpy 常见问题&#xff1a; 1、遇到反汇编结果为<PrivateImplementationDetails>&#xff0c;报错不能有尖括号。解决方法&#xff0c;在dnSpy中复制出这个类&#xff0c;就可以去掉尖括号去使用了。 2、componentResourceManager&#xff0c;…

Java电子招投标采购系统源码-适合于招标代理、政府采购、企业采购

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看…

【简单认识MySQL主从复制与读写分离】

文章目录 一、MySQL主从复制1、配置主从复制的原因&#xff1a;2、主从复制原理1、 MySQL的复制类型2、 MySQL主从复制的工作过程;1、 MySQL主从复制延迟2、优化方案&#xff1a;3、 MySQL 有几种同步方式&#xff1a; 三种4、异步复制&#xff08;Async Replication&#xff0…

【宝藏系列】20个常用的Python技巧

【宝藏系列】20个常用的Python技巧 文章目录 【宝藏系列】20个常用的Python技巧&#x1f349;文末推荐【Python之光】 Python的可读性和简单性是其广受欢迎的两大原因&#xff0c;本文介绍20个常用的Python技巧来提高代码的可读性&#xff0c;并能帮助你节省大量时间&#xff0…

springboot整合ELK+kafka采集日志

一、背景介绍 在分布式的项目中&#xff0c;各功能模块产生的日志比较分散&#xff0c;同时为满足性能要求&#xff0c;同一个微服务会集群化部署&#xff0c;当某一次业务报错后&#xff0c;如果不能确定产生的节点&#xff0c;那么只能逐个节点去查看日志文件&#xff1b;lo…

工业自动化数据485采集网关支持modbus协议

S475/S475E系列是一种功能丰富的设备&#xff0c;支持多种通信方式和输入输出功能。以下是对其功能的详细介绍&#xff1a; 通信方式&#xff1a; S475/S475E系列支持多种通信方式&#xff0c;包括短信、RS485、语音拨号、GPRS/3G/4G无线数据网络四种告警方式。这意味着用户可…

菜鸟编程-python-面向对象

目录 Python 面向对象 面向对象技术简介 创建类 self代表类的实例,而非类 创建实例对象

AXI协议之AXILite开发设计(二)

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 二、AXI-Lite关键代码分析 1、时钟与…

营销系统积分数据库设计

营销系统总体数据-业务功能模型 在当今日益竞争的市场中&#xff0c;如何提高客户留存率和忠诚度&#xff0c;已成为各大企业迫切需要解决的问题。而积分商城/系统作为一种新型的营销方式&#xff0c;受到青睐。 积分商城/系统是指将用户在使用产品或服务时产生的积分&#xf…

X - Transformer

回顾 Transformer 的发展 Transformer 最初是作为机器翻译的序列到序列模型提出的&#xff0c;而后来的研究表明&#xff0c;基于 Transformer 的预训练模型&#xff08;PTM&#xff09; 在各项任务中都有最优的表现。因此&#xff0c;Transformer 已成为 NLP 领域的首选架构&…