保姆级教学—扫雷游戏的实现

扫雷的目录

  • 扫雷
    • 游戏选择
    • 初始化棋盘
    • 布置雷
    • 打印棋盘
    • 排查雷
    • 完整代码呈现
  • 结尾

扫雷

整个游戏的实现分为五个部分:

  • 游戏选择
  • 初始化棋盘
  • 布置雷
  • 打印棋盘
  • 排查雷

在文章的最后会有完整的代码呈现

游戏选择

首先是游戏选择部分,你可以在此选择是否开始游戏

且每当结束一把对局,也会回到该界面,再次进行选择

void menu()
{printf("                           \n");printf("          1.paly           \n");printf("          0.exit           \n");printf("                           \n");}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

这里我们用do…while语句配合switch…case语句,实现游戏选择的基本功能

如果对方输入“1”,那么我们将开始游戏,但在此之前会初始化棋盘、并将其打印的

初始化棋盘

我们以一个9×9的棋盘为例,这对应的就是一个9行9列的二维数组

我们都知道扫雷游戏的玩法:点开一个格子,会显示其周围一圈八个格子存在雷的数量。

但倘若我们点的格子恰好在边缘上,这时候再判断周围八个格子是否是雷时会有几个坐标在棋盘外部,这时再通过遍历这八个坐标判断时,会发生数组越界

为了避免这种麻烦,我们再定义一个11×11的二维数组,专门用于判断,并且在超过9×9的地方都赋值0,这样在判断时也不会将其判定为雷

综上

我们需要设计两个二维数组,一个数组(show)9×9(尽管初始化时我将show初始化成11×11的数组,但实际上只用到了中间的9×9),专门用于存放被排查出的雷的信息,并呈现给玩家;另一个数组(mine)11×11,专门用于判断周围是否有雷,并将排查出来的信息传递给show数组

对于初始化

mine数组初始化为全’0’,被埋雷的地方则改为’1’;show数组初始化为’*‘,被排查的地方则显示器周围相应的雷的数量,如’2’

代码实现:

#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2void init_board(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 game()
{//定义两个数组char mine[ROWS][COLS];char show[ROWS][COLS];//初始化数组init_board(mine, ROWS, COLS, '0');init_board(show, ROWS, COLS, '*');
}

尽管我们设计了两个数组,但在打印时只会打印show数组,mine数组是不打印的,其存在目的只是为了使show数组能够显示每个格子周围雷的信息

打印结果展示:

看到上面的打印结果或许有人要问:这个行和列旁边的0~9是什么意思啊?

不急,这就涉及到后面内容-棋盘打印了,在文章后续会讲

下面我们先看雷的布置

布置雷

在初始化棋盘完成后,就需要布置雷了

雷的布置要满足随机的要求,所以就要用到随机数rand和srand(注意头文件的引用)

我们提前在main函数中初始化一个随机数发生器srand((unsigned int)time(NULL));,便于生成随机数

因为雷的布置玩家是不知道的,所以只需要在mine数组中布置即可,即将mine数组中的’0’变成’1’

代码实现:

