扫雷 第二次完成较复杂游戏感悟

简介: 扫雷 第二次完成较复杂游戏感悟

前言


(本文章没有将扫雷的爆炸式展开实现,将放在下一篇文章中实现。)


依旧是跑路的我,今天搞了搞扫雷再次巩固一下基础知识,准备c语言进阶了。

扫雷嘛,大家基本都玩过所以就不过多介绍了先把这次代码的思路放在下面:


我们依旧分为三个源文件来进行程序设计分别是

test.c 负责程序的设计主函数的布置

game.c 负责函数的实现

game.h 负责函数的引用以及定义宏


一、代码及易错分析


test.c 内容

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void meun()
{
  printf("++++++++++++++++++++++++++++++\n");
  printf("++++++++++ 1.play ++++++++++++\n");
  printf("++++++++++ 0.exit ++++++++++++\n");
  printf("++++++++++++++++++++++++++++++\n");
}
void game()
{
  char mark1 = '0';
  char mark2 = '*';
  char show[ROWS][COLS] = { 0 };//布置的数组
  char mine[ROWS][COLS] = { 0 };//储存雷的数组
  //数组的初始化。
  Initboard(show, ROWS, COLS, mark2);//初始化show
  Initboard(mine, ROWS, COLS, mark1);//初始化mine
  //布置雷
  setmine(mine, ROW, COL);
  //数组的打印
  display(show, ROW, COL);
  //display(mine, ROW, COL);//用来储存雷的信息
  //排雷
  playmove(show, mine, ROW, COL);
}
int main(void)
{
  int i = 0;
  do
  {
    srand(time(NULL));//设置随机数
    meun();
    printf("请输入1/0>:");
    scanf("%d", &i);
    switch (i)
    {
    case 1:
      printf("开始三子棋游戏\n");
      game();
      break;
    case 0:
      printf("退出成功\n");
      break;
    default:
      printf("输入错误,请重新输入\n");
      break;
    }
  } while (i);
    return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols, char mark)
{
  int n = 0;
  int i = 0;
  for (i = 0; i < cols; i++)
  {
    for (n = 0; n < rows; n++)
    {
      board[n][i] = mark;
    }
  }
}
//易错点在传参时依旧要将board[ROWS][COLS]
//二维数组要一致
//行列按需要传输
void display(char board[ROWS][COLS],int row,int col)
{
  int i = 0;
  int j = 0;
  printf("0");
  for (i = 1; i <= row; i++)
  {
    printf(" %d", i);
  }
  printf("\n");
  for (i = 1; i <= col; i++)//从1行1列开始打印
  {
    printf("%d", i);
    for (j = 1; j <= row; j++)//从1行1列开始打印
    {
      printf(" %c", board[i][j]);//易错点一定是先打印一行而后换行打印列
    }
    printf("\n");
  }
}
void setmine(char mine[ROWS][COLS], int row, int col)//布置雷
{
  int count = COUNT;//使用COUNT在头文件里定义可以方便未来改数据
  while (count)
  {
    unsigned int x = rand() % row+1;
    unsigned int y = rand() % col+1;
    if (mine[x][y] == '0')
    {
      mine[x][y] = '1';
      count--;
    } 
  }
}
int count(char mine[ROWS][COLS], int x, int y)//计算游戏次数到达次数后胜利
{
  return mine[x - 1][y] 
       +mine[x - 1][y - 1] 
       +mine[x][y - 1]
       +mine[x + 1][y - 1]
       +mine[x+1][y]
       +mine[x+1][y+1]
       +mine[x][y+1]
       +mine[x-1][y+1]-8*'0';
}
void playmove(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
  int x = 0;
  int y = 0;
  while (1)
  {
    printf("请输入坐标>:");
    scanf("%d %d", &x, &y);
    int win = 0;
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (mine[x][y] == '1')
      {
        //碰到雷死亡.
        printf("你碰到雷了\n");
        printf("游戏结束\n");
        break;
      }
      else if (mine[x][y] == '0')
      {
        //正常进行
        int z = count(mine, x, y);
        show[x][y] = z + '0';//因为要用字符数字所以加上'0'
        display(show, ROW, COL);
        win++;
      }
    }
    else
    {
      printf("输入错误,请重新输入。\n");
    }
    if (win == row * col - COUNT)
    {
      printf("恭喜你,成功排完所有雷\n");
      break;
    }
  }
}

易错点在相应位置注释处

我在这里总结性强调一下

1.在接收二维数组时一定要与传递的二维数组保持一致列和行数。

2.在display函数打印时一定要注意从行开始打印不然后续程序都会出问题。

3.在打印函数display要从第一行第一列开始打印(为了防止越界访问我们要将二维数组空出一圈及11 11的数组我们只用 9 9 )


game.h


