C语言 扫雷游戏

代码在一个项目里完成,分成三个.c.h文件(game.c,game.h,main.c)
在Clion软件中通过运行调试。

/大概想法/
主函数main.c里是大框架(菜单,扫雷棋盘初始化,随机函数生成雷,玩家扫雷)
game.h函数声明(除main函数和游戏函数外的一些函数声明)
game.c函数实现(除main函数和游戏函数外的一些函数实现)

/game.c实现/

①先对扫雷棋盘进行初始化(使用两个大小一样的字符数组作为扫雷棋盘
1.存储雷 2.展示给玩家的扫雷棋盘。为了避免在遍历中出现越界访问,棋盘尺寸设置为11*11,在9*9的尺寸里布置雷,展示给玩家的也是9*9的尺寸。相当于隐藏了第一行和最后一行,第一列和最后一列。)
1棋盘初始化为0 2棋盘初始化为*

②初始化完棋盘,显示棋盘
③随机函数生成雷存储到第一个字符数组里
④玩家扫雷实现包括 :玩家输入坐标位置是否是雷。坐标不是雷情况下周围一圈是否有雷。该坐标不是雷且周围也没有雷的情况下利用递归显示这些坐标为空。

以下是部分函数实现:

//判断周围多少雷(除输入坐标外一圈的八个位置获取雷数信息。
对于字符,某个字符-'0’就是整数.八个坐标减去八个’0’就是八个坐标里有几个雷)

//判断周围多少雷,返回雷数
int BombNumber(char mine[ROWS][COLS],int row,int col){return mine[row -1][col-1] + mine[row - 1][col] + mine[row - 1][col+1] + \mine[row][col-1] + mine[row][col+1] + \mine[row+1][col - 1] + mine[row+1][col] + mine[row+1][col+1] -8*'0';
}

本来在玩家输入的坐标不是雷,且周围八个坐标不是雷的情况下,想在函数里列举把九个坐标存为空再显示出来的。但是在学习视频里提到可以利用递归呈现出一片空白的棋盘。在网上查阅别人的代码学习到了如何使用递归呈现一片棋盘。

//假设是3*3的棋盘show[row - 1][col - 1] = ' ';//第一行show[row - 1][col] = ' ';show[row - 1][col + 1] = ' ';show[row][col - 1] = ' ';//第二行show[row][col] = ' ';show[row][col + 1] = ' ';show[row + 1][col - 1] = ' ';//第三行show[row + 1][col] = ' ';show[row + 1][col + 1] = ' ';

递归呈现一片棋盘
//在这个代码里递归思想是1.该坐标不是雷 2.周围的八个坐标也不是雷
对玩家输入的坐标进行九次循环 判断每个坐标是否合法且没有雷也没有展示给玩家
坐标满足条件以后就调用判断一圈是否有雷的函数 假如循环中的某个坐标一圈没有雷就再次进入递归函数 再将该坐标的一圈坐标进行循环遍历 继续以上过程 假如坐标不满足条件时会结束递归 进入else语句 直到九次循环完事。

