小游戏-扫雷

扫雷大多人都不陌生,是一个益智类的小游戏,那么我们能否用c语言来编写呢,

我们先来分析一下扫雷的运行逻辑,

首先,用户在进来时需要我们给与一个菜单,以供用户选择,

然后我们来完善一下,写出用户输入后对应要进行的内容,

game函数就是我们要写的扫雷的具体操作了,

首先我们来分析一下扫雷游戏的运行原理,

扫雷需要一个表格,可能是9*9,也可能是15*15,我们就拿9*9举例,

我们首先需要对这个9*9的表格进行埋雷,那用什么来代表我这个格子是不是雷呢,

我们可以用两个不同的字符来代替,我们假设’1‘为雷,’0‘没有雷,

转化为程序语言,表格我们用二维数组,埋雷用rand函数(rand函数在之前的文章中有讲述,没有学过的同学可以看一下,在“小游戏-猜数字”中)。

下面是我们的9*9棋盘,0代表还没有埋雷,

000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000
000000000

下面我们随即在其中埋几个雷,

000000000
000101000
010000000
000100000
000000000
001010001
000000000
000010000
001000000

雷埋好了,我们就要开始排雷了,

假如用户点击这个格子,如果没有雷,我们显示周围八个格子中的雷的数量,有雷的话,我们结束游戏,并展示我们埋的雷的情况,

这个格子周围有两个雷,那么我们在这个格子显示为2,

下面,用户继续点击其他格子进行排雷,

这个格子改为1,这个时候就会发现问题

如果用户接下来选择红色格子怎么办,灰色格子是我们更改后的雷的数量,并不代表这里有雷,这里就出现歧义了,那么我们现在应该怎么办呢?我们可以另外开辟一个表格来存放用户扫雷得到的信息,

设置数组大小的时候我们要注意一个点,当用户点到边缘的格子时,周围就不是八个格子了,这时我们去访问就会有越界的情况出现,

那这个时候我们应该怎么办呢,

我们可以在外面再加一圈,变成11*11的表格,但是在埋雷和让用户选择的时候不使用最外层,

00000000000
00000000000
00001010000
00100000000
00001000000
00000000000
00010100010
00000000000
00000100000
00010000000
00000000000

这个时候我们再去访问就不会有越界的情况了,而且在查雷的数量时,也不会有影响,

分析的差不多了,那么我们现在来把想法转换成代码,

我们新建两个文件,一个头文件,一个.c文件,我们声明两个变量放在.h头文件中,

那么我们想要在源.c中用的话就要在源.c中包含头文件#include“扫雷.h",同时我们设置出两个数组,

这里有疑问的朋友可以浏览一下我上面发布的那篇文章(文章标题:”在面对一个大型的代码,需要分文件编写的时候,应该怎么办呢;以及在编写出一个功能时,有人想要买这个功能,怎么在不给出源代码的情况下让买家可以使用这个代码功能呢?”),

下面我们开始埋雷,埋雷前,我们把两个数组初始化,下面的代码要注意都是写在了哪个文件中,

下面我将不再特意标明代码所处文件了,

初始化好后,我们开始随机埋雷,

雷布置完了,现在需要用户进行扫雷,但是扫之前,我们得让用户有选项来选择吧,我们把show棋盘打印给用户,

下面排查雷,

下面我们把游戏放到循环里,

下面我们把小错误改一下,并且完善一下我们的代码,

