扫雷游戏 高度还原(上)

简介: 扫雷游戏 高度还原

基本思路:

首先 如果按照上次我们写三子棋设置game.h game.c work.c 这一次扫雷游戏的编写因为 要用到全局变量 而 为了保证一局游戏结束后 我们再次选择玩游戏这些变量能够被初始化 所以这次我们就只有 game.h 和 game.c了

来看我们的开始操作部分:


开始部分:

我们首先要给玩家在界面上显示一个 选择界面 所以要编写一个menu函数

menu()
{
  printf("**********************\n");
  printf("**********1.play******\n");
  printf("**********0.exit******\n");
  printf("*********请 选 择*****\n");
  printf("**********************\n");
}

然后开始:

int main()
{
  srand((unsigned int)time(NULL));//因为后面我们布置雷采用的是一种随机的方式 所以这里要先用
  int input;                      //一下srand函数 因为我们的主函数是一定会执行的 所以我们把
  do                              //这个放在了主函数里面
  {
    memset(arr, 0, sizeof arr);
    int ret = 0;
    int A;
    int B = 1;//这一部分的变量 都是我们后面要用的 放在这里是为了我们完成一次游戏后还能把这些
    menu();   //变量变成开始的样子
    printf("---------------------------\n");
    scanf("%d", &input);
    switch (input)
    {
    case 1:
      play(); 
      break;
    case 0:
      printf("您已经退出游戏\n");
      break;
    default:
      printf(" 对不起你选择的选项不存在 请重新输入!\n");
    }
  } while (input);
  return 0;
}

因为 1 为真 这里我们选择了玩游戏(1)时 玩完游戏 play()返回来执行break 这时break 跳出的是 switch选择语句 这样程序就会来到do-while的判断部分 我们选的是 1 就会循环 让我们再次下选择 选择的 0 的话 到了do-while的判断部分就会跳出来 结束游戏啦


开始游玩:

我们来理一下思路:

因为 我们后面编写的 插旗(表示你判断这个位置是雷)函数 和 撤旗函数 涉及到了字符的变化

如果把所有的棋盘信息全部塞到一个二维数组里面 这样后面编写起来肯定是更麻烦的

所以 我们就需要增加一个来分担我们的压力:

还有一个要说的点因为我们扫雷嘛 肯定会去排查你选的坐标周围一圈是否有雷 如果我们只是定义的9×9的数组的话 那我们在排查我们的边界时 寻找周围有没有雷这样不就越界了嘛

5fb286f3a9b4405da9568dc4d948ce2d.png


所以我们就要在行和列上各多加两行 这个时候就需要定义11×11的数组 我们这里用到的ROWS COWS都是11

#define ROW 9
#define COW 9//因为我们后面还有用到行和列的数字所以这个也要define一下
#define ROWS ROW+2//改变数组大小的时候就只需要改变一下ROW COW就可以了
#define COWS COW+2 


棋盘所需数组的定义:

    //初始化数组
  char mine[ROWS][COWS] = { 0 };//这个数组用于存放我们布置雷的信息
  char show[ROWS][COWS] = { 0 };//这个数组用于给我们玩家展示玩家选择一些操作后棋盘的变化

之所以采用字符型数组 因为我们后面会用到多种符号 如果用数字来区别的话 会不方便要不好区别出来所以我们就用字符型数组 遇到要用数字的时候也可以用字符数字来表示 只不过要了解字符数字 和 整型数字之间怎样转换 后面我们会讲到的 嘻嘻

数组定义好了 我们肯定就要开始制作棋盘了 在这里首先要说一下这个:

  1. mine数组里面 我们用字符 '0' 来表示 不是雷 字符 '1'表示 是雷(当然也是可以用其他符号的我们这里说一下这种怎么做)
  2. show数组里面 我们首先展示给玩家是一个未知的界面 我们用字符 '*'来实现

47e1a06735ef47308f3dd8b897d8cf74.png

这就是我们一开始要展示给玩家的界面


初始化棋盘:

在我们初始化棋盘前 我们还是要在我们创建的game.h文件里面声明一下这个函数

void make_borad(char arr[ROWS][COWS], int row, int cow, char ret);//初始化棋盘
void make_borad(char arr[ROWS][COWS], int row, int cow, char ret)//初始化棋盘
{                      //我们传进去的是一个11×11的数组 肯定也是用11×11的数组去接收
  int i;
  int j;
  for (i = 0; i < row; i++)
  {
    for (j = 0; j < cow; j++)
    {
      arr[i][j] = ret;
    }
  }
}
    //初始化棋盘
  make_borad(show, ROWS, COWS, '*');
  make_borad(mine, ROWS, COWS, '0');

这里之所以要用一个ret这个形参 是因为我们本身这两个数组初始化后 里面的内容就是不同的 show函数里面是 '*' mine函数里面是 '0' 所以这个时候我们就只需用不同形参 ret 传进去 这样就可以实现一个函数实现两个数组的初始化  


制作棋盘:

我们还是要先在我们创建的game.h里面声明这个函数

void dis_playborad(char mine[ROWS][COWS], int row, int cow);//制作并打印棋盘

然后在我们的game.c里面引用

dis_playborad(show, ROW, COW);//ROW和COW等于9

大家注意到了 那个棋盘的上面还有横坐标和竖坐标这样写是为了方便玩家找坐标

