初阶c语言:趣味扫雷游戏

目录

前言

 制作菜单

构建游戏选择框架

实现游戏功能

模块化编程:查看前节三子棋的内容

初始化雷区

​编辑

优化棋盘

随机埋入地雷

点击后的决策

 实现此功能代码

game();的安排


 

前言

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非地雷的格子,同时避免踩到地雷,踩到一个地雷全盘皆输。

玩家需要在雷区中,将所有地雷一一排查出来:9x9规格

      test.c  - - - -  测试游戏的逻辑

      game.c  - - - -  游戏代码的实现

      game.h  - - - -  游戏代码的声明 ( 函数声明,符号定义 )

 制作菜单

  在玩游戏时,我们在进入游戏都会有菜单选项,选择开始游戏,推出游戏等这些指令,说到选择,那么我们可以依据我们所学的循环和分支语句来先完成基本框架的设计。

首先我们进入游戏都是先显示选项,做出选择,并且在玩游戏时玩一局,还想玩怎么办(想一想我们前边的知识哪种结构符合先进入游戏出现菜单再循环这一需求)那肯定是do…while的循环结构更符合,那么我们就先使用函数来打印输出一个菜单选项

void menu()
{printf("*****************************\n");printf("*****************************\n");printf("**********1.play^************\n");printf("**********0.exit^************\n");//菜单printf("*****************************\n");printf("*****************************\n");
}int main()
{int a = 0;do{menu();printf("请选择:");scanf("%d",&a);}while();  
return 0;
}

构建游戏选择框架

游戏菜单已在屏幕上显示完成,现在需要完成选择,并且在玩游戏时玩一局,还想玩怎么办。

这时候需要应用博主之前阐述的switch语句来实现:


