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数据的地 ...
随机推荐
- composer 的使用和常用命令大全
composer 常用命令 1.composer初始化 init 如何手动创建 composer.json 文件.实际上还有一个 init 命令可以更容易的做到这一点. 查看当前版本composer ...
- BUUCTF Reverse-[FlareOn6]Overlong-动态调试
没有什么问题,直接进 三个函数,字符串也没啥特殊的 应该是个加密 返回上面分析 数据很大,你忍一下 也就是说它会找28位加密 然后我们接着分析 这个提示刚好28位 也就是说28位对应这个框 如果我们修 ...
- vue3 组合式 api 单文件组件写法
1 Vue3 组合式 API 的基本原理和理念 1.1 Vue3 中的 Composition API Vue3 中的 Composition API 是一种新的编写组件逻辑的方式,它提供了更好的代码 ...
- Spring Boot通过企业邮箱发邮件被Gmail退回的问题解决方法
这两天给我们开发的Chrome插件:Youtube中文配音增加了账户注册和登录功能,其中有一步是邮箱验证,所以这边会在Spring Boot后台给用户的邮箱发个验证信息.如果发邮件,之前的文章教程里就 ...
- java与es8实战之六:用JSON创建请求对象(比builder pattern更加直观简洁)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<java与es8实战>系 ...
- tarjan强连通分量
int scc[N],sc;//结点i所在scc的编号 int sz[N]; //强连通i的大小 //dfn(u)为搜到结点u时的次序编号 //low(u)为u或u的子树能够追溯到的最早的栈中节点的次 ...
- MySQL系列之备份恢复——运维在备份恢复方面、备份类型、备份方式及工具、逻辑备份和物理备份、备份策略、备份工具使用-mysqldump、企业故障恢复案例、备份时优化参数、MySQL物理备份工具
文章目录 1. 运维在数据库备份恢复方面的职责 1.1 设计备份策略 1.2 日常备份检查 1.3 定期恢复演练(测试库) 1.4 故障恢复 1.5 迁移 2. 备份类型 2.1 热备 2.2 温备 ...
- Go with Protobuf
原文在这里. 本教程为 Go 程序员提供了使用Protocol buffer的基本介绍. 本教程使用proto3向 Go 程序员介绍如何使用 protobuf.通过创建一个简单的示例应用程序,它向你展 ...
- Pandas 读取 Excel 斜着读
读取 Excel 斜着读数据 import pandas as pd def read_sideling(direction, sheet_name, row_start, col_start, ga ...
- Kubernetes:kube-apiserver 之 scheme(二)
接 Kubernetes:kube-apiserver 之 scheme(一). 2.2 资源 convert 上篇说到资源版本之间通过内部版本 __internal 进行资源转换.这里进一步扩展介绍 ...