C语言数组实现扫雷
C语言数组->实现扫雷
包含头文件
#include <stdio.h>
#include <stdlib.h> //用于生成随机数
#include <time.h> //用于产生随机种子
创建数组
int board[11][11]; //存放随机生成的“雷区”
int boardu[11][11]; //与用户交互的“雷盘”
- 需要创建两个数组,一个用于存放随机生成的“雷区”,一个用于与用户交互的“雷盘”
- 如果后期有兴趣丰富游戏内容(比如不同难度等),可以使用宏定义常量定义数组,这里只讲数组
- 这里设计的是9×9的雷盘,创建的是11×11的数组是为了 后面计算每个位置周围的雷数时,不产生越界访问
这里简单举个栗子:
如果我们要计算1×1这个位置周围的总雷数,难免会产生越界访问

我们可以给数组加上一圈

这样就很好的避免了越界访问
- 游戏框架设计(主程序框架、游戏进程框架)
//游戏进程框架函数
void game()
{
srand((unsigned)time(NULL)); //产生随机种子,用于后面随机数的生成
initBoard(); //初始化“雷区”、“雷盘”
do
{
printBoard(); //打印“雷盘”
int temp = 0;
while (1)
{
int x = 0, y = 0;
printf("Please enter coordinate->");
scanf("%d %d", &x, &y);
if (x > 0 && x < 10 && y > 0 && y < 10)
{
temp = sweeping(x, y); //排雷内部,变量接收返回值
break;
}
else
printf("Input error!Please enter again!->");
}
if (temp == -1) //如果用户“踩雷”,则退出循环
{
printBoard();
printf("You DIE!!\n");
break;
}
} while (1);
}
//主程序框架函数
int main()
{
do
{
int i = 0;
printf("1.Start the game!\n");
printf("2.Quit the game!\n");
printf("Please enter your choose->\n");
scanf("%d", &i);
switch (i)
{
case 1:
game();
break;
case 2:
return 0;
break;
default:
printf("Input error!Please enter again!->\n");
break;
}
} while(1);
}
- 初始化
void initBoard()
{
int i = 0, j = 0;
for (i = 0; i < 11; i++)
{
for (j = 0; j < 11; j++)
{
board[i][j] = 0; //0代表 无雷
boardu[i][j] = -2; //-2代表用户未“开拓"
}
}
int temp = 0;
while (1)
{
//随机生成 10 个雷,存放至“雷区”
int x = rand() % 8 + 1;
int y = rand() % 8 + 1;
if (board[x][y] == 0)
{
board[x][y] = -1;
temp++;
}
if (temp == 10)
break;
}
for (i = 1; i < 10; i++)
{
for (j = 1; j < 10; j++)
{
//计算每个 无雷的位置 周围(9个格子) 雷的数量,并存放至“雷区”
if (board[i][j] == -1)
continue;
int x = 0, y = 0,value = 0;
for (x = 0; x < 3 ; x++)
{
for (y = 0; y < 3; y++)
{
if (board[i - 1 + x][j - 1 + y] == -1)
value++;
}
}
board[i][j] = value;
}
}
}
- 打印“雷盘”
是时候展现真正的 艺术 了!这里简单打印一下,有兴趣的 帖子 可以升级一下
void printBoard()
{
int i = 0, j = 0;
printf("# 1 2 3 4 5 6 7 8 9 #\n"); //让用户能清晰对应坐标
for (i = 1; i < 10; i++)
{
printf("%d", i);
for (j = 1; j < 10; j++)
{
if (boardu[i][j] == -2) //如果“雷盘”中数值为初始值-2,说明用户还未“开采”此处,则打印 *
printf(" %c", '*');
else if (boardu[i][j] == -1) //如果“雷盘”中数值变成了-1,说明用户“开采”了此处,且此处是雷,则用 $ 表示
printf(" %c", '$');
else if (boardu[i][j] == 0) //如果“类盘”中数值变为0;也说明用户“开采”了此处,且此处无雷,用 空格 表示
printf(" %c", ' ');
else //此处打印用户开采出来的 周围雷的信息
printf(" %d", boardu[i][j]);
}
printf(" #\n");
}
printf("# # # # # # # # # # #\n");
}
- 游戏核心(怎样扫雷)
int sweeping(int x,int y) //传入用户输入的坐标
{
int i = 0, j = 0;
if (board[x][y] == -1) //判断是不是“踩雷”了
{
for (i = 1; i < 10; i++)
{
for (j = 1; j < 10; j++)
{
if (board[i][j] == -1) //如果“踩雷”了,将剩余所有的雷先显示出来
boardu[i][j] = -1;
}
}
return -1; //返回个-1,用来结束本局游戏
}
else //如果没踩雷,那就把周围 隐藏 的 信息 显示出来
{
for (i = x - 1; i < x + 2; i++)
{
for (j = y - 1; j < y + 2; j++)
{
if (board[i][j] != -1)
boardu[i][j] = board[i][j];
}
}
return 0;
}
}
C语言数组实现扫雷的更多相关文章
- C语言二维数组实现扫雷游戏
#include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...
- GO语言数组和切片实例详解
本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...
- C语言 数组 列优先 实现
C语言数组结构列优先顺序存储的实现 (GCC编译). 从行优先转换为列优先存储方式, 与行优先相比, 不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址. /** * @brief ...
- C语言 数组 行优先 实现
C语言数组结构行优先顺序存储的实现 (GCC编译). /** * @brief C语言 数组 行优先 实现 * @author wid * @date 2013-11-02 * * @note 若代码 ...
- 不可或缺 Windows Native (5) - C 语言: 数组
[源码下载] 不可或缺 Windows Native (5) - C 语言: 数组 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 数组 示例cArray.h #ifn ...
- C语言数组
在C语言中,对于三维或三维以上数组的使用并没有很好的支持,而且使用率也非常的低,后面会对三维数组做一些简单的分析,这篇文章主要以二维数组来探讨一些C语言中数组使用的相关概念和技巧. 1 一个var[i ...
- C语言数组:C语言数组定义、二维数组、动态数组、字符串数组
1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...
- Go语言数组的使用
Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...
- Go 语言数组
Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0, number ...
- C语言 > 数组和指针
C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...
随机推荐
- 并发工具类Phaser
前言 在面试这一篇我们介绍过CountDownLatch和CyclicBarrier,它们都是jdk1.5提供的多线程并发控制类,内部都是用AQS这个同步框架实现. 在我们的实际项目中,有很多场景是需 ...
- 【JMeter】常用线程组设置策略
常用线程组设置策略 目录 常用线程组设置策略 一.前言 二.单场景基准测试 1.介绍 2.线程组设计 3.测试结果 三.单场景并发测试 1.介绍 2.线程组设计 3.测试结果 四.单场景容量/爬坡测试 ...
- 使用阿里云ECS和RDS搭建个人博客
一.ECS实例配置 1.重置云服务器ECS密码 前往ECS控制台,点击实例,找到刚才开通的ECS实例(找不到的话就看一下上方的地区是否是你的服务器的地域),点击右侧操作栏中的三个点,找到重置实例密码, ...
- dotnet SemanticKernel 入门 自定义变量和技能
本文将告诉大家如何在 SemanticKernel 框架内定义自定义的变量和如何开发自定义的技能 本文属于 SemanticKernel 入门系列博客,更多博客内容请参阅我的 博客导航 自定义变量是一 ...
- 企业级低代码平台,通用代码生成平台,Java开源项目(附源码)
项目介绍 Jeecg-Boot 是一款基于代码生成器的智能开发平台!采用前后端分离架构:SpringBoot,Mybatis,Shiro,JWT,Vue&Ant Design.强大的代码生成器 ...
- 「codeforces - 1208F」Bits and Pieces
link. 考虑把原问题写成一个在 \(\left(\log_2 \max v \right) \times n\) 的矩阵里选出三列,我们首先预处理出 \(j \cap q\).具体,我们需要对于每 ...
- Solution -「CF 392C」Yet Another Number Sequence
Description Link. 求 \(\sum_{i=1}^{n}\text{fibonacci}_{i}\times i^{k}=\sum_{i=1}^{n}(F_{i-1}+\text{fi ...
- 在线问诊 Python、FastAPI、Neo4j — 构建问题分类器
目录 构建字典数据 构建 Trie 字典树 按实体组装字典 问题分析 将问题进行分析,和系统已有的分类进行关联 构建字典数据 将构建的知识图片字典化, 用于后面对问题的解析,下图为症状的字典,其它字典 ...
- umich cv-2-1
UMICH CV Linear Classifiers 对于使用线性分类器来进行图片分类,我们可以给出这样的参数化方法: 而对于这样一个式子,我们怎么去理解呢? 首先从代数的角度,这个f(x,W)就是 ...
- Django框架项目之支付功能——支付宝支付
文章目录 支付宝支付 入门 支付流程 aliapy二次封装包 GitHub开源框架 依赖 结构 alipay_public_key.pem app_private_key.pem setting.py ...