void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){int i=0,j=0,flag=0;show[row][col] = ' ';for(i=row-1;i<=row+1;i++) {for (j = col-1; j <=col+1; j++) {if((i>0&&i<=ROW)&&(j>0&&j<=COL)&&(mine[i][j]!='1')&&(show[i][j]=='*')) {flag = BombNumber(mine, i, j);//判断一圈是否是雷,返回的是雷的数量if(!flag)BlankBoard(mine,show,i,j);//递归elseshow[i][j]=flag+'0';//将得到的非0的雷数放到展示给玩家的棋盘里}}}
}

//玩家进行游戏的核心操作

void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{char array[5]="\0";//使用字符串接收玩家输入的信息int x,y,flag=0,win=0;while(win<(row*col-Bomb))//展示给玩家的坐标数量<整个棋盘的非雷坐标数就进入循环//直到玩家看到的非*坐标数量已经是所有非雷坐标{printf("玩家输入坐标,坐标形式为:x,y\n");gets(array);x=array[0]-'0';//字符-'0'为整数y=array[2]-'0';if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)&&(show[x][y])=='*')//坐标合法且没有显示给玩家{if(mine[x][y]=='1')//在存储雷的棋盘中'1'代表是雷{printf("很遗憾,该坐标中放了雷,玩家被炸死");printf("雷分布如下:\n");Display(mine,ROW,COL);//显示存储雷的棋盘break;}else{flag=BombNumber(mine, x, y);//判断该坐标周围一圈是否是雷if(flag>0){//周围一圈有雷show[x][y]=flag+'0';Display(show,ROW,COL);}else{BlankBoard(mine,show,x,y);Display(show,ROW,COL);}winwin=Showboard(show,ROW,COL);}//判断展示给玩家的坐标数}elseprintf("坐标无效,请重新输入\n");}if(win==(row*col-Bomb)){printf("恭喜玩家排雷成功!\n");Display(mine,ROW,COL);}
}

//以下是完整代码(本人没玩过正常的扫雷游戏,对扫雷游戏的输赢理解可能不太对,但大概思路没啥问题)

//main.c


#include"game.h"//初版扫雷// 显示菜单
void menu(){printf("*********1.game***0.退出*********\n");printf("*********输入数字进行选择***********\n");
}
//游戏核心
//使用两个字符数组1->存放雷信息 2->用于输出到屏幕
//使用随机函数放置雷
//玩家排雷void game() {char Mine [ROWS][COLS]={0};char Show [ROWS][COLS]={0};;//数组初始化Init(Mine,ROWS,COLS,'0');Init(Show,ROWS,COLS,'*');//显示//Display(Mine,ROWS,COLS);//显示初始化的雷棋盘Display(Show,ROWS,COLS);//显示玩家棋盘SetBomb(Mine,ROW,COL);//随机生成雷//Display(Mine,ROW,COL);//显示雷棋盘StartBomb(Mine,Show,ROW,COL);//玩家进行扫雷
}int main()
{setbuf(stdout,NULL);//及时输出缓冲区内容int number=0;srand((unsigned int )time(NULL));//时间戳帮助生成棋盘上的随机坐标do{menu();scanf("%d",&number);getchar();//玩家输入的坐标使用字符串输入的,所以此时需要用getchar取走\nswitch(number){case 1:game();break;case 0:printf("正在退出\n");break;default:printf("选择错误,重新输入\n");break;}}while(number);}

//game.h

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>#define ROW 9
#define COL 9#define ROWS (ROW+2)
#define COLS (COL+2)#define Bomb 10#ifndef TEXT1_GAME_H
#define TEXT1_GAME_Hvoid Init(char board[ROWS][COLS],int rows,int cols,char set);
void Display(char board[ROWS][COLS],int row,int col);
void SetBomb(char board[ROWS][COLS],int row,int col);
void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
int  BombNumber(char mine[ROWS][COLS],int row,int col);
void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
int Showboard(char board[ROWS][COLS],int row,int col);
#endif

//game.c

#include"game.h"//初始化
void Init(char board[ROWS][COLS],int rows,int cols,char set){int i=0,j=0;for(i=0;i<ROWS;i++){for(j=0;j<COLS;j++)board[i][j]=set;}
}//显示函数
void Display(char board[ROWS][COLS],int row,int col)
{int i=0,j=0;//打印列数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");}
}//放置炸弹
void SetBomb(char board[ROWS][COLS],int row,int col)
{int numberBomb=1;while(numberBomb<=Bomb){int x=(rand()%ROW)+1;int y=(rand()%COL)+1;if(board[x][y]=='0') {board[x][y] = '1';numberBomb++;}}
}void StartBomb(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{char array[5]="\0";int x,y,flag=0,win=0;while(win<(row*col-Bomb)){printf("玩家输入坐标,坐标形式为:x,y\n");gets(array);x=array[0]-'0';y=array[2]-'0';if((x>=1&&x<=ROW)&&(y>=1&&y<=COL)&&(show[x][y])=='*'){if(mine[x][y]=='1'){printf("很遗憾,该坐标中放了雷,玩家被炸死");printf("雷分布如下:\n");Display(mine,ROW,COL);break;}else{flag=BombNumber(mine, x, y);if(flag>0){show[x][y]=flag+'0';Display(show,ROW,COL);}else{BlankBoard(mine,show,x,y);Display(show,ROW,COL);}}win=Showboard(show,ROW,COL);}elseprintf("坐标无效,请重新输入\n");}if(win==(row*col-Bomb)){printf("恭喜玩家排雷成功!\n");Display(mine,ROW,COL);}
}//判断周围多少雷
int BombNumber(char mine[ROWS][COLS],int row,int col){return mine[row -1][col-1] + mine[row - 1][col] + mine[row - 1][col+1] + \mine[row][col-1] + mine[row][col+1] + \mine[row+1][col - 1] + mine[row+1][col] + mine[row+1][col+1] -8*'0';
}//1.该坐标不是雷 2.周围的八个坐标也不是雷
void BlankBoard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col){int i=0,j=0,flag=0;show[row][col] = ' ';for(i=row-1;i<=row+1;i++) {for (j = col-1; j <=col+1; j++) {if((i>0&&i<=ROW)&&(j>0&&j<=COL)&&(mine[i][j]!='1')&&(show[i][j]=='*')) {flag = BombNumber(mine, i, j);if(!flag)BlankBoard(mine,show,i,j);elseshow[i][j]=flag+'0';
/*          show[row - 1][col - 1] = ' ';show[row - 1][col] = ' ';show[row - 1][col + 1] = ' ';show[row][col - 1] = ' ';show[row][col] = ' ';show[row][col + 1] = ' ';show[row + 1][col - 1] = ' ';show[row + 1][col] = ' ';show[row + 1][col + 1] = ' ';*/}}}
}int Showboard(char board[ROWS][COLS],int row,int col){int i=0,j=0,number=0;for(i=1;i<=row;i++){for(j=1;j<=col;j++){if(board[i][j]!='*')number++;}}return number;
}

在这里插入图片描述

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

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

相关文章

日志打印传值 传引用 右值引用性能测试

结论 ubuntu x86平台qnx平台优化传值都是比传引用的差 但是差距很小 测试代码 #include <cstdint> #include <ctime> #include <string>#ifdef __linux__#define ITERATIONS 10000000 #else#define ITERATIONS 100000 #endiftemplate <typename... AR…

Linux设置root初始密码

目录 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; 二、Linux系统中设置root初始密码 一、Linux系统中普通用户和特权用户&#xff08;root&#xff09; windows 系统中有普通用户和特权用户&#xff0c;特权用户是 administer&#xff0c;普通用户可以…

微服务01

笔记&#xff1a; day03-微服务01 - 飞书云文档 (feishu.cn) 数据库连接不上&#xff1f; 要在虚拟机启动MySQL容器。docker start mysql 服务治理 服务提供者&#xff1a;暴露服务接口&#xff0c;供其他服务调用 服务消费者&#xff1a;调用其他服务提供的接口 注册中心&…

STL(五)(queue篇)

我发现之前一版在电脑上看 常用函数部分 没有问题,由于是手打上去的,在手机上看会发生错位问题,现已将电脑原版 常用函数部分 截图改为图片形式,不会再发生错位问题,非常感谢大家的支持 ### priority_queue优先队列出现频率非常高,尤为重要(是一定要掌握的数据结构) 1.queue队…

docker全解

docker全解 一、docker的基本概念 什么是docker? docker是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#…

MIT线性代数笔记-第26讲-对称矩阵及正定性

目录 26.对称矩阵及正定性打赏 26.对称矩阵及正定性 实对称矩阵的特征值均为实数&#xff0c;并且一定存在一组两两正交的特征向量 这对于单位矩阵显然成立 证明特征值均为实数&#xff1a; ​    设一个对称矩阵 A A A&#xff0c;对于 A x ⃗ λ x ⃗ A \vec{x} \lambda…

作业12.8

1. 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数。将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

Matlab simulink PLL学习笔记

本文学习内容&#xff1a;【官方】2022小迈步之 MATLAB助力芯片设计系列&#xff08;一&#xff09;&#xff1a;电路仿真与模数混合设计基础_哔哩哔哩_bilibili 时域模型 testbench搭建 菜单栏点击simulink 创建空白模型 点击库浏览器 在PLL里面选择一种架构拖拽到画布。 如…

一文理解什么是交叉熵损失函数以及它的作用

今天看一个在深度学习中很枯燥但很重要的概念——交叉熵损失函数。 作为一种损失函数&#xff0c;它的重要作用便是可以将“预测值”和“真实值(标签)”进行对比&#xff0c;从而输出 loss 值&#xff0c;直到 loss 值收敛&#xff0c;可以认为神经网络模型训练完成。 那么这…

【Java用法】Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 + 数据排序

Hutool树结构工具-TreeUtil快速构建树形结构的两种方式 数据排序 一、业务场景二、Hutool官网树结构工具2.1 介绍2.2 使用2.2.1 定义结构2.2.2 构建Tree2.2.3 自定义字段名 2.3 说明 三、具体的使用场景3.1 实现的效果3.2 业务代码3.3 实现自定义字段的排序 四、踩过的坑4.1 坑…

ambari hive on Tez引擎一直卡住

hive on tez使用./bin/hive启动后一直卡住&#xff0c;无法进入命令行 使用TEZ作为Hive默认执行引擎时&#xff0c;需要在调用Hive CLI的时候启动YARN应用&#xff0c;预分配资源&#xff0c;这需要花一些时间&#xff0c;而使用MapReduce作为执行引擎时是在执行语句的时候才会…

iPaaS架构深入探讨

在数字化时代全面来临之际&#xff0c;企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局&#xff0c;不断推动着企业迈向新的前程。然而&#xff0c;这一数字化时代亦衍生出一系列复杂而深奥的难题&#xff1a;各异系统之间数据孤岛、…

基于SuperMap iObjects Java生成地图瓦片

作者&#xff1a;dongyx 前言 在GIS领域&#xff0c;地图瓦片技术作为GIS领域的关键技术&#xff0c;是提高地图服务性能的关键手段之一。通过预先生成地图的瓦片数据&#xff0c;可以显著提升用户访问地图时的响应速度和体验。SuperMap iObjects for Java作为一款强大的GIS开…

Docker, Docker-compose部署Sonarqube

参考文档 镜像地址: https://hub.docker.com/_/sonarqube/tags Docker部署文档地址 Installing from Docker | SonarQube Docs Docker-compose文档部署地址&#xff1a; Installing from Docker | SonarQube Docs 部署镜像 2.1 docker部署 # 宿主机执行 $. vi /etc/sysctl.conf…

Unity中Batching优化的GPU实例化(4)

文章目录 前言一、构建需要实例化的额外数据二、在顶点着色器&#xff0c;将实例化 ID 从 appdata 存入 v2f 传给片元着色器三、在片断着色器中访问具体的实例化变量三、使用代码修改Shader材质属性&#xff0c;实现GPU实例化后不同对象颜色不同的效果1、在C#测试脚本生成小板凳…

微前端介绍

目录 微前端概念 微前端特性 场景演示 微前端方案 iframe 方案 qiankun 方案 micro-app 方案 EMP 方案 无界微前端 方案 无界方案 成本低 速度快 原生隔离 功能强大 总结 前言&#xff1a;微前端已经是一个非常成熟的领域了&#xff0c;但开发者不管采用哪个现…

Leetcode—290.单词规律【简单】

2023每日刷题&#xff08;五十一&#xff09; Leetcode—290.单词规律 实现代码 class Solution { public:bool wordPattern(string pattern, string s) {unordered_map<char, string> m1;unordered_map<string, char> m2;stringstream stro(s);string tmp;for(a…

(env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序

应公司需求&#xff0c;在特定情况下需要修改ip 在开发过程中出现的小插曲 1、第一种情况&#xff1a;重复声明 2、第二种情况&#xff1a; 应官方要求&#xff0c;需要跳转的 tabBar 页面的路径&#xff08;需在 pages.json 的 tabBar 字段定义的页面&#xff09;&#xff0…

ArkTS快速入门

一、概述 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript&#xff08;简称TS&#xff09;基本语法风格的基础上&#xff0c;对TS的动态类型特性施加更严格的约束&#xff0c;引入静态类型。同时&#xff0c;提供了声明式UI、状态管理等相应的能力&#xff0c;让开发者可以…

硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134849296 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…