//设置雷的个数
#define easy_count 10void set_mine(char board[ROWS][COLS], int row, int col)
{int count = easy_count;//布置easy_count个雷,每布置一个就减少1while (count){int x = rand() % row + 1;int y = rand() % col + 1;//该坐标要确定没被布置过雷if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}

这里的int x = rand() % row + 1和int y = rand() % col + 1是保证布置的雷不会超出9×9的范围

打印棋盘

在布置完雷后,就可以进行打印棋盘供玩家开始排查雷了

所打印的棋盘是不能让玩家知道雷是怎么布置的所以,mine数组不能打印,只需打印show数组即可

代码实现:

void dispaly_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

为了使玩家在排查雷时方便输入坐标,我们在棋盘的上侧和左侧标上列号和行号,即在初始化棋盘时见到的那样

排查雷

棋盘被成功打印后就要开始真正的“扫雷”了

玩家在输入一个坐标后,我们需要在mine数组上的该坐标周围8个坐标判断有没有雷,有几颗雷,并将这个数据传给show数组进行显示

同时我们也要给出游戏结束的条件:踩雷了或者非雷的坐标都排查完毕

代码实现:

int get_mine_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 find_mine(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win< row * col - easy_count){printf("请输入坐标:");scanf("%d%d", &x, &y);//首先判断输入的坐标是否符合棋盘大小规定if (x >= 1 && x <= row && y >= 1 && y <= col){//再判断这个坐标是否已经排查过了if (board2[x][y] == '*'){if (board1[x][y] == '1'){printf("很遗憾,你被炸死了!\n");dispaly_board(board1, ROW, COL);break;}else{//用来接收该坐标周围的雷数int count = get_mine_count(board1, x, y);//因为我们在show数组中都是字符数字,所以也要让count变成字符数字,所以这里+上了'0'board2[x][y] = count + '0';//进行屏幕清空system("cls");dispaly_board(board2, ROW, COL);//每成功扫一个雷就win++win++;}}else{printf("坐标已被排查,请重新输入:");}}else{printf("坐标非法,请重新输入:");}}if (win == row * col - easy_count){printf("恭喜你,扫雷成功\n");dispaly_board(board1, ROW, COL);}
}

具体排查过程各位可以看代码,是比较好理解的

值得一提的是,在提取坐标周围雷的信息时,我们是将这八个坐标遍历,将这8个字符加起来-8*‘0’,这样就可以得到雷的个数

因为’0’对应的ASCII码值为48,'1’对应49,倘若周围没有雷,则8个48相加减去8乘48等于0,即没有雷,符合要求

完整代码呈现

我写这个游戏时是多文件工程,所以我也就分文件给大家呈现了

main.c

#include"game.h"
void menu()
{printf("                           \n");printf("          1.paly           \n");printf("          0.exit           \n");printf("                           \n");}void game()
{//定义两个数组char mine[ROWS][COLS];char show[ROWS][COLS];//初始化数组init_board(mine, ROWS, COLS, '0');init_board(show, ROWS, COLS, '*');//布置雷set_mine(mine, ROW, COL);//打印最初的棋盘dispaly_board(show, ROW, COL);//排查雷find_mine(mine, show, ROW, COL);}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请输入:");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入\n");break;}} while (input);return 0;
}

game.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2//设置雷的个数
#define easy_count 10//初始化数组
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void dispaly_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_mine(char board[ROWS][COLS], int row, int col);//排查雷
void find_mine(char board[ROWS][COLS], int rows, int cols);

game.c

#include"game.h"//初始化数组
void init_board(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;}}
}//打印棋盘
//这里只需要打印中间9*9的棋盘就可以了
void dispaly_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}//布置雷
//这里只需要在中间9*9的棋盘布置即可,将mine数组中'0'变成'1'
//因为要在棋盘中随机布置雷,所以要用到随机数
void set_mine(char board[ROWS][COLS], int row, int col)
{int count = easy_count;//布置easy_count个雷,每布置一个就减少1while (count){int x = rand() % row + 1;int y = rand() % col + 1;//该坐标要确定没被布置过雷if (board[x][y] == '0'){board[x][y] = '1';count--;}}
}int get_mine_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');
}//排查雷
//玩家在选定一个坐标后,我们需要在mine数组上的该坐标周围8个坐标判断有没有雷,有几颗雷,并将这个数据传给show数组进行显示
void find_mine(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win< row * col - easy_count){printf("请输入坐标:");scanf("%d%d", &x, &y);//首先判断输入的坐标是否符合棋盘大小规定if (x >= 1 && x <= row && y >= 1 && y <= col){//再判断这个坐标是否已经排查过了if (board2[x][y] == '*'){if (board1[x][y] == '1'){printf("很遗憾,你被炸死了!\n");dispaly_board(board1, ROW, COL);break;}else{//用来接收该坐标周围的雷数int count = get_mine_count(board1, x, y);//因为我们在show数组中都是字符数字,所以也要让count变成字符数字,所以这里+上了'0'board2[x][y] = count + '0';//进行屏幕清空system("cls");dispaly_board(board2, ROW, COL);//每成功扫一个雷就win++win++;}}else{printf("坐标已被排查,请重新输入:");}}else{printf("坐标非法,请重新输入:");}}if (win == row * col - easy_count){printf("恭喜你,扫雷成功\n");dispaly_board(board1, ROW, COL);}
}

结尾

到这里,扫雷游戏就算是实现了,不过这里的游戏也存在缺陷

我写的代码在排查雷时只能一次排查一个,无法做到像网上游戏一样,有时候可以一次排查一片

