迟来的扫雷游戏

今天我们讲如何用C语言编写出一个简单扫雷,扫雷也算是一个比较原始的游戏了吧,那么我们今天就来实现他!

首先我们要来缕一缕游戏框架

我们在代码中我们肯定会写许多函数来实现扫雷,那么我们为了简便看出游戏的运行逻辑,我们创建一个test.c的源文件来进行大体代码主体的实现,那么我们再创建一个game.c来写各种游戏部分的功能函数,最后因为功能函数和其他库函数使用时都要声明函数和引头文件所以我们建立一个头文件game.h用来解决这些问题!!!如下!

首先我们从第一步开始布局,test.c为主体框架所以我们跟着test.c来进行讲解!首先我们先看完成的菜单选择,如下:

 do   while 循环里运用switch语句来完成!然后一一看看内容·!

menu菜单

因为简洁版我们就不弄那么复杂了!


void    game( ) 游戏大体功能

InitBorad(mine, ROWS, COLS, '0');
InitBorad(show, ROWS, COLS, '*');
Setmine(mine, ROW, COL);
Print(show, ROW, COL);
Print(mine, ROW, COL);
Findmine(mine, show, ROW, COL); 

这些函数都是放在game.c来编写实现的!!!


下面一一剖析

建立两个数组和 ROWS 和  COLS  及  ROW和 COL的原因

首先我们肯定是要运用数组知识来完成扫雷但为什么要建立两个数组呢?原因是---->一边我们要在数组中埋雷(即”1“)放在棋盘里,但我们刚开始和过程又必须要将棋盘的各各位置隐藏(即”*“)而且再扫雷过程中要显示无雷位置周围的雷数数字,所以我们必须用一个棋盘用作比对棋盘,另一个用作显示给玩家,所以我们建立两个数组即show和mine两个数组。然后是ROWS,COLS,ROW,COL为什么会有这些呢,首先我们要知道当我们在检周围雷数时是3X3的范围,当我们棋盘时ROW X COL时 ,比如9X9时,在边缘检验周围雷数时就会越界,为了不让它越界我们就要在原来多加两行两数确保四边都空一行防止越界,所以我们就有了COWS,COLS。


InitBorad(mine, ROWS, COLS, '0')    InitBorad(show, ROWS, COLS, '*') ------格式化

就简单的赋值进数组中,show数组全为”*“,mine则先赋值为”0“,后续在进行设置雷!


 

Setmine(mine, ROW, COL)---------设置雷的位置

这里用到设置随机数的知识,其实就是运用rand(),但也要利用时间戳来设置为种子,这样我们才可以使每次的随机数不一样,在这里便可以每把雷的位置不一样.


int Getmine(char arr[ROWS][COLS], int x, int y) 

 

这个函数是一个检查周围雷数的函数,注意的只要最后减去8个‘0’,也就是将字符类型通过转换成整型数字。


void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win) 

void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL)     //避免坐标非法{if (mine[x][y] != '1')      //确定没有踩到雷{if (Getmine(mine, x, y) == 0)   //确定其周围没有雷时展开继续进行{if (show[x][y] == '*')   //确保其展开对象是*{show[x][y] = ' ';int i = 0, j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (show[i][j] == '*'){expend(mine, show, i, j, win);}}}}win++;}else      //当其周围有雷时显示雷数{show[x][y] = Getmine(mine, x, y) + '0';}}}}

 这个函数便是展开函数,通过上面函数可以看见我们用到了很多if语句,主要的功能其旁边也写有注释,各位可以看注释进行理解!


void Findmine(char mine[ROWS][COLS],char show [ROWS][COLS],int row,int col) 