int main()
{int input = 0;do{menu();printf("PLEASE SELECT:");scanf("%d", &input);switch(input){case 1:game();    //以上为界面的选择break;case 0:printf("Exit\n");break;default:printf("ERRO,PLEASE CHOOSE AGAIN\n");break;}} while (input);//while循环可以利用0为假,其余为来实现用户可反复选择
//直到选到合适为止return 0;
}              

实现游戏功能

模块化编程:查看前节三子棋的内容


 test.c:是用来实现游戏逻辑    game.c:用来实现游戏功能的函数   game.h:用来申明游戏功能函数(可引用)

使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等!

此为game.h的文件

#pragma once
#define _CRT_SECURE_NO_WARNINGS//使用scanf函数的报错处理方式 
#include <stdio.h>//打印函数的使用工具箱
#include<Windows.h>//颜色函数和清屏指令的工具箱
#include<stdlib.h>//在使用rand的时候需要用到srand,	srand((unsigned int)time(NULL))随机函数,调用一次就可以
#include<time.h>
#define row 9//常量
#define col 9
#define cols col+2//定义常量
#define rows row+2
void initboard(char board[rows][cols],int hang, int lie,char set);//形参数
void displayboard(char board[rows][cols], int hang, int lie);//只设置9*9格子
void setmine(char board[rows][cols], int hang, int lie);//埋入地雷
void panduan(char show[rows][cols], char mine[rows][cols],int hang, int lie);

后边会逐个剖析 :

用来引用在test.c文件中

初始化雷区

首先映入眼帘的一定是 9×9 的雷区,这 81 个被遮盖的格子,

当我们随机的点击其中的格子时,会出现以下二种情况:

① 当翻开的格子是地雷时,玩家被炸“死”,游戏结束;

② 当翻开的格子不是地雷时,该格子会显示周围的 8 个格子存在的地雷的个数;

由图例可以得出结论,实现 9×9 的扫雷游戏,创建一个 9 行 9 列的二维数组并不合适。

既然对 9 行 9 列的二维数组的边界元素进行操作时,会导致数组越界访问,那我们干脆就直接将二维数组扩大一圈,将那些会导致越界访问的范围包括在数组内,从源头上解决问题,这是一个非常巧妙的办法!

所以需要设置两个数组(二维数组)

(1)一个为储存埋雷数据的(用于判断是否踩雷)

(2)一个为展示给玩家的棋盘(类似于上面的蓝色未知方块,点开后显示周围8格雷数)

需要将两个数组同时初始化initboard子函数

void initboard(char board[rows][cols], int hang, int lie,char set)
{int i = 0;int j = 0;for (i = 0; i < hang; i++){for (j = 0; j < lie; j++){board[i][j] = set;}}
}//initboard(mine, rows, cols, '0');//在test.c中引用的函数
//initboard(show, row, col, '*');

优化棋盘

由于雷区行号较长,所以需要给每行列标注序号displayboard子函数

void displayboard(char board[rows][cols], int hang, int lie)
{int i = 0;int j = 0; printf("---------------------------------------\n");for(j = 0; j <=lie; j++){printf("%d ",j);}printf("\n");for (i = 1; i <=hang; i++){printf("%d ", i);for (j = 1; j <=lie; j++){printf("%c ", board[i-1][j-1]);}printf("\n");}printf("---------------------------------------\n");
}	

 效果图

 

随机埋入地雷

应为此为9x9雷区,故10个雷足够。但怎么样实现随机在合适的区域内埋雷呢

C语言生成随机数的方法:

void setmine(char board[rows][cols], int hang, int lie)//随机埋入地雷
{int count = 10;while (count){int x = rand() % hang ;int y = rand() % lie ;if (board[x][y] == '0'){board[x][y] = '1';}count--;}}//srand((unsigned int)time(NULL));//布置雷的随机时间函数,在test.c主函数
中引用一次就够

点击后的决策

展开后周围多少雷 

在扫雷游戏中,当我们点击的方格不是地雷,且周围一片区域都没有地雷时,会直接展开一片雷区,具体效果如下图

 

扫雷游戏中,当玩家翻转一个方格时,若该方格不是地雷则会显示该方格周围 8 个方格存在的地雷个数。如果该方格周围 8 个坐标都不存在地雷时会将这 9 个方格都展开,以此类推直到遇到一个方格的周围 8 个方格存在地雷时停止展开,两种情况如下图所

 为实现这一功能,则需要我们遍历玩家输入的坐标的周围 8 个坐标,统计该坐标周围所存在的地雷个数。

int get_mine(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');//周围8个坐标相加
}

 

 

 实现此功能代码

void Mark(char board[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;while (1){printf("\n请输入要标记的坐标>>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col)       //判断玩家输入坐标是否合法{if (board[x][y] == '!')       //若坐标元素为 '!' 则表示该坐标已被标记过{printf("\n<该坐标已标记,无需重复标记,请重新输入>\n");}else       //该坐标未被标记{board[x][y] = '!';       //将 '!' 赋值给该坐标元素DisplayBoard(board, row, col);       //将标记地雷后的雷区展示于玩家break;}}else{printf("\n<坐标非法,请重新输入>\n\n");}}
}

game();的安排

void game()
{char mine[rows][cols] = { 0 };//存放雷的信息char show[rows][cols] = { 0 };//显示给玩家的游戏界面信息initboard(mine, rows, cols, '0');initboard(show, row, col, '*');//displayboard(mine, row, col);setmine(mine, row,col);displayboard(show, row, col);panduan(show,mine, row, col);
}

好了以上内容到今天就结束了希望大家多多支持!

其中一些内容借鉴了一些博主的,希望大家谅解。

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

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

相关文章

java八股文面试[JVM]——元空间

JAVA8为什么要增加元空间 为什么要移除永久代&#xff1f; 知识来源&#xff1a; 【2023年面试】JVM8为什么要增加元空间_哔哩哔哩_bilibili

Django 简易PACS读片系统

1、Django中写一个后端接口&#xff0c;给HTML提供dicom文件接口的方式 1、首先创建django项目 1、下载安装跨域的包 pip3 install django-cors-headers2、使用pycharm创建一个Django项目 3、点击创建在另一个窗口&#xff0c;这个都无所谓&#xff0c;怎么都行&#xff0c;…

Hadoop Yarn 配置多队列的容量调度器

文章目录 配置多队列的容量调度器多队列查看 配置多队列的容量调度器 首先&#xff0c;我们进入 Hadoop 的配置文件目录中&#xff08;$HADOOP_HOME/etc/hadoop&#xff09;&#xff1b; 然后通过编辑容量调度器配置文件 capacity-scheduler.xml 来配置多队列的形式。 默认只…

安防监控平台EasyCVR视频汇聚平台增加首页告警类型的详细介绍

安防监控/视频集中存储/云存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等…

基于智和网管平台的网络安全运维解决方案

随着信息技术的快速发展及网络应用的广泛普及&#xff0c;企业在享受网络技术带来便利的同时&#xff0c;也受到日益严重的网络安全威胁。未来&#xff0c;企业信息系统规模和复杂程度将不断增大&#xff0c;对信息通信技术的应用也将不断深入&#xff0c;网络安全运维将成为愈…

浅谈小程序开源业务架构建设之路

一、业务介绍 1.1 小程序开源整体介绍 百度从做智能小程序的第一天开始就打造真正开源开放的生态&#xff0c;我们的愿景是&#xff1a;定义移动时代最佳体验&#xff0c;建设智能小程序行业标准&#xff0c;打破孤岛&#xff0c;共建开源、开放、繁荣的小程序行业生态。百度智…

webrtc学习(七)-媒体协商

一.概述 媒体协商嘴主要的作用就是看通信双方都支持那些编解码器&#xff0c;这些编解码器又包含那些参数&#xff0c;比如音频的参数包括采样率&#xff0c;采样大小&#xff0c;通道数&#xff0c;对于视频的参数包括分辨率帧率等一系列参数&#xff0c;此外传输中用的payloa…

Linux 发行版 Debian 宣布支持龙芯 LoongArch 架构

近期&#xff0c;龙芯发布了 3A6000 桌面处理器&#xff0c;芯片的性能又一次大幅度提升&#xff0c;成为国产芯片的又一里程碑。 同期&#xff0c;LoongArch 架构的生态建设也迅速提升&#xff0c;开源网络引导固件 iPXE、QQ Linux 版、摩尔线程等软硬件都官宣支持龙芯 Loong…

VMware 修改ip地址 虚拟机静态ip设置 centos动态ip修改为静态ip地址 centos静态ip地址 vmware修改ip地址

虚拟机的centos服务器经常变换ip&#xff0c;测试起来有些麻烦&#xff0c;故将动态ip修改为静态ip 1. 查看vmware 虚拟机网络配置&#xff1a; 点击编辑&#xff0c;打开虚拟网络配置 2. 选中nat模式&#xff0c;点击nat设置&#xff0c;最终获取网关ip: 192.168.164.2 3. 进…

拒绝摆烂!C语言练习打卡第六天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

Golang struct 结构体注意事项和使用细节

结构体所有字段在内存当中是连续的 type Point struct {x, y int }type Rect struct {leftUp, rightDown Point }func main() {//r1会在内存当中有四个整数r1 : Rect{leftUp: Point{x: 1,y: 2,},rightDown: Point{x: 3,y: 4,},}//r1有四个int&#xff0c;在内存当中是连续分布的…

基于Java+SpringBoot+Vue前后端分离社区智慧养老监护管理平台设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Python——列表(list)推导式

本文基于python3。 目录 1、Python推导式2、列表(list)推导式2.1、定义2.2、实际操作2.2.1、一个表达式&#xff0c;后面为一个 for 子句2.2.2、一个表达式&#xff0c;后面为一个 for 子句&#xff0c;然后&#xff0c;跟着if 子句。2.2.3、一个表达式&#xff0c;后面为一个…

vscode 与 C++

序 具体流程的话&#xff0c;官方文档里都有的&#xff1a;C programming with Visual Studio Code 浏览器下载一个mingw64&#xff0c;解压&#xff0c;配置环境变量vscode里安装c相关的插件没了 第一步只看文字&#xff0c;可能有点抽象&#xff0c;相关视频&#xff1a; …

24 WEB漏洞-文件上传之WAF绕过及安全修复

目录 WAF绕过上传参数名解析:明确哪些东西能修改?常见绕过方法&#xff1a;符号变异-防匹配( " ;)数据截断-防匹配(%00 ; 换行)重复数据-防匹配(参数多次)搜索引擎搜索fuzz web字典文件上传安全修复方案 WAF绕过 safedog BT(宝塔) XXX云盾 宝塔过滤的比安全狗厉害一些&a…

全流程R语言Meta分析核心技术教程

详情点击链接&#xff1a;全流程R语言Meta分析核心技术教程 一&#xff0c;Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析&#xff1f; 2)Meta分析的选题策略 3)精确检索策略&#xff0c;如何检索全、检索准 4)文献的管理与清洗&#xff0c;如何制定文…

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先&#xff0c;需要明白一个很重要的事实&#xff1a; 所有的摆放方案数所有横着摆放且合理的方案数 这是因为&#xff0c;横着的确定之后&#xff0c;竖着的一定会被唯一确定&#xff0c;举一个例子&#xff1a; ------唯一确定-…

gma 2 教程(二)数据操作:6.NumPy数组交互

gma 栅格数据集可以通过 ToArray 方法将栅格数据转为NumPy数组&#xff0c;也提供将NumPy数据转换为栅格数据&#xff08;集&#xff09;的方法。 读取NumPy数组到数据集 &#xff08;一&#xff09;函数简介   &#xff08;二&#xff09;示例 保存NumPy数组到文件 &…

C++笔记之智能指针和单例、依赖注入结合使用

C笔记之智能指针和单例、依赖注入结合使用 code review! 文章目录 C笔记之智能指针和单例、依赖注入结合使用例1.一个类不使用单例&#xff0c;另一个类使用单例例2.两个类都使用单例&#xff0c;并且通过getInstance()传入类的实例例3.std::make_unique不能访问私有的构造函…

5.基于多能互补的热电联供型微网优化运行

MATLAB代码链接&#xff1a;基于多能互补的热电联供型微网优化运行 MATLAB代码&#xff1a;基于多能互补的热电联供型微网优化运行 关键词&#xff1a;多能互补 综合需求响应 热电联产 微网 优化调度 参考文档&#xff1a;《基于多能互补的热电联供型微网优化运行》基本完全…