C/【扫雷】

**本文是用C语言写的扫雷小游戏———一个C语言前期寓教于乐的小游戏。

 

🌱博客主页:大寄一场.

🌱系列专栏:C语言学习笔记

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注

目录

一.游戏菜单的创建

二.游戏实现的思路

1.初始化雷盘

2.打印雷盘

3.布置雷

4.显示周围雷数

5.标记和取消标记雷

6.周围雷数为零,展开

7.扫雷并判断输赢

  完整代码

game.h

game.c 

text.c 


一.游戏菜单的创建

在我们进入游戏时,首先出现的就应该是我们的菜单界面。

我们选择使用“菜单函数”menu()来实现这一功能,提高程序的可重复性,确保代码块的函数分块使用。

游戏菜单应该实现这几个功能:

  1. 游戏的进入
  2. 游戏的退出

接下来是我们实现这一功能的代码:

void menu()
{printf("┌-----------------------------┐\n");printf("├**********1.扫雷*************┤\n");printf("├**********0.退出*************┤\n");printf("└-----------------------------┘\n");
}

menu 2()为小游戏的拓展 方便进行标记雷操作。

void menu2()
{printf("┌-----------------------------┐\n");printf("├**********1.排雷*************┤\n");printf("├**********2.标记*************┤\n");printf("├**********3.取消标记*********┤\n");printf("└-----------------------------┘\n");}

二.游戏实现的思路

测试的逻辑——test.c

游戏的实现——game.h

游戏函数的声明——game.c

1.初始化雷盘

void Init(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}

2.打印雷盘

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{system("cls");//清屏操作,使界面更简洁printf("---------扫雷----------\n");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");}printf("---------扫雷----------\n");
}

3.布置雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = Easy_Count;while (count){int i = rand() % row + 1;int j = rand() % col + 1;if (mine[i][j] == '0'){mine[i][j] = '1';count--;}}
}

4.显示周围雷数

//法一:逐个遍历
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y] + mine[x - 1][y - 1] +mine[x - 1][y + 1] + mine[x][y - 1] +mine[x][y + 1] + mine[x + 1][y] +mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0';
}
//法二:循环遍历
static int get_mine_count2(char mine[ROWS][COLS], int x, int y)
{int i = 0;int count = 0;for (i = -1; i <= 1; i++){int j = 0;for (j = -1; j <= 1; j++){if (mine[x + i][y + j] == '1')count++;}}return count;
}

5.标记和取消标记雷