void Findmine(char mine[ROWS][COLS],char show [ROWS][COLS],int row,int col)
{int x, y,win=0;while(win<row*col-Easy_count){scanf("%d %d", &x, &y);if (0 < x && x <= row && y <= col && y > 0 ){if (mine[x][y] == '1'){printf("太可惜了,您踩到雷了呢~~~~~\n");break;}else if (show[x][y]!='*'){printf("老弟位置已排过雷了呢~~~~~~");printf("\n您可以重新输入坐标呢~~~~~\n");}else if(mine[x][y]=='0'){expend(mine, show, x, y, win);printf("恭喜你排雷成功了\n");Print(show, ROW, COL);}}if (win == row * col - Easy_count){printf("恭喜你游戏胜利了呢~~~~~~~\n");printf("您是否决定在玩一把呢~~~~~~~~~\n\n");break;}}}

 这个函数就是玩家操作的函数,通过输入坐标进行开始扫雷,代码中的win便是函数棋盘中的*的数量。


最后这篇文章的其他细节需要各位慢慢消化,有不懂的可以私聊我!最后给大家展示所有的代码。

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROWS 11
#define COLS 11
#define ROW 9
#define COL 9
#define Easy_count 10
void InitBorad(char board[ROWS][COLS], int rows, int cols, char set);
void Print(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[ROWS][COLS], int row, int col);
int Getmine(char arr[ROWS][COLS], int x, int y);
void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win);

 

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"menu()
{printf("******************************************\n");printf("******************************************\n");printf("*********** 1. play   0.exit *************\n");printf("******************************************\n");printf("******************************************\n");}void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];//建立两个数组InitBorad(mine, ROWS, COLS, '0');InitBorad(show, ROWS, COLS, '*');Setmine(mine, ROW, COL);Print(show, ROW, COL);Print(mine, ROW, COL);Findmine(mine, show, ROW, COL);}int main()
{int input, i;srand((unsigned int)time(NULL));do{menu();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 InitBorad(char board[ROWS][COLS],int rows,int cols ,char set)
{int i, j;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}void Print(char board[ROWS][COLS], int row, int col)
{int i, j;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 x, y;int count = Easy_count;while (count){x = rand() % row + 1;y = rand() % col + 1;if (board[x][y] != 1&&x<=ROW&&y<=COL){board[x][y] = '1';count--;}} 
}int Getmine(char arr[ROWS][COLS], int x, int y)
{return (arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + arr[x][y + 1]+ arr[x + 1][y - 1] + arr[x + 1][y + 1] + arr[x + 1][y] - 8 * '0');}void expend(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int win)
{if (x >= 1 && x <= ROW && y >= 1 && y <= COL){if (mine[x][y] != '1') {if (Getmine(mine, x, y) == 0){if (show[x][y] == '*'){show[x][y] = ' ';int i = 0, j = 0;for (i = x - 1; i <= x + 1; i++){for (j = y - 1; j <= y + 1; j++){if (show[i][j] == '*'){expend(mine, show, i, j, win);}}}}win++;}else{show[x][y] = Getmine(mine, x, y) + '0';}}}}void Findmine(char mine[ROWS][COLS],char show [ROWS][COLS],int row,int col)
{int x, y,win=0;while(win<row*col-Easy_count){scanf("%d %d", &x, &y);if (0 < x && x <= row && y <= col && y > 0 ){if (mine[x][y] == '1'){printf("太可惜了,您踩到雷了呢~~~~~\n");break;}else if (show[x][y]!='*'){printf("老弟位置已排过雷了呢~~~~~~");printf("\n您可以重新输入坐标呢~~~~~\n");}else if(mine[x][y]=='0'){expend(mine, show, x, y, win);printf("恭喜你排雷成功了\n");Print(show, ROW, COL);}}if (win == row * col - Easy_count){printf("恭喜你游戏胜利了呢~~~~~~~\n");printf("您是否决定在玩一把呢~~~~~~~~~\n\n");break;}}}

 

 

今天这篇文章就结束了!

希望大家多多支持!

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

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

相关文章

大创项目推荐 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

力扣刷题-二叉树-构建树

106.从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 中序遍历 inorder [9,3,15,20,7] 后序遍历 postorder [9,15,7,20,3] 返回如下的二叉树&#xff1a; 思路 参考&#xff1a;…

探秘Spring Bean的秘境:作用域篇【beans 三】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘Spring Bean的秘境&#xff1a;作用域篇【beans 三】 前言单例作用域如何声明单例Bean&#xff1a;特点&#xff1a; 原型作用域如何声明原型Bean&#xff1a;特点&#xff1a; 会话作用域如何声明…

多台西门子PLC对接Oracle数据库,实现PLC与数据库双向数据通讯

智能网关IGT-DSER方便实现多台PLC与数据库之间的数据通讯&#xff0c;既可以读取PLC的数据上报到数据库&#xff0c;也可以从数据库查询数据后写入到PLC的寄存器。 网关安装在设备侧&#xff0c;与设备同时起停&#xff0c;不担心数据丢失&#xff1b;在断网、服务器维护上报数…

vue-动态高亮效果

个人练习&#xff0c;仅供参考 实现如下效果&#xff1a;点击某块&#xff0c;某块变成其他颜色。 具体实现代码&#xff1a; 上边&#xff1a; <template><div><h3 style"color: #f69">动态高亮效果</h3><hr> <!-- 对象 -->…

CodeWave智能开发平台--03--目标:应用创建--01模板创建依赖问题修改

摘要 本文是网易数帆CodeWave智能开发平台系列的第03篇&#xff0c;主要介绍了基于CodeWave平台文档的新手入门进行学习&#xff0c;实现一个完整的应用&#xff0c;本文主要完成模板创建时的依赖问题解决。 CodeWave智能开发平台的03次接触 CodeWave参考资源 网易数帆Code…

算法训练营Day36(贪心-重叠区间)

都算是 重叠区间 问题&#xff0c;大家可以好好感受一下。 都属于那种看起来好复杂&#xff0c;但一看贪心解法&#xff0c;惊呼&#xff1a;这么巧妙&#xff01; 还是属于那种&#xff0c;做过了也就会了&#xff0c;没做过就很难想出来。 不过大家把如下三题做了之后&#…

AI边缘计算智能分析网关V4如何配置周界入侵检测算法

旭帆科技的智能分析网关V4内含近40种智能分析算法&#xff0c;包括人体、车辆、消防、环境卫生、异常检测等等&#xff0c;在消防安全、生产安全、行为检测等场景应用十分广泛&#xff0c;如常见的智慧工地、智慧校园、智慧景区、智慧城管等等&#xff0c;还支持抓拍、记录、告…

真机调试HarmonyOS应用报错

问题表现&#xff1a; 01/04 19:00:01: Launching com.example.simplevideo $ hdc shell am force-stop com.example.simplevideo $ hdc shell bm uninstall com.example.simplevideo $ hdc file send E:\harmony\SimpleVideo\entry\build\default\outputs\default\entry-defau…

【解决复杂链式任务,打造全能助手】LangChain 大模型 打造 钢铁侠的全能助理 Jarvis

LangChain 大模型 结合 做 AutoGPT、ChatPDF 思维链 CoTLangChain模型IO&#xff1a;和大模型交互、提示词模版数据连接&#xff1a;从数据的接入、分割&#xff0c;到向量的构建、存储、搜索链&#xff1a;串联和组织&#xff0c;多个语言模型、组件记忆&#xff1a;灵魂伴侣&…

Day7 vitest 之 vitest配置第三版

项目目录 runner Type: VitestRunnerConstructor Default: node, 当运行test的时候 benchmark,当运行bench测试的时候 功能 自定义测试运行程序的路径。 要求 应与自定义库运行程序一起使用。 如果您只是运行测试&#xff0c;则可能不需要这个。它主要由library作者使用 …

斯坦福和 Meta学者发现Gemini在常识推理任务中有较强潜力;初学者GPT:Ai和LLM资源

&#x1f989; AI新闻 &#x1f680; 斯坦福和 Meta学者发现Gemini在常识推理任务中有较强潜力 摘要&#xff1a;斯坦福和Meta的学者发表论文为Gemini正名&#xff0c;他们发现之前对Gemini的评估并不能完全捕捉到其真正的常识推理潜力。他们设计了需要跨模态整合常识知识的任…