【C语言】扫雷【附源码】

一、扫雷游戏规则

       尽快找到雷区中的所有不是地雷的格子,而不许踩到地雷。点开的数字是几,则说明该数字旁边的8个位置中有几个雷,如果挖开的是地雷,则会输掉游戏。

二、代码思路:

  • 宏定义

    • RowCol 定义了棋盘的行数和列数。
    • RowsCols 分别定义了棋盘数组的行数和列数,多出来的两行两列是为了在棋盘的四周留出空白区域。
    • EASY 定义了简单难度下的地雷数量。
  • 函数原型

    • InitBoard():初始化棋盘函数原型,用于在程序的其他地方实现初始化棋盘的功能。
    • DisplayBoard():打印棋盘函数原型,用于在程序的其他地方实现打印棋盘的功能。
    • SetMine():布置地雷函数原型,用于在程序的其他地方实现布置地雷的功能。
    • FindMine():找地雷函数原型,用于在程序的其他地方实现找地雷的功能。
  • 菜单函数 menu()

    •  这个函数用于显示游戏的菜单界面,提供了两个选项:开始游戏和退出游戏。 
    void menu() {printf("*****************************\n");printf("*****************************\n");printf("***********1.play************\n");printf("***********0.exit************\n");printf("*****************************\n");printf("*****************************\n");printf("*****************************\n");}

  • 主函数 main()

    • main() 函数中,首先声明了一个整型变量 input,用于接收用户的输入选项。
    • 进入一个 do-while 循环,这个循环会一直执行,直到用户选择退出游戏(输入 0)。
    • 在循环内部,首先调用 menu() 函数显示菜单界面,然后通过 scanf() 函数获取用户的选择,并存储在 input 变量中。
    • 使用 switch 语句根据用户的选择执行相应的操作:
      • 如果用户选择 1,则调用 game() 函数开始游戏。
      • 如果用户选择 0,则打印消息表示退出游戏。
      • 如果用户输入其他数字,则提示用户重新选择。
    • 循环条件是 input != 0,即只要用户不选择退出游戏,就会一直循环显示菜单。
    int main()
    {srand((unsigned int)time(NULL));int input = 0;do {menu();printf("请选择:");scanf("%d", &input);switch (input) {case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入错误请重新输入");break;}} while (input);return 0;
    }

  • 游戏函数 game()

    • 这个函数负责实现扫雷游戏的核心逻辑。
    • 首先声明了两个二维字符数组 mineshow,用于存储扫雷棋盘的地雷分布情况和显示给玩家的棋盘情况。
    • 调用 InitBoard() 函数初始化两个棋盘。
    • 调用 SetMine() 函数设置地雷的位置。
    • 调用 DisplayBoard() 函数显示初始的棋盘给玩家。
    • 最后调用 FindMine() 函数开始游戏,排查地雷并更新显示给玩家的棋盘。
    void game() {char mine[Rows][Cols];char show[Rows][Cols];InitBoard(mine, Rows, Cols, '0');InitBoard(show, Rows, Cols, '*');DisplayBoard(mine, Row, Col);DisplayBoard(show, Row, Col);SetMine(mine, Row, Col);//DisplayBoard(mine, Row, Col);FindMine(mine, show, Row, Col);
    }

  • InitBoard() 函数
  • 用于初始化棋盘,将棋盘的每个格子都设置为指定的字符 set
  • 参数 rowscols 分别表示棋盘的行数和列数。
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;}}
}

 

  • DisplayBoard() 函数

    1. 用于显示棋盘的当前状态,包括地雷和已经排查的区域。
    2. 打印出棋盘的行号和列号,以及对应位置的字符。
    3. 参数 rowcol 表示棋盘的行数和列数。