其他若有写的不对、不好、不严谨的地方欢迎各位指正

感谢各位的阅读观看,谢谢大家!

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

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

相关文章

[Moonlight内网串流教程] IPAD超简易操作版 - 安卓苹果通用

超简易进行串流教程 使用设备&#xff1a;ipad Air 3 、有Nvidia显卡的普通Windows笔记本。 Windows系统准备工作 1、打开Nvidia GeForce Experience&#xff0c;如果没有就去下载一个。 2、进入C:\ProgramData\NVIDIA Corporation\Downloader\latest 3、将里面的setup.exe右…

iPad 3g版完美实现打电话功能(phoneitipad破解)

看到这个标题&#xff0c;有的同学可能吐槽&#xff0c;iPad 用来打电话&#xff0c;多雷人啊&#xff0c;人家apple设计的时候没加电话功能是故意这样做的。 不过这次真的有这样的需求&#xff0c;一台测试用的iPad 1 3G版的机器&#xff0c;放进去了一张3G电话卡&#xff0c;…

大学军训板报计算机学院,大学生军训黑板报素材

大学生军训黑板报素材 大学生军训黑板报有哪些呢&#xff1f;我们不妨一起来参考下范文吧&#xff01;希望对您有所帮助&#xff01;以下是小编为您搜集整理提供到的大学生军训黑板报素材内容&#xff0c;希望对您有所帮助&#xff01;欢迎阅读参考学习&#xff01; 大学生军训…

军训计算机电气专业解说词,你的军训有我陪伴

9月3日&#xff0c;湖南大学2018级新生军训开始了。这一天天气如以往一样&#xff0c;闷热难耐&#xff0c;但是对于电气与信息工程学院电自1801班学生助理张之亮来说却是难忘的一天。 就在中午十二点左右&#xff0c;张之亮同学接到了一个紧急电话&#xff1a;电自1801班的黄天…

计算机网络军训口号,军训口号霸气口号(精选60句)

军训口号霸气口号(精选60句) 下面是小编帮大家整理的军训口号霸气口号(精选60句)&#xff0c;供大家参考借鉴&#xff0c;希望可以帮助到有需要的朋友。 军训口号霸气口号1 1、流血流汗不流泪&#xff0c;掉皮掉肉不掉队。 2、一连口号&#xff1a;铁血一连&#xff0c;彰显军颜…

计算机系军训口号四句霸气,军训口号 四句 霸气

军训口号 四句 霸气 掉皮掉肉不掉队&#xff0c;流血流汗不流泪 继承人民军队光荣传统和优良作风为民族复兴刻苦学习 发扬集体主义和革命英雄主义精神为祖国富强立志成才 磨练顽强的斗志&#xff0c;培养吃苦的精神&#xff0c;锤炼良好的品质 服从命令听从指挥团结互助争创佳绩…

计算机学院军训口号大全团队,关于霸气押韵的军训口号大全

关于霸气押韵的军训口号大全 导语&#xff1a;《现代汉语词典》中说&#xff0c;口号是“供口头呼喊的有纲领性和鼓动作用的简短句子”。马克思主义哲学认为&#xff0c;物质决定意识&#xff0c;意识对物质具有能动作用。口号作为意识的表现形式之一&#xff0c;是对当时社会政…

计算机网络军训口号,霸气押韵的16字军训口号(精选50句)

霸气押韵的16字军训口号(精选50句) 人是靠梦想活下来的,也是靠梦想活下去的,军训是锻炼我们的.意识形态。下面和小编一起来看霸气押韵的16字军训口号(精选50句),希望有所帮助! 1、军中骄子,校园精英;铿锵四连,勇往直前。 2、天骄十六,不懈追求;勇往直前,争创一流。 3…

计算机系统军训口号,有气势的军训口号(精选50条)

有气势的军训口号(精选50条) 在日常学习、工作和生活中&#xff0c;大家都听说过或者使用过一些比较经典的口号吧&#xff0c;口号的作用是便于“造势”&#xff0c;形成一种氛围。你知道什么样的口号才能称之为经典吗&#xff1f;以下是小编帮大家整理的有气势的军训口号(精选…

计算机系军训口号四句霸气,军训口号四句霸气

