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语言数组实现扫雷的更多相关文章

  1. C语言二维数组实现扫雷游戏

    #include<stdio.h> //使用二维数组实现 扫雷 int main() { char ui[8][8]={ '+','+','+','+','+','+','+','+', ...

  2. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  3. C语言 数组 列优先 实现

    C语言数组结构列优先顺序存储的实现 (GCC编译). 从行优先转换为列优先存储方式, 与行优先相比, 不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址. /** * @brief ...

  4. C语言 数组 行优先 实现

    C语言数组结构行优先顺序存储的实现 (GCC编译). /** * @brief C语言 数组 行优先 实现 * @author wid * @date 2013-11-02 * * @note 若代码 ...

  5. 不可或缺 Windows Native (5) - C 语言: 数组

    [源码下载] 不可或缺 Windows Native (5) - C 语言: 数组 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 数组 示例cArray.h #ifn ...

  6. C语言数组

    在C语言中,对于三维或三维以上数组的使用并没有很好的支持,而且使用率也非常的低,后面会对三维数组做一些简单的分析,这篇文章主要以二维数组来探讨一些C语言中数组使用的相关概念和技巧. 1 一个var[i ...

  7. C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

    1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include &l ...

  8. Go语言数组的使用

    Go 语言数组 Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0 ...

  9. Go 语言数组

    Go 语言提供了数组类型的数据结构. 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形.字符串或者自定义类型. 相对于去声明number0, number ...

  10. C语言 > 数组和指针

    C语言 数组和指针 const: 关于指针和const需要注意一些规则.首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的. 然而,只能把非const数据的地 ...

随机推荐

  1. mysql拓展

    事务定义 就是将一组SQL语句放在同一批次内去执行 如果一个sql语句出错,则改批次内的所有sql都将被取消执行 (1)原子性 一个事务要么全部提交成功,要么全部失败回滚,不能只执行其中的一部分操作, ...

  2. win10右键添加打开cmd窗口的命令

    创建文本文档,复制如下内容: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\b ...

  3. [FlareOn4]login-buu ctf

    打开压缩包 是个html,我直接???? 这不是web弄的吗 离谱了,不过f12还是会的 不过其中的逻辑还是比较清楚的 先用伪代码确定加密逻辑,再直接写直接进行爆破解码 wo cao,wrong!fl ...

  4. 半导体行业通信标准SECS/GEM协议一看就懂的

    半导体行业通信标准SECS/GEM透析 HSMS通信的设备端通常为客户端(Equipment)(也可称为Active 在通信中主动连接对方的),工厂会部署服务端(Host)(也可称为Passive 被 ...

  5. AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通

    本文收集于教程合集:AIGC从入门到精通教程汇总 我是小梦,以浅显易懂的方式,与大家分享那些实实在在可行之宝藏. 历经耗时数十个小时,总算将这份Stable Diffusion的使用教程整理妥当. 从 ...

  6. CodeForces 1343E Weights Distributing

    题意 多组样例 给定\(n,m,a,b,c\),给定一个长度为\(m\)的数组\(p[]\),给定\(m\)条边,构成一个\(n\)个点\(m\)条边的无向图,\(Mike\)想要从\(a\)走到\( ...

  7. Elasticsearch之环境搭建

    一.安装 elasticsearch -- 拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.9.1 -- 创建 doc ...

  8. 华为云ECS上搭建Hadoop集群环境启动时报错“java.net.BindException: Cannot assign requested address”问题的解决

    启动时使用: ./sbin/start-all.sh 1 报错: java.net.BindException: Problem binding to [test7972:9000] java.net ...

  9. Kali-Linux-配置开发环境

    本文主要讲解JDK.SDK.eclipse-adt.android studio.cpu模式TensorFlow 的安装配置.update:2019-08-30 03:31:46 JDK 当前系统jd ...

  10. pbjs 无法编码 bytes 类型数据问题的解决方案

    问题背景 之前写过一篇<使用脚本收发 protobuf 协议数据>,通过 pbjs 命令可以将 protobuf 二进制数据转换为 json: > pbjs msg.proto -- ...