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. docker网络 bridge 与overlay 模式

    转载请注明出处: 1.bridge网络模式 工作原理:  在Bridge模式中,Docker通过创建一个虚拟网络桥接器(bridge)将容器连接到主机上的物理网络接口.每个容器都会被分配一个IP地址, ...

  2. Oracle数据库字符集概述及修改方式

    1.字符集概述 Oracle语言环境的描述包括三部分:language.territory.characterset(语言.地域.字符集) language:主要指定服务器消息的语言,提示信息显示中文 ...

  3. P4327题解

    思路 分组计算 以下图为例: ..#.. .#.. .*.. .#.. .#.#. #.#. *.*. #.#. #.X.# .X.* .X.* .X.# .#.#. #.#. *.*. #.#. . ...

  4. MQTT vs. XMPP,哪一个才是IoT通讯协议的正解

    MQTT vs. XMPP,哪一个才是IoT通讯协议的正解 这是个有趣的话题! 先来聊几个小故事. 关于我和MQTT 我在人生第一个IoT项目里,第一次接触到MQTT协议. 我很快就理解了这个协议.因 ...

  5. Android 调试桥 (adb) 使用教程/示例

    sidebar: auto Android 调试桥 (adb) Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令可用于执行各种设备操作,例如安装和调试 ...

  6. 当你使用Taro时,你需要了解的一些事儿

    2017 年 1 月 9 日凌晨,万众期待的微信小程序正式上线,前有跳一跳等爆圈小游戏的带动,后有特殊时期下各类健康码小程序的加持,小程序成为了国内技术圈独树一帜的存在.但随着小程序的迅猛发展,其实在 ...

  7. Springboot优雅参数校验,统一响应,异常处理

    1.统一响应 (1)统一状态码 首先定义一个状态码接口,所有状态码都需要实现它 public interface StatusCode { public int getCode(); public S ...

  8. [HNCTF 2022 WEEK2]e@sy_flower

    花指令分析 如果没接触过花指令,先看这个博客,大致了解一下花指令 https://www.cnblogs.com/Here-is-SG/p/15802040.html 点击此处下载附件 查壳 32位, ...

  9. Rockchip rk3588 U-Boot详解 (三)

    Rockchip rk3588 U-Boot详解 (三) 专栏总目录 1.1 Environment-Variables ENV(Environment-Variables)是U-Boot支持的一种全 ...

  10. 【动画进阶】神奇的背景,生化危机4日食 Loading 动画还原

    最近,在 Steam 玩一款老游戏(生化危机 4 重置版),其中,每当游戏转场的过程中,都有这么一个有趣的 Loading 动画: 整个效果有点类似于日食效果,中间一圈黑色,向外散发着太阳般的光芒. ...