声明和定义宏

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROWS 11
#define COLS 11
#define COUNT 10//雷的数目
#define ROW ROWS-2
#define COL COLS-2
void Initboard(char board[ROWS][COLS], int rows, int cols, char mark);
void display(char board[ROW][COL], int row, int col);
void setmine(char mine[ROWS][COLS], int row, int col);
void playmove(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);

增加扫雷的展开

void unfold(char show[ROWS][COLS], char mine[ROWS][COLS], int x, int y)
{
  int ret = count(mine, x, y);
  if (ret == 0)
  {
    show[x][y] = ' ';
    if (x - 1 > 0 && y > 0 && show[x - 1][y] == '*')
    {
      unfold(show, mine, x - 1, y);
    }
    if (x - 1 > 0 && y-1 > 0 && show[x - 1][y-1] == '*')
    {
      unfold(show, mine, x - 1, y-1);
    }
    if (x - 1 > 0 && y+1 > 0 && show[x - 1][y+1] == '*')
    {
      unfold(show, mine, x - 1, y+1);
    }
    if (x > 0 && y > 0 && show[x][y] == '*')
    {
      unfold(show, mine, x, y);
    }
    if (x > 0 && y-1 > 0 && show[x][y-1] == '*')
    {
      unfold(show, mine, x, y-1);
    }
    if (x > 0 && y+1 > 0 && show[x][y+1] == '*')
    {
      unfold(show, mine, x, y+1);
    }
    if (x + 1 > 0 && y > 0 && show[x + 1][y] == '*')
    {
      unfold(show, mine, x + 1, y);
    }
    if (x + 1 > 0 && y > 0 && show[x + 1][y-1] == '*')
    {
      unfold(show, mine, x + 1, y-1);
    }
    if (x + 1 > 0 && y > 0 && show[x + 1][y+1] == '*')
    {
      unfold(show, mine, x + 1, y+1);
    }
  }
}

使用递归完成


总结


(又把game.c 哪搬过来了方便查看)

1.在接收二维数组时一定要与传递的二维数组保持一致列和行数。

2.在display函数打印时一定要注意从行开始打印不然后续程序都会出问题。

3.在打印函数display要从第一行第一列开始打印(为了防止越界访问我们要将二维数组空出一圈及11 11的数组我们只用 9 9 )

后续文章会讲扫雷的爆炸式展开

再见咯


相关文章
三子棋小游戏思路及代码实现的详解
三子棋小游戏思路及代码实现的详解
78 0
|
3月前
|
C语言
猜数游戏(实现) 后附源码
本文介绍了如何使用C语言实现一个猜数游戏,包括游戏的逻辑流程、代码实现以及如何通过随机数生成器和时间戳生成一个1到100之间的随机数。
100 2
猜数游戏(实现) 后附源码
|
3月前
|
C语言
迟来的扫雷游戏
本文详细介绍了如何用C语言编写一个简单扫雷游戏,包括代码框架、关键函数如初始化棋盘、埋雷、显示雷数和玩家操作的实现。通过test.c、game.c和game.h文件的分工,展示了游戏逻辑的逐步构建。
31 0
|
开发者
你应该试着独自做个游戏
对于大部分从事游戏开发行业的人,其实并没有机会能够完整的去掌控一个游戏制作的全过程。开发的只负责开发工作,美术的只负责美术工作,大概只有策划能够有机会从整体上了解一个游戏,可能在很多公司中,对于策划也分为很多种,如果只是其中的一种策划,也是没有机会的,唯一一个能够从始至终掌控一个游戏的大概叫做总策划或者叫产品经理。
100 0
零基础VB教程067期:贪吃蛇游戏开发第三节 撞墙会挂的
零基础VB教程067期:贪吃蛇游戏开发第三节 撞墙会挂的
|
数据挖掘 开发者
关于泡泡龙游戏的一点儿总结,以及分享一个好方法
游戏是一种虚拟的产品,它很难被量化,也很难像工厂流水线生产实体产品一样的去生产。因为其中涉及到的情况太多太杂,如何衡量一个游戏的体量?怎样的游戏算是大游戏,怎样的游戏算是小游戏呢?如何判断一个游戏是做完了还是没有做完呢?如何衡量一个游戏开发者的水平呢?……等等等等。这里面的每一个因素都是一个变量,这么多的无法确定的变量合在一起,想要得到一个确定的结果,很显然是不太可能的。
173 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏13之英雄不要走出屏幕
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏13之英雄不要走出屏幕
158 0
|
数据可视化 安全 C语言
C语言程序设计——扫雷游戏
C语言程序设计——扫雷游戏
145 0
C语言程序设计——扫雷游戏
想过七夕?->女朋友陪你玩游戏(C)(下)
七夕到了,没有女朋友怎么办?没事~ 写一个小游戏,让女朋友陪你玩扫雷~
想过七夕?->女朋友陪你玩游戏(C)(下)

相关实验场景

更多