void DisplayBoard(char board[Rows][Cols], int row, int col) {int i = 0;int j = 0;printf("----------  扫雷 -----------\n");for (i = 0; i <= col; 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");}printf("----------  扫雷 -----------\n");
}

 

  • SetMine() 函数

    1. 用于设置地雷在棋盘上的位置。
    2. 参数 rowcol 分别表示棋盘的行数和列数。
    3. 使用 rand() 函数生成随机数,随机设置地雷的位置。
    4. count 变量表示地雷的数量,根据不同的难度(这里是简单难度)来设置地雷的数量。
void SetMine(char board[Rows][Cols], int row, int col) {int count = EASY;while (count) {int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0') {board[x][y] = '1';count--;}}
}
  • GetMineCount() 函数

    1. 用于统计某个位置周围地雷的数量。
    2. 参数 xy 表示要统计的位置坐标。
    3. 遍历该位置周围的八个方向,统计周围地雷的数量。
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';
}
  • FindMine() 函数

    1. 实现了玩家排雷的过程。
    2. 使用 while 循环,直到排查完所有非地雷的位置或者踩到地雷为止。
    3. 每次循环提示玩家输入坐标,然后判断该位置是否有地雷。
    4. 如果踩到地雷,则游戏失败,显示所有地雷的位置。
    5. 如果没有踩到地雷,则统计周围地雷的数量,并更新显示给玩家的棋盘。
    6. 循环结束后,根据游戏是否成功来显示相应的消息
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) {printf("请输入坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col) {if (mine[x][y] == '1') {printf("炸死了\n");DisplayBoard(mine, Row, Col);break;}else//统计周围有几个地雷{int sum = GetMineCount(mine, x, y);show[x][y] = sum + '0';//1+'0'='1'DisplayBoard(show, Row, Col);win++;}}else {printf("坐标错误重新输入");}}if (win == Row * Col - EASY) {printf("恭喜你排雷成功");DisplayBoard(mine, Row, Col);}
}

三、完整代码

        test.c

        

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu() {printf("*****************************\n");printf("*****************************\n");printf("***********1.play************\n");printf("***********0.exit************\n");printf("*****************************\n");printf("*****************************\n");printf("*****************************\n");}
void game() {char mine[Rows][Cols];char show[Rows][Cols];InitBoard(mine, Rows, Cols, '0');InitBoard(show, Rows, Cols, '*');DisplayBoard(mine, Row, Col);DisplayBoard(show, Row, Col);SetMine(mine, Row, Col);//DisplayBoard(mine, Row, Col);FindMine(mine, show, Row, Col);
}
int main()
{srand((unsigned int)time(NULL));int input = 0;do {menu();printf("请选择:");scanf("%d", &input);switch (input) {case 1:game();break;case 0:printf("退出游戏");break;default:printf("输入错误请重新输入");break;}} while (input);return 0;
}

        game.c

#define _CRT_SECURE_NO_WARNINGS 1
#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 DisplayBoard(char board[Rows][Cols], int row, int col) {int i = 0;int j = 0;printf("----------  扫雷 -----------\n");for (i = 0; i <= col; 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");}printf("----------  扫雷 -----------\n");
}
void SetMine(char board[Rows][Cols], int row, int col) {int count = EASY;while (count) {int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] == '0') {board[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) {printf("请输入坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col) {if (mine[x][y] == '1') {printf("炸死了\n");DisplayBoard(mine, Row, Col);break;}else//统计周围有几个地雷{int sum = GetMineCount(mine, x, y);show[x][y] = sum + '0';//1+'0'='1'DisplayBoard(show, Row, Col);win++;}}else {printf("坐标错误重新输入");}}if (win == Row * Col - EASY) {printf("恭喜你排雷成功");DisplayBoard(mine, Row, Col);}
}

        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 EASY 10
void InitBoard(char board[Rows][Cols], int rows, int cols, char set);//初始化棋盘
void DisplayBoard(char board[Rows][Cols], int row, int col);//打印棋盘
void SetMine(char board[Rows][Cols], int row, int col);//布置地雷
void FindMine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col);//找地雷

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

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

相关文章

VR在线招聘会在企业与毕业生间搭建沟通新平台

在数字化转型的浪潮中&#xff0c;VR在线招聘会作为一种创新的招聘方式&#xff0c;正逐步成为连接企业、学校和毕业生的重要桥梁。 一、VR在线招聘会的实际意义及其优势 VR技术的应用&#xff0c;让在线招聘会超越了传统线上招聘的局限&#xff0c;提供了更为生动、互动的招聘…

【Redis系列】Spring Boot 集成 Redis 实现缓存功能

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

京东详情API接口请求代码源码(java)

京东详情API接口是用于获取京东商品详细信息的接口&#xff0c;它允许开发者通过发送请求&#xff0c;获取商品的描述、价格、评价等信息。下面是一个关于京东详情API接口的示例文档&#xff0c;包括接口地址、请求参数、响应参数等内容。 京东详情API接口文档 接口地址&#x…

机器学习知识点

1鸢尾花分类 鸢尾花分类问题是一个经典的机器学习问题&#xff0c;旨在根据鸢尾花的花萼长度、花萼宽度、花瓣长度和花瓣宽度等特征&#xff0c;将鸢尾花分成三个品种&#xff1a;山鸢尾&#xff08;setosa&#xff09;、变色鸢尾&#xff08;versicolor&#xff09;和维吉尼亚…

使用 Go-Ora 连接到 Oracle 数据库

前文 《 一鍵啓動 Oracle 23c Free 》 介绍了如何使用容器技术快速拉起 Oracle 23c 数据库。 这个开发者版本可以很便捷的拉起、测试、销毁&#xff0c;对开发者是非常友好的。 本文将介绍如何使用 Go 语言构建项目&#xff0c;并连接到 Oracle 数据库。 Go 环境配置 本文使用的…

【数据结构与算法】:归并排序和计数排序

1. 归并排序 归并排序是一种效率仅次于快速排序的排序算法。它有非递归和递归两种实现方式(本文只讲述递归实现&#xff0c;非递归实现以后有专门的文章)。 其实&#xff0c;归并排序也叫外排序。它不仅可以对内存中的数据进行排序&#xff0c;还能对文件里的数据排序。 比如&…

LeetCode 使数组连续的最少操作数

地址&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;困难 题目描述&#xff1a;给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元素替换成 **任意 **整数。 如果 nums 满足以下条件&#xff0c;那么它是 连续的 &#x…

点击上传文件

一、页面样式&#xff1a; &#xff08;1&#xff09;点击前&#xff1a; &#xff08;2&#xff09;点击后&#xff1a; 设计&#xff1a;①自定义elementPlus图标&#xff1b;②使用Tooltip实现鼠标悬浮按钮上出现文字提示&#xff1b;③上传与更换的切换样式&#xff1b;…

Linux 性能分析工具大全

vmstat--虚拟内存统计 vmstat&#xff08;VirtualMeomoryStatistics&#xff0c;虚拟内存统计&#xff09;是 Linux 中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU 等的整体情况进行监视。vmstat 的常规用法&#xff1a;vmstat interval times 即每隔 interval 秒采…

从概念到实践:揭开枚举与联合体在数字化创新时代的神秘面纱

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 在编程的世界中&#xff0c;枚举和联合体是两种非常基础且重要的数据结构。它们各自具有独特的特点和用途&#xff0c;为程序员提供…

(一)基于IDEA的JAVA基础12

一维数组 为什么使用数组: 当我们需要存储一系列数据的时候&#xff0c;就需要用到数组&#xff0c;如果不使用数组&#xff0c;我们就要需要一个一个的去声明变量&#xff0c;这样浪费内存空间&#xff0c;同时效率低下。 什么是数组: 数组本身就是一个变量&#xff0c;只…

Redis从入门到精通(六)Redis实战(三)优惠券秒杀

↑↑↑下载测试项目原代码↑↑↑ 文章目录 前言4.3 优惠券秒杀4.3.1 数据表与实体类4.3.2 添加优惠券4.3.2.1 添加普通券代码4.3.2.2 添加秒杀券代码 4.3.3 实现秒杀下单4.3.3.1 秒杀下单逻辑分析4.3.3.2 获取秒杀订单ID4.3.3.3 获取用户ID4.3.3.4 实现秒杀下单 前言 Redis实战…

diffusion model(十五) : IP-Adapter技术小结

infopaperhttps://arxiv.org/pdf/2308.06721.pdfcodehttps://github.com/tencent-ailab/IP-Adapterorg.Tencent AI Lab个人博客地址http://myhz0606.com/article/ip_adapter 1 Motivation 为了对文生图diffusion model进行特定概念的定制&#xff0c;常用LoRA[1]、textual in…

JDK下载及安装说明

1&#xff0e;JDK下载 访问oracle官网&#xff1a;http://www.oracle.com 在首页点击Downloads&#xff0c;进入oracle软件下载页。 在下载页面&#xff0c;点击Java。 选择Java (JDK) for Developers&#xff0c;点击。 在 Java SE Downloads 页面&#xff0c;点击中间的DO…

装机指导。

everything winrar snipaste cmake git tortoisegit tortoisesvn inno setup vs2022 安装的时候注意sdk路径一定要默认&#xff01;&#xff01; 否则你会发现在你的sdk安装路径的根盘符下会多出一个Windows Kits&#xff0c;强迫症接受不了 默认的会跟已有的装在一起…

【Python系列】读取 Excel 第一列数据并赋值到指定列

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux的学习之路:4、权限

一、Linux权限的概念 权限我们都熟悉&#xff0c;最常见的就是在看电视时需要vip这个就是权限&#xff0c;然后在Linux就是有两个权限&#xff0c;就是管理员也就是超级用户和普通的用户 命令&#xff1a;su [用户名] 功能&#xff1a;切换用户。 例如&#xff0c;要从root用户…

ZLMediaKit ubantu 下编译

1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu&#xff09;系统下安装依赖的方法&#xff1a; #除了…

Python-VBA函数之旅-ascii函数

ascii函数在Python中主要用于将对象(特别是字符和字符串)转换为它们的ASCII表示形式。这种转换在处理文本数据、调试代码以及确保文本以 ASCII 格式存储或传输时非常有用。常见应用场景有&#xff1a; 1、调试和文本处理&#xff1a;当处理包含非ASCII字符(如Unicode字符)的文…

景联文科技:为AI大模型提供高质海量训练数据

在全球AI浪潮的推动下&#xff0c;大量训练数据已成为AI算法模型发展和演进中的关键一环。 艾瑞咨询数据显示&#xff0c;包括数据采集、数据处理&#xff08;标注&#xff09;、数据存储、数据挖掘等模块在内的AI基础数据服务市场&#xff0c;将在未来数年内持续增长。 预计到…