//源.c:
#define _CRT_SECURE_NO_WARNINGS 1#include "扫雷.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棋盘埋好雷,show棋盘显示*//初始化mine棋盘//InitMine(mine, ROWS, COLS);//InitMine(show, ROWS, COLS);//在上面的代码中多增加一个实参,用于说明要初始化的内容InitMine(mine, ROWS, COLS,'0');InitMine(show, ROWS, COLS,'*');//打印show棋盘//Print(show, ROW, COL);//观察代码是否有问题//布置雷DisPlayBoard(mine, ROW, COL);//Print(mine, ROW, COL);Print(show, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}int main()
{int input = 0;srand((unsigned int)time(NULL));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);
}
//扫雷.h:
#pragma once#include<stdio.h>#define EASY_COUNT 10//雷的数量#define ROW 9 //雷的行
#define COL 9 //雷的列//防止访问时越界
#define ROWS ROW+2 
#define COLS COL+2 //棋盘初始化
void InitMine(char board[ROWS][COLS], int rows, int cols,char set);//打印棋盘
void Print(char board[ROWS][COLS], int row, int col);//布置雷
void DisPlayBoard(char board[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//扫雷.c:
#define _CRT_SECURE_NO_WARNINGS 1#include"扫雷.h"//初始化mine棋盘均为字符‘0’
void InitMine(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 Print(char board[ROWS][COLS], int row, int col)
{//打印列号for (int i = 0; i <= row; 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",board[i][j]);}printf("\n");}
}//布置雷
void DisPlayBoard(char board[ROWS][COLS], int row, int col)
{int x = 0, y = 0;//代表布置雷的横纵坐标for (int i = 1; i <= EASY_COUNT; i++){x = rand() % ROW + 1;y = rand() % COL + 1;if (board[x][y] == '1'){i--;}board[x][y] = '1';}
}//排查雷int 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][y + 1] + board[x + 1][y - 1]+ board[x + 1][y] + board[x + 1][y + 1]- 8 * '0'; //这里将字符转化为数值
}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{//for (int i = 1; i <= row * col - EASY_COUNT; i++)int i = row * col - EASY_COUNT;while(i){printf("请输入要排查雷的坐标:>");int x = 0, y = 0;scanf("%d%d", &x, &y);if (x <= row && y <= col && x>=1 && y>=1){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");break;}else{//统计mine中这个坐标周围有几个雷int count = Count(mine, x, y);show[x][y] = count + '0';//转化为字符Print(show, ROW, COL);i--;}}else{printf("请输入正确的坐标\n");}}if (i == 0){printf("恭喜你!\n");}Print(mine, ROW, COL);
}

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

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

相关文章

Vue 实现带拖动功能的时间轴

1.效果图 2. 当使用timeline-slider-vue组件时&#xff0c;你可以设置以下属性&#xff1a; date&#xff1a;用于设置时间轴滑块的初始日期&#xff0c;格式通常为 YYYY-MM-DD。 mask&#xff1a;一个布尔值&#xff0c;用于控制是否显示背景遮罩。 markDate&#xff1a;一…

Java 面试宝典:什么是大 key 问题?如何解决?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 本文已收录到我的技术网站&#xff1a;https://skjava.com。有全网最优质的系列文章、Java 全栈技术文档以及大厂完整面经 回答 Redis 大 key 问题是指某个 key 对应的 value 值很大&am…

C语言——sizeof与strlen的对比

一.sizeof 我们在学习操作符的时候&#xff0c;就了解到了sizeof操作符&#xff0c;它的作用是求参数所占内存空间的大小&#xff0c;单位是字节。如果参数是一个类型&#xff0c;那就返回参数所占的字节数。 #include <stdio.h>int main() {int a 10;size_t b sizeo…

Mamba 基础讲解【SSM,LSSL,S4,S5,Mamba】

文章目录 Mamba的提出动机TransformerRNN Mama的提出背景状态空间模型 (The State Space Model, SSM)线性状态空间层 (Linear State-Space Layer, LSSL)结构化序列空间模型 &#xff08;Structured State Spaces for Sequences, S4&#xff09; Mamba的介绍Mamba的特性一&#…

美团2024届秋招笔试第二场编程真题

要么是以0开头 要么以1开头 选择最小的答案累加 import java.util.Scanner; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和…

C# 右键快捷菜单(上下文菜单)的两种实现方式

在C#中&#xff0c;ContextMenuStrip是一种用于创建右键菜单的控件。它提供了一种方便的方式来为特定的控件或窗体添加自定义的上下文菜单选项。有两种实现方式&#xff0c;如下&#xff1a; 一.通过ContextMenuStrip控件实现 1.从工具箱中拖一个ContextMenuStrip控件到窗体上…

LLM - 大语言模型的分布式训练 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136924304 大语言模型的分布式训练是一个复杂的过程&#xff0c;涉及到将大规模的计算任务分散到多个计算节点上。这样做的目的是为了处…

领域、系统和组织-《实现领域驱动设计》中译本评点-第2章(4)

相关链接 DDD领域驱动设计批评文集>> 汪峰哭晕在厕所-《实现领域驱动设计》中译本评点-第2章&#xff08;1&#xff09; 可不是乱打的-《实现领域驱动设计》中译本评点-第2章&#xff08;2&#xff09; “领域”的错误定义-《实现领域驱动设计》中译本评点-第2章&…

Tomcat介绍,Tomcat服务部署

目录 一、Tomcat 介绍 二、Tomcat 核心技术和组件 2.1、Web 容器&#xff1a;完成 Web 服务器的功能 2.2、Servlet 容器&#xff0c;名字为 catalina&#xff0c;用于处理 Servlet 代码 2.3、JSP 容器&#xff1a;用于将 JSP 动态网页翻译成 Servlet 代码 Tomcat 功能组件…

Window全网解析网站下载视频

全网解析网站下载视频 介绍m3u8格式cbox格式 解析视频下载的方法方法一解析视频下载视频 方法二老王浏览器下载使用浏览器解析下载视频 总结 介绍 今天分享一下如何解析网页中的视频进行下载。通常情况下我们打开的某某网站的视频是不提供下载接口的&#xff0c;甚至说你下载了…

ClickHouse--11--物化视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.物化视图什么是物化视图? 1.1 普通视图1.2 物化视图1.3 优缺点1.4 基本语法1.5 在生产环境中创建物化视图1.6 AggregatingMergeTree 表引擎3.1 概念3.2 Aggregat…

面试算法-87-分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …

【JAVA】通过JAVA实现用户界面的登录

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

Linux系统——硬件命令

目录 一.网卡带宽 1.查看网卡速率——ethtool 网卡名 2.查看mac地址——ethtool -P 网卡名 二、内存相关 1.显示系统中内存使用情况——free -h 2.显示内存模块的详细信息——dmidecode -t memory 三、CPU相关 1.查看CPU架构信息——lscpu 2.性能模式 四、其他硬件命…

C语言字节对齐关键字#pragma pack(n)的使用

0 前言 在进行嵌入式开发的过程中&#xff0c;我们经常会见到对齐操作。这些对齐操作有些是为了便于实现指针操作&#xff0c;有些是为了加速对内存的访问。因此&#xff0c;学习如何使用对齐关键字是对于嵌入式开发是很有必要的。 1 对齐规则 1.0 什么叫做对齐 众所周知&a…

牛客NC170 最长不含重复字符的子字符串【高频 中等 map、滑动窗口 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/48d2ff79b8564c40a50fa79f9d5fa9c7 思路 用一个hashmap记录每个字母的index如果这个字母已经在map里了说明已经有重复了这样就更新看这个字母上次出现的index需要注意的是这种情况&#xff1a;“bacbca”这里的a…

PCB中常用电子器件封装学习——【一网打尽】

‘ 上图是这个世界上大概所有的封装种类&#xff0c;当然我们日常硬件电路设计肯定用不到这么多&#xff0c;接下来我将介绍几种工程上常用的封装&#xff0c;配以图片方便大家理解学习。在电子器件选型的时候&#xff0c;避免选择到一些非常难以焊接的封装电子器件。

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用&#xff1a;https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后&#xff0c;需要将安装目录添加到环境变…

Jenkins的快速入门

文章目录 一、Jenkins是什么&#xff1f;二、Jenkins安装和持续集成环境配置1.持续集成流程说明2.Gitlab代码托管服务器安装Gitlab简介&#xff1a;Gitlab安装Gitlab的使用切换中文添加组创建用户将用户添加到组创建项目idea中代码上传Gitlab 3.Jenkins持续集成环境服务器安装J…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…