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. composer 的使用和常用命令大全

    composer 常用命令 1.composer初始化 init 如何手动创建 composer.json 文件.实际上还有一个 init 命令可以更容易的做到这一点. 查看当前版本composer ...

  2. BUUCTF Reverse-[FlareOn6]Overlong-动态调试

    没有什么问题,直接进 三个函数,字符串也没啥特殊的 应该是个加密 返回上面分析 数据很大,你忍一下 也就是说它会找28位加密 然后我们接着分析 这个提示刚好28位 也就是说28位对应这个框 如果我们修 ...

  3. vue3 组合式 api 单文件组件写法

    1 Vue3 组合式 API 的基本原理和理念 1.1 Vue3 中的 Composition API Vue3 中的 Composition API 是一种新的编写组件逻辑的方式,它提供了更好的代码 ...

  4. Spring Boot通过企业邮箱发邮件被Gmail退回的问题解决方法

    这两天给我们开发的Chrome插件:Youtube中文配音增加了账户注册和登录功能,其中有一步是邮箱验证,所以这边会在Spring Boot后台给用户的邮箱发个验证信息.如果发邮件,之前的文章教程里就 ...

  5. java与es8实战之六:用JSON创建请求对象(比builder pattern更加直观简洁)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<java与es8实战>系 ...

  6. tarjan强连通分量

    int scc[N],sc;//结点i所在scc的编号 int sz[N]; //强连通i的大小 //dfn(u)为搜到结点u时的次序编号 //low(u)为u或u的子树能够追溯到的最早的栈中节点的次 ...

  7. MySQL系列之备份恢复——运维在备份恢复方面、备份类型、备份方式及工具、逻辑备份和物理备份、备份策略、备份工具使用-mysqldump、企业故障恢复案例、备份时优化参数、MySQL物理备份工具

    文章目录 1. 运维在数据库备份恢复方面的职责 1.1 设计备份策略 1.2 日常备份检查 1.3 定期恢复演练(测试库) 1.4 故障恢复 1.5 迁移 2. 备份类型 2.1 热备 2.2 温备 ...

  8. Go with Protobuf

    原文在这里. 本教程为 Go 程序员提供了使用Protocol buffer的基本介绍. 本教程使用proto3向 Go 程序员介绍如何使用 protobuf.通过创建一个简单的示例应用程序,它向你展 ...

  9. Pandas 读取 Excel 斜着读

    读取 Excel 斜着读数据 import pandas as pd def read_sideling(direction, sheet_name, row_start, col_start, ga ...

  10. Kubernetes:kube-apiserver 之 scheme(二)

    接 Kubernetes:kube-apiserver 之 scheme(一). 2.2 资源 convert 上篇说到资源版本之间通过内部版本 __internal 进行资源转换.这里进一步扩展介绍 ...