用C语言做一个小游戏——扫雷

扫雷这个小游戏大家都知道,这里讲解简单版本的扫雷,即点到一个位置显示出周围8个位置雷的数量。

首先思路:

1.

因为需要对雷进行显示,布置两个棋盘。一个棋盘用来布置雷的信息,另一个棋盘用来展示给用户看来使游戏继续进行。用二维数组来存游戏的信息。

2.

这里以9*9的棋盘为例。

为了不越界,布置的棋盘要大一圈

那布置雷的大一圈,为了保持数组坐标同步,那就让排查雷的也大一圈,在其中9*9的内部操作。

3.

初始化mine和show数组,一个全‘0’,一个全‘*’。

初始化的时候,把初始化内容也通过函数参数带过去。

4.

打印棋盘,把show棋盘打印出来

11*11的数组,但是只显示中间的9*9

注意,打印棋盘行列标的时候多运行程序进行改进。

5.

布置雷,在打印前

布置雷,在9*9的棋盘里面 用rand函数来布置布置,count个雷

注:有雷的地方不再布置

6.排雷

点到雷 炸死

不是雷 创建个新函数看周围有几个雷打印出来

一开始用0和1来布置棋盘,目的是:ASCII码相减正好是1,方便统计

排查到一个显示一个(打印一次棋盘)

game.h游戏中用到的头文件及函数声明

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY 10
#define MIDDLE 20
#define DIFFICULT 30
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);
//打印
void display_board(char arr[ROWS][COLS], int rows, int cols);
//布置雷
void set_boom(char arr[ROWS][COLS], int row, int col);
//排雷
void clear_boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
       //创建
       char mine[ROWS][COLS] = { 0 };
       char show[ROWS][COLS] = { 0 };
       //初始化
       init_board(mine, ROWS, COLS, '0');
       init_board(show, ROWS, COLS,'*');
       //打印
       display_board(show, ROWS, COLS);
       //布置雷
       set_boom(mine, ROW, COL);
       //display_board(mine, ROWS, COLS);
       //排雷
       clear_boom(mine,show, ROW, COL);
}
void menu()
{
       printf("**************\n");
       printf("*** 1.play ***\n");
       printf("*** 0.exit ***\n");
       printf("**************\n");
}
void test()
{
       int input = 0;
       srand((unsigned int)time(NULL));
       do
       {
              menu();
              printf("请选择:");
              scanf("%d", &input);
              switch (input)
              {
              case 1:
                     printf("游戏开始!\n");
                     game();
                     break;
              case 0:
                     printf("退出游戏!\n");
                     break;
              default:
                     printf("选择错误,请重新选择:\n");
                     break;
              }
       } while (input);
}
int main()
{
       test();
       return 0;
}

game.c游戏的实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
       int i = 0;
       int j = 0;
       for (i = 0; i < rows; i++)
       {
              for (j = 0; j < cols; j++)
              {
                     arr[i][j] = set;
              }
       }
}
//打印
void display_board(char arr[ROWS][COLS], int rows, int cols)
{
       int i = 0;
       int j = 0;
       for (i = 0; i < 10; i++)
       {
              printf("%d ", i);
       }
       printf("\n");
       for (i = 1; i < rows-1; i++)
       {
              printf("%d ", i );
              for (j = 1; j < cols-1; j++)
              {
                     printf("%c ", arr[i][j]);
              }
              printf("\n");
       }
}
//布置雷
void set_boom(char arr[ROWS][COLS], int row, int col)
{
       int x = 0;
       int y = 0;
       int count = EASY;
       while (count)
       {
              x = rand() % row + 1;
              y = rand() % col + 1;
              if (arr[x][y] == '0')
              {
                     arr[x][y] = '1';
                     count--;
              }
       }
}
//显示输入坐标周围雷的信息
int sround(char arr[ROWS][COLS], int x, int y)
{
       return arr[x - 1][y - 1]
              + arr[x - 1][y]
              + arr[x - 1][y + 1]
              + arr[x][y - 1]
              + arr[x][y + 1]
              + arr[x + 1][y - 1]
              + arr[x + 1][y]
              + arr[x + 1][y + 1] - 8 * '0';
}
//排雷
void clear_boom(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
       int x = 0;
       int y = 0;
       int pai = 0;
       while(pai<row*col-EASY)
       {
              printf("请输入要排查雷的坐标:");
              scanf("%d %d", &x, &y);
              if (x >= 1 && x <= row && y >= 1 && y <= col)
              {
                     if (mine[x][y] == '1')
                     {
                           //炸到了
                           printf("哈哈哈哈哈哈哈你被炸死了\n");
                           display_board(mine, ROWS, COLS);
                           break;
                     }
                     else
                     {
                           //没炸到,打印周围雷的个数
                           int ret = sround(mine, x, y);
                           show[x][y] = ret + '0';
                           //打印下排查后的棋盘
                           display_board(show, ROWS, COLS);
                           pai++;
                     }
              }
              else
              {
                     printf("坐标输入错误,请重新输入!\n");
              }
       }
       if (pai == row * col - EASY)
       {
              printf("恭喜您,扫雷成功!\n");
       }
}

上一篇:JZ13 机器人的运动范围


下一篇:第五章 树和二叉树