军训口号四句霸气 军训口号四句霸气的有哪些?以下是小编收集的关于《军训口号四句霸气》的文章&#xff0c;欢迎借鉴参考! 篇一&#xff1a;军训口号四句霸气 风云XX&#xff0c;军中骄子&#xff0c;校园精英&#xff0c;谁与争风。 军鹰XX&#xff0c;翱翔九天&#xff0c;搏…

大学军训板报计算机学院,军训主题黑板报内容

【军训主题黑板报内容】军之魂 置身军旅&#xff0c;信念不可缺少&#xff0c;按照某种说法&#xff0c;此种信念即时人们口口相传的“军魂”——“军之魂”。 “狭路相逢勇者胜&#xff0c;遇敌必亮剑。”此堪为“军魂”之一。对于“军魂”二字&#xff0c;我想&#xff0c;若…

计算机网络军训口号,计算机专业军训口号

1. 争当训练标兵&#xff0c;共创先进连队。 2. 不经历风雨 &#xff0c;怎么见彩虹。 3. 同心同德求实创新齐育桃李芳天下&#xff0c;自律自强奋发进取共添德艺馨未来。 4. 团结一心&#xff0c;努力拼搏。 5. 明德尚行&#xff0c;矢志报国&#xff0c;磨砺青春&#xff0c;…

谷歌云| 5 个 GKE 功能可帮助您优化集群

Cloud Ace 是谷歌云全球战略合作伙伴&#xff0c;拥有 300 多名工程师&#xff0c;也是谷歌最高级别合作伙伴&#xff0c;多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商&#xff0c;我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。 本文将讨论 GKE 中的…

那个帮爷爷卖茶叶的善良女孩,可能是ChatGPT

詹士 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT&#xff0c;越来越刑了! 已有不法分子将其“打扮成”年轻女孩&#xff0c;放社交软件上&#xff0c;引诱男性上钩&#xff0c;进而实施诈骗。 △ 面向中国市场&#xff0c;可能是个朋友圈里的卖茶女孩 事实上&#xff0c;据For…

Java调用ChatGPT(基于SpringBoot和Vue)实现连续对话、流式输出和自定义baseUrl

目录 版本更新说明1. 配置阶段1.1 依赖引入1.2 配置application.yml文件1.3 注解添加 2. 使用2.1 生成回答2.1.1 测试 2.2 生成图片2.2.1 测试 2.3 下载图片2.3.1 测试 2.4 生成流式回答2.4.1 流式回答输出到IDEA控制台2.4.2 流式回答输出到浏览器页面2.4.3 流式回答结合Vue输出…

copilot平替tabnine解析

1.copilot 借着最近chatgpt大火的东风&#xff0c;copilot又重新火了一把。 什么是copilot&#xff1f;直接上wiki百科上的解释 GitHub Copilot是GitHub和OpenAI合作开发的一个人工智能工具&#xff0c;用户在使用Visual Studio Code、Microsoft Visual Studio、Vim、Cursor或…

ChatGPT 停售 Plus 会员!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 今天凌晨 2 点&#xff0c;一位名为 anton 的网友发推表示&#xff0c;ChatGPT Plus 已无法开通。 给出的理由是&#xff0c;现在 GPT 需求量太大&#xff0c;严重超载&#xff0c;算力有点…

【数学建模】 灰色预测模型

数学建模——预测模型简介 https://www.cnblogs.com/somedayLi/p/9542835.html 灰色预测模型 https://blog.csdn.net/qq_39798423/article/details/89283000?ops_request_misc&request_id&biz_id102&utm_term%E7%81%B0%E8%89%B2%E9%A2%84%E6%B5%8B%E6%A8%…

文言一心,ChatGLM-6B和ChatGPT等模型概述

原文首发于博客文章大语言模型概况 定义 &#xff08;个人理解的&#xff09;大语言模型&#xff08;Large Language Model&#xff09;是一种基于深度学习技术的自然语言处理通用模型&#xff0c;它可以通过学习大规模文本数据的模式和规律&#xff0c;从而实现对自然语言的理…

Axure页面设置管理灰色,无法设置怎么办?

我昨天在知乎上找到AxurePR9以及对应的安装包&#xff0c;但是安装完后发现【项目】选项卡下面的页面样式管理器是灰色的&#xff0c;无法设置相关的参数。但是我把原来的软件给删掉了&#xff0c;没有截图保存。 后面我找到了一个方法&#xff0c;大家可以参照一下&#xff1…