void dis_playborad(char show[ROWS][COWS], int row, int cow)//制作并打印棋盘
{
  int i;
  int j;
  printf("-------------------------\n");
  for (i = 0; i <= row; i++)
  {
    printf("%d ", i);//打印横坐标
  }printf("\n");      //打印完记得换行
  for (i = 1; i <= row; i++)
  {
    printf("%d ", i);每一行开始打印这一行的竖坐标
    for (j = 1; j <= row; j++)
    {
      printf("%c ", show[i][j]);//打印%c后面要加一个 空格 不然打印出来会很紧凑
    }
    printf("\n");//一行打印完记得换行
  }
  printf("-------------------------\n");
}

这样我们给玩家展示的界面就打印完了 然后就是给我们的 mine数组 里面布置雷


布置雷:

首先在我们的game.h里面声明

void put_mine(char mine[ROWS][COWS], int row, int cow);//布置雷

然后引用它:

put_mine(mine, ROW, COW);//布置雷

大家来看:

void put_mine(char mine[ROWS][COWS], int row, int cow)//布置雷
{
  ret = 0;
  for (int i = 0; i < MINE; )     //这里的MINE是雷的意思 我们在game.h里面给他定义的是10
  {                                //#define  MINE 10
    int x = rand() % row + 1;
    int y = rand() % cow + 1;
    if (mine[x][y] == '0')
    {
      mine[x][y] = '1';
      i++;
    }
  }
}

我们设置一个循环 每一次创建的随机值 只要布置成功 i 就加一 直到10个雷全部布置完

这里随机数的设定我给大家说一下是怎么回事:


rand函数 是用来生成一个随机数  头文件是<stdio.h> 返回类型是整型

返回 0~Rand_Max(32767)中的一个数


srand函数相当于是给rand函数生成一个起始点 就是让rang函数不再是从0开始到Rand_max 如果你给rand函数设置的起始点是固定的那么好几次生成的随机数

    srand(1);
  int x = rand();
  for (int i = 0; i < 5; i++)//这里五次输出 都是 41 
  {                          //如果说你在使用rand函数之前没有使用srand函数 那么结果和srand(1)
    printf("%d\n", x);     //是一样的
  }

所以我们要给srand函数里传入 一个变化的值 这个时候就要用到 time函数


time函数:

time函数这样定义的 这个函数的返回的类型是 time_t (就好比是int char)这个类型是一个无符号整型  但是不同平台这个类型的定义是不同的 我用的是 vs 而在vs里面是一个有符号的长整型

808d64dc4087420e924be1f42754663d.png

所以这里用的时候记得 给time函数进行强制转换 (如果你用的也是vs的话)

因为srand函数要求的是 我们给它传入的数要是一个无符号的数

其中time_t它返回从1970年1月1日零时零分零秒到目前为止所经过的时间

最后有一点 在我们使用这个函数之前 我们还要引用

srand函数:

这个函数他是这样的 void srand(unsigned seed)

他要求传入一个无符号的数

因为我们要让这个随机数是变化的 而rand函数 srand函数 time函数通常结合在一起使用

最终拿出来就是这样的 srand((unsign int)time(NULL) )  NULL的意思就是表示空的意思

你可以写 0


因为我们的主函数是一定会执行的所以我们就把 srand函数放到主函数里面去

对了 在使用它们之前出了 引头文件<time.h>还有一个<stdlib.h>哦!


这里的讲解我就照搬我上一篇文章说的了(转载 昶102的三子棋篇)

这样我们的雷就布置好了 嘻嘻 然后就要开始我们的重头戏 排查雷 了

目录
相关文章
|
7月前
|
存储 C语言
数组和函数实践:扫雷游戏玩法和棋盘初始化(1)
数组和函数实践:扫雷游戏玩法和棋盘初始化(1)
|
6月前
|
前端开发 小程序 API
技术心得记录:小程序—九宫格心形拼图
技术心得记录:小程序—九宫格心形拼图
33 0
|
7月前
|
定位技术 Python
Pyglet综合应用|推箱子游戏之关卡图片载入内存
Pyglet综合应用|推箱子游戏之关卡图片载入内存
107 0
|
7月前
扫雷游戏(优化版)
扫雷游戏(优化版)
62 0
扫雷游戏(优化版)
|
7月前
|
索引
消除游戏中图标下落的原理和实现
消除游戏中图标下落的原理和实现
50 1
|
图形学
Unity小游戏——怪物出现模式的管理
Unity小游戏——怪物出现模式的管理
132 0
|
C++
扫雷游戏 高度还原(下)
扫雷游戏 高度还原(下)
63 0
【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点
【unity2D横板】【sunnyland】敌人巡逻追击主角以及返回原点
|
开发工具 开发者 容器
彻底理解游戏开发中的绝对位置和相对位置
在游戏的世界中存在着两种位置,一种叫做绝对位置,一种叫做相对位置。在不同的游戏开发工具中这两种位置分别有着不同的别名,绝对位置有时也叫世界位置,或者 world position,而相对位置也叫本地位置(局部位置),或者 local position。
111 0
|
小程序 开发工具 开发者
理解游戏开发中的绝对位置和相对位置
本文主要内容带你彻底理解游戏开发中的绝对位置和相对位置的区别。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。 开始之前,推荐一下我的视频号,每天分享一点儿与做游戏有关的有用有趣的内容,欢迎大家关注一下。本文的内容主要也是对这期视频内容的应用和解释。
118 0
下一篇
DataWorks