C语言-使用二维数组实现扫雷

C语言多文件编程简单实现扫雷

扫雷游戏规则简介:

点击一个坐标后会判断该处是否是雷:

1、是雷则游戏结束

2、不是雷则会,计算并显示它的周围(围绕的8个块)雷的个数

扩散问题:

当判断一个块不是雷的同时,计算它的周围的8个块周围雷的个数,迭代计算它的周围的8个块,周围雷个数为零的块继续迭代,直接至附近再没有这样的块为止。

 

实现:

1、创建两个二维数组,一个数组mine进行雷的布置,初始化为字符‘0’,另一个数组show则是用来显示用户棋盘,初始化为字符‘*’

2、然后对数组mine设置雷,用户输入的坐标与mine数组进行找雷的相应处理,对应修改用户棋盘数组show。

下面是具体的操作及代码:

创建建了三个文件:

  • game.h中是各个函数的声明,以及宏定义等
  • game.c对游戏相关函数的实现
  • test.c中是主函数以及菜单的实现

test.c代码:


# define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("***********************************************\n"); printf("*************** 1. play ******************\n"); printf("*************** 0. exit ******************\n"); printf("***********************************************\n"); } void game() { //存放布置好雷的信息 char mine[ROWS][COLS] = { 0 }; //存放排查出的雷的信息 char show[ROWS][COLS] = { 0 }; //初始化 InitBoard(mine, ROWS, COLS, '0'); InitBoard(show, ROWS, COLS, '*'); system("cls"); //打印棋盘 DisplayBoard(show, ROW, COL); //布雷 SetMine(mine, ROW, COL); //排查雷 FindMine(mine, show, ROW, COL); } void test() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("重新选择:>"); break; } } while (input); } int main() { test(); return 0; }

game.h代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define EASY_COUNT 79
#define ROW 9
#define COL 9

#define ROWS ROW+2
#define COLS COL+2

void InitBoard(char Board[ROWS][COLS], int rows, int cols, char set);//初始化棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);//打印棋盘
void SetMine(char mine[ROWS][COLS], int row, int col);//布雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//扫雷

game.c代码:

#include "game.h"

void InitBoard(char Board[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++)
        {
            Board[i][j] = set;
        }
    }

}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i <= col; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);
        for (j = 1; j <= col; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");

    }

}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    int count = EASY_COUNT;
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }

}
int GetMine(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] +
        mine[x + 1][y + 1] +
        mine[x][y + 1] +
        mine[x - 1][y + 1] +
        mine[x + 1][y - 1] - 8 * '0');

}
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{

            int temp = 0;
        if (show[x][y] == '*')
        {
            show[x][y] = GetMine(mine, x, y) + '0';
        }
        
        if (mine[x][y - 1] == '0'&& y - 1 >= 1 && show[x - 1][y] == '*')//1 x, y - 1
        {
            if ((temp = GetMine(mine, x, y - 1)) == 0)
            {
                show[x][y -1] = temp + '0';
                OpenMine(mine, show, x - 1, y);
            }
        }
        if (mine[x][y + 1] == '0'&& y + 1 <= COL && show[x][y + 1] == '*')//2 x, y + 1
        {
            if ((temp = GetMine(mine, x, y + 1)) == 0)
            {
                OpenMine(mine, show, x, y + 1);
                show[x][y + 1] = temp + '0';
            }
        }
        if (mine[x + 1][y] == '0'&& x + 1 <= ROW && show[x + 1][y] == '*')//3 x + 1, y
        {
            if ((temp = GetMine(mine, x + 1, y)) == 0)
            {
                OpenMine(mine, show, x + 1, y);
                show[x + 1][y] = temp + '0';
            }
        }
        if (mine[x - 1][y] == '0'&& x - 1 >=1 && show[x - 1][y] == '*')//4 x - 1, y
        {
            if ((temp = GetMine(mine, x - 1, y)) == 0)
            {
                OpenMine(mine, show, x - 1, y);
                show[x - 1][y] = temp + '0';
            }
        }
        if (mine[x - 1][y + 1] == '0'&& x - 1 >=1 && y + 1 <= COL && show[x - 1][y + 1] == '*')//5 x - 1, y + 1
        {
            if ((temp = GetMine(mine, x - 1, y + 1)) == 0)
            {
                OpenMine(mine, show, x - 1, y + 1);
                show[x - 1][y + 1] = temp + '0';
            }
        }
        //6 x + 1, y - 1
        if (mine[x + 1][y - 1] == '0'&& x + 1 <= ROW && y - 1 >= 1 && show[x + 1][y - 1] == '*')
        {
            if ((temp = GetMine(mine, x + 1, y - 1)) == 0)
            {
                OpenMine(mine, show, x + 1, y - 1);
                show[x + 1][y - 1] = temp + '0';
            }
        }
        //7 x + 1, y + 1
        if (mine[x + 1][y + 1] == '0'&& x + 1 <= ROW && y + 1 <= COL && show[x + 1][y + 1] == '*')
        {
            if ((temp = GetMine(mine, x + 1, y + 1)) == 0)
            {
                OpenMine(mine, show, x + 1, y + 1);
                show[x + 1][y + 1] = temp + '0';
            }
        }
}
int CountBoard(char show[ROWS][COLS]) {
//判断是否已经排查出所有雷
int i = 0; int j = 0; int count = 0; for (i = 1; i <= ROW; i++) { for (j = 1; j <= ROW; j++) { if (show[i][j] == '*') { count++; } } } if (count == EASY_COUNT) { return 0; } else { return 1; } } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { // int x = 0; int y = 0; //9*9 - ASY_COUNT = 71 while (CountBoard(show)) { printf("请输入排查的坐标:>"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (mine[x][y] == '1') { system("cls"); printf("很遗憾,你被炸死了!!!!!\n"); DisplayBoard(mine, row, col); break; } else { OpenMine(mine, show, x, y); system("cls"); DisplayBoard(mine, row, col); DisplayBoard(show, row, col); } } else { printf("请注意,坐标有误,请重新输入:>"); } } if (CountBoard(show) == 0) { printf("恭喜你,排雷成功!!!\n"); DisplayBoard(mine, row, col); } }

 

 

posted @ 2020-10-13 22:06  f-a-dd  阅读(297)  评论(0)    收藏  举报