//标记雷
void flag(char show[ROWS][COLS], int row, int col)
{while (1){int x = 0;int y = 0;printf("请输入标记坐标(输入:行 列 退出):>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 0 && y <= col){if (show[x][y] != '#'){show[x][y] = '#';break;}else{printf("该坐标已经标记,请重新选择\n");}}else{printf("坐标越界,请重新输入\n");}if (x == y && x == 0)break;}
}//取消标记雷
static void cancel_flag(char show[ROWS][COLS], int row, int col)
{while (1){int x = 0;int y = 0;printf("请输入取消标记坐标(输入:0 0退出):>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 0 && y <= col){if (show[x][y] == '#')//比较用双等号!!!{show[x][y] = '*';break;}else{printf("该坐标还未标记,请重新选择\n");}}else{printf("坐标越界,请重新输入\n");}if (x == y && x == 0)break;}
}

6.周围雷数为零,展开

void Digit_boom(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y, int row, int col, int* win)
{if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性{int ret = get_mine_count2(mine, x, y);//接受坐标周围雷的数量if (ret == 0)//递归条件--周围雷数为0{(*win)++;//每排查一个坐标,排查次数加1,为判断输赢做准备show[x][y] = '0';int i = 0;int j = 0;//用两个循环遍历周围8个坐标for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if (show[x + i][y + j] == '*')//递归的坐标必须是未排查过的坐标,防止死递归{Digit_boom(show, mine, x + i, y + j, row, col, win);}}}}else{//条件不满足退出递归(*win)++;//排查坐标,次数加1show[x][y] = ret + '0';}}}

7.扫雷并判断输赢

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int choice = -1;int x = 0;int y = 0;int win = 0;while (win < col * row - Easy_Count){/*调用菜单2进行排雷和标记操作*/menu2();printf("请选择:>");scanf("%d", &choice);if (2 == choice) //标记雷{flag(show, ROW, COL);DisplayBoard(show, ROW, COL);}else if (3 == choice)//取消标记雷{cancel_flag(show, ROW, COL);DisplayBoard(show, ROW, COL);}else if (1 == choice)//进行排雷操作{printf("请输入排查坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");DisplayBoard(mine, ROW, COL);break;}else if (show[x][y] == '*'){Digit_boom(show, mine, x, y, row, col, &win);//展开雷DisplayBoard(show, row, col);}else/*show[x][y] != '*' */{printf("该坐标已排查,请重新选择\n");}}else{printf("输入坐标错误,请重新输入\n");}}else{printf("坐标非法,重新输入\n");}}if (win == col * row - Easy_Count){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

  完整代码

game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
//包含头文件
#include <stdio.h>
#include <time.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
//宏定义
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define Easy_Count 11
//初始化雷盘
void Init(char board[ROWS][COLS], int rows, int cols, char x);
//打印雷盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);
//排雷并判断输赢
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c 

#include"game.h"
//初始化雷盘
void Init(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){board[i][j] = set;}}
}
//打印雷盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{system("cls");//清屏操作,使界面更简洁printf("---------扫雷----------\n");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");}printf("---------扫雷----------\n");
}
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = Easy_Count;while (count){int i = rand() % row + 1;int j = rand() % col + 1;if (mine[i][j] == '0'){mine[i][j] = '1';count--;}}
}
//显示周围雷数
//法一:逐个遍历
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return mine[x - 1][y] + mine[x - 1][y - 1] +mine[x - 1][y + 1] + mine[x][y - 1] +mine[x][y + 1] + mine[x + 1][y] +mine[x + 1][y - 1] + mine[x + 1][y + 1] - 8 * '0';
}
//法二:循环遍历
static int get_mine_count2(char mine[ROWS][COLS], int x, int y)
{int i = 0;int count = 0;for (i = -1; i <= 1; i++){int j = 0;for (j = -1; j <= 1; j++){if (mine[x + i][y + j] == '1')count++;}}return count;
}
//标记雷
static void flag(char show[ROWS][COLS], int row, int col)
{while (1){int x = 0;int y = 0;printf("请输入标记坐标(输入:行 列 退出):>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 0 && y <= col){if (show[x][y] != '#'){show[x][y] = '#';break;}else{printf("该坐标已经标记,请重新选择\n");}}else{printf("坐标越界,请重新输入\n");}if (x == y && x == 0)break;}
}
//取消标记雷
static void cancel_flag(char show[ROWS][COLS], int row, int col)
{while (1){int x = 0;int y = 0;printf("请输入取消标记坐标(输入:0 0退出):>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 0 && y <= col){if (show[x][y] == '#')//比较用双等号!!!{show[x][y] = '*';break;}else{printf("该坐标还未标记,请重新选择\n");}}else{printf("坐标越界,请重新输入\n");}if (x == y && x == 0)break;}
}
//如果排雷坐标周围雷数为零,递归展开
static void Digit_boom(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y, int row, int col, int* win)
{if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标合法性{int ret = get_mine_count2(mine, x, y);//接受坐标周围雷的数量if (ret == 0)//递归条件--周围雷数为0{(*win)++;//每排查一个坐标,排查次数加1,为判断输赢做准备show[x][y] = '0';int i = 0;int j = 0;//用两个循环遍历周围8个坐标for (i = -1; i <= 1; i++){for (j = -1; j <= 1; j++){if (show[x + i][y + j] == '*')//递归的坐标必须是未排查过的坐标,防止死递归{Digit_boom(show, mine, x + i, y + j, row, col, win);}}}}else{//条件不满足退出递归(*win)++;//排查坐标,次数加1show[x][y] = ret + '0';}}}
//扫雷菜单
static void menu2()
{printf("┌-----------------------------┐\n");printf("├**********1.排雷*************┤\n");printf("├**********2.标记*************┤\n");printf("├**********3.取消标记*********┤\n");printf("└-----------------------------┘\n");}
//扫雷并判断输赢void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int choice = -1;int x = 0;int y = 0;int win = 0;while (win < col * row - Easy_Count){/*调用菜单2进行排雷和标记操作*/menu2();printf("请选择:>");scanf("%d", &choice);if (2 == choice) /*标记雷*/{flag(show, ROW, COL);DisplayBoard(show, ROW, COL);}else if (3 == choice)/*取消标记雷*/{cancel_flag(show, ROW, COL);DisplayBoard(show, ROW, COL);}else if (1 == choice)/*进行排雷操作*/{printf("请输入排查坐标:>");scanf("%d%d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了!\n");DisplayBoard(mine, ROW, COL);break;}else if (show[x][y] == '*'){Digit_boom(show, mine, x, y, row, col, &win);/*展开*/DisplayBoard(show, row, col);}else/*show[x][y] != '*' */{printf("该坐标已排查,请重新选择\n");}}else{printf("输入坐标错误,请重新输入\n");}}else{printf("坐标非法,重新输入\n");}}if (win == col * row - Easy_Count){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

text.c 

#include"game.h"
//游戏菜单
menu()
{printf("┌-----------------------------┐\n");printf("├**********1.扫雷*************┤\n");printf("├**********0.退出*************┤\n");printf("└-----------------------------┘\n");
}
//扫雷游戏
void game()
{//创建扫雷棋盘char mine[ROWS][COLS];char show[ROWS][COLS];//初始化扫雷棋盘Init(mine, ROWS, COLS, '0');Init(show, ROWS, COLS, '*');//布置雷SetMine(mine, ROW, COL);//打印扫雷棋盘DisplayBoard(show, ROW, COL);//开始扫雷并判断输赢FindMine(mine, show, ROW, COL);
}
void test()
{srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择!\n");break;}} while (input);
}   /*交互界面*/
int main()
{test();return 0;
}

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

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

相关文章

扫雷游戏-C实现

扫雷游戏 纯C&#xff0c;运用数组&#xff0c;循环实现&#xff0c;基础巩固 注&#xff1a;本篇将重心放在思路以及核心步骤讲解&#xff0c;重要的不是将每一部分代码记下了&#xff0c;而是将核心思路和代码实现理解透彻。如果你对本篇一些内容跳转&#xff0c;细节表示茫然…

ChatGPT 速通手册——ChatGPT 的自我介绍

从 ChatGPT 的名字就可以看出&#xff0c;它的最核心功能就是 Chat(聊天)。那么&#xff0c;我们就以聊天的形式&#xff0c;开始本书的内容。 先让 ChatGPT 自己做一次自我介绍。既可以展现 ChatGPT 的产品使用形式&#xff0c;也可以快速了解 ChatGPT 的技术概念&#xff1a;…

VUE svg图标 报错

&#xff1a;咱前端用到svg的地方多了去了 这可得会 目录 下载安装 svg 配置config文件 在vue.config.js 创建icon文件夹&#xff0c;存放svg格式图片 icon/index.js 创建组件components ---> SvgIcon src/utils/validate.js 在main.js引入 下载安装 svg npm ins…

可以微调类ChatGPT模型啦!开源Alpaca-LoRA+RTX 4090就能搞定

源 | 机器之心 Alpaca-LoRA 将微调类 ChatGPT 模型的算力需求降到了消费级&#xff0c;训练个自己的中文对话模型真就没那么难了。 2023 年&#xff0c;聊天机器人领域似乎只剩下两个阵营&#xff1a;「OpenAI 的 ChatGPT」和「其他」。 ChatGPT 功能强大&#xff0c;但 OpenAI…

如何使用OpenAI fine-tuning(微调)训练属于自己专有的ChatGPT模型?

要使用OpenAI的微调技术来训练自己的专有模型,您需要遵循以下步骤: 获取和准备数据集:首先,您需要准备自己的数据集。可以使用公共数据集,也可以使用自己的数据集。数据集需要以特定格式(如JSONL)进行存储,并且需要经过清洗和预处理。 选择合适的模型和超参数:根据您…

一觉睡醒,ChatGPT 竟然被淘汰了?

转自机器之心 编辑&#xff1a;杜伟、陈萍 OpenAI 的 Andrej Karpathy 都大力宣传&#xff0c;认为 AutoGPT 是 prompt 工程的下一个前沿。 近日&#xff0c;AI 界貌似出现了一种新的趋势&#xff1a;自主人工智能。 这不是空穴来风&#xff0c;最近一个名为 AutoGPT 的研究开始…

ChatGPT实现stackoverflow 解释

stackoverflow 解释 ChatGPT 公开服务以来&#xff0c;程序员们无疑是最早深入体验和"测试"的一批人。出色的效果也引发了一系列知识产权上的争议。著名的 stackoverflow 网站&#xff0c;就宣布禁止用户使用 ChatGPT 生成的内容来回答问题&#xff0c;一经发现&…

ChatGPT疯狂生成「辣鸡」内容,Stack Overflow气急,连夜封杀!

时下爆火的ChatGPT&#xff0c;被网友们用来生成海量答案。而Stack Overflow已经不堪其扰&#xff0c;发起「追杀」&#xff1a;应封尽封&#xff01; OpenAI的新模型ChatGPT才诞生没几天&#xff0c;已经成为广大网友的「装逼利器」。 它的回答不说正确不正确&#xff0c;乍一…

轻松掌握RecyclerView缓存机制

在 Android 应用程序中&#xff0c;RecyclerView 是一个非常重要的控件。它被广泛使用&#xff0c;因为它可以帮助我们展示大量的数据&#xff0c;同时也能够提供流畅的滑动体验。然而&#xff0c;如果我们不小心处理好 RecyclerView 的缓存机制&#xff0c;就可能会导致性能下…

chatgpt赋能python:Python内存管理:如何清理内存

Python内存管理&#xff1a;如何清理内存 Python作为一种高级编程语言&#xff0c;在各种应用领域都得到了广泛的应用。作为一种解释型语言&#xff0c;Python有着自动垃圾回收器的优点&#xff0c;但在长时间运行的应用程序中&#xff0c;Python可能会占用大量内存&#xff0…

[chat-GPT]解决OpenAI‘s services are not available in your country问题

OpenAI‘s services are not available in your country 按照网上的教程一步步配置chat-GPT&#xff0c;一直换不同国家的梯子也无济于事&#xff0c;各种搜索尝试&#xff0c;终于解决 解决方法 1.换浏览器 我换了firefox 一开始用的谷歌浏览器 2.清楚当前使用的浏览器所有…

最新版ui成语填空答题,成语接龙小程序源码,修复登录接口问题

这类的成语接龙填词游戏&#xff0c;之前我就见过朋友在玩&#xff0c;自带裂变属性&#xff0c;引流、广告效果都是一绝。强制分享广告&#xff0c;可拆随机金额红包&#xff0c;广告配置、激励配置等都在后台即可配置管理&#xff0c;无需翻改代码。朋友运营过的东西&#xf…

小程序“成语猜题”部分答案

哀哀父母可哀呀可哀&#xff0c;我的父母啊&#xff01;原指古时在暴政下人民终年在外服劳役&#xff0c;对父母病痛、老死不能照料而悲哀。哀哀欲绝绝&#xff1a;断气&#xff0c;死。形容极其悲痛。哀兵必胜原意是力量相当的两军对阵&#xff0c;悲愤的一方获得胜利。后指受…

chatgpt赋能python:Python怎样模拟成语填空游戏

Python怎样模拟成语填空游戏 成语填空游戏是一种非常受欢迎的智力游戏。在这个游戏中&#xff0c;玩家需要根据提示&#xff0c;在给出的空格中填入对应的成语。而Python是一个功能强大的编程语言&#xff0c;用起来十分简单。在本文中&#xff0c;我们将介绍如何使用Python来…

看图猜成语小程序设计与实现(小程序+PHP)

目 录 摘 要 I Abstract II 1 绪论 1 1.1 研究背景 1 1.2 国内外研究现状 1 1.2.1 国内研究现状 1 1.2.2 国外研究现状 2 1.3 论文组织结构 3 2 相关技术 4 2.1微信小程序介绍 4 2.1.1微信介绍 4 2.1.2微信小程序简介 4 2.1.3微信小程序基本功能 5 2.2开发技术的介绍 6 2.2.1 P…

12月编程语言排行榜:前三终于变了,Java跌出前三?它居然首次进前三!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;爆火的ChatGPT太强了&#xff01;写代码、改bug&#xff0c;网友&…

C++ 涨幅依旧亮眼,Visual Basic 一降再降!TIOBE 5 月榜单发布

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 作为编程语言排行榜领域最权威的组织之一&#xff0c;今天 TIOBE 最新发布了 5 月榜单&#xff0c;快让我们看看这个月编程语言的流行趋势有何变化吧&#xff01; C 涨幅依旧亮眼&#xff0c;Visual …

忆享聚焦|ChatGPT、AI、网络数字、游戏……近期热点资讯一览

“忆享聚焦”栏目第十四期来啦&#xff01;本栏目汇集近期互联网最新资讯&#xff0c;聚焦前沿科技&#xff0c;关注行业发展动态&#xff0c;筛选高质量讯息&#xff0c;拓宽用户视野&#xff0c;让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1.科技部部长王志…

接了ChatGPT的NewBing如何评价CodeGeeX

一篇《如何用 CodeGeeX 替代 GitHub Copilot》的文章在开发者社区登上热榜&#xff0c;开发者关注的AI生成代码工具CodeGeeX&#xff0c;这款插件产品目前支持在VSCode市场和Jetbrains IDEs下载使用&#xff0c;是国产对标Copilot目前安装量最大的开发者工具。 之所以引发开发…

开源数字人Fay

原文&#xff1a;别再因AI焦虑&#xff0c;这波年轻人已经用“中国版ChatGPT”创业成功了|数字人|AI|创业_新浪新闻 开源&#xff1a;GitHub - TheRamU/Fay: Fay是一个完整的开源项目&#xff0c;包含Fay控制器及数字人模型&#xff0c;可灵活组合出不同的应用场景&#xff1a…