史上最简单的扫雷(C语言实现)

发布于:2023-01-26 ⋅ 阅读:(544) ⋅ 点赞:(0)

文章目录

 

游戏说明

游戏界面:可以选择开始游戏 或者退出

游戏操作:通过命令行输入坐标即可

我们使用二维数组来实现这个游戏

游戏效果展示

游戏代码

博友们可以将以下代码复制到自己的编译器当中运行:

#ifndef game_h
#define game_h

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS 9+ROW
#define COLS 9+COL
#define Easy_count 10
void init_board(char board[ROWS][COLS],int rows, int cols,char set);
void display_board(char board[ROWS][COLS],int rows, int cols);
void set_mine(char board[ROWS][COLS],int rows, int cols);
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols);
#endif /* game_h */
#include "game.h"
void init_board(char board[ROWS][COLS],int rows, int cols,char set)
{
    for (int i = 0; i <ROWS; i++)
    {
        for (int j = 0; j < COLS ; j++)
        {
            board[i][j] = set ;
        }
    }
}
void display_board(char board[ROWS][COLS],int rows, int cols)
{
    for(int j =0; j<=COL ; j++)
        printf("%d ",j);
    printf("\n");
    for (int i = 1; i <=ROW; i++)
    {
        printf("%d ",i);
        for (int j = 1; j <=COL ; j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
}
void set_mine(char mine_board[ROWS][COLS],int rows, int cols)
{
    int count = Easy_count;
    while (count)
    {
        int x = rand()%ROW+1;
        int y = rand()%ROW+1;
        if ( mine_board[x][y] == '0')
        {
            mine_board[x][y] = '1';
            count--;
        }
    }
}
int get_mine_board(char mine_board[ROWS][COLS],int x, int y)
{
    return  mine_board[x+1][y-1]+
            mine_board[x+1][y]+
            mine_board[x][y+1]+
            mine_board[x+1][y+1]+
            mine_board[x-1][y]+
            mine_board[x][y-1]+
            mine_board[x-1][y-1]+
    mine_board[x-1][y+1]-8*'0';
    
}
void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols)
{
    int x = 0;
    int y = 0;
    int win = 0;
   
    //判断坐标合法性
    while(win < ROW*COL-Easy_count)
{
    printf("请输入坐标!!!\n");
    scanf("%d %d",&x,&y);
    if (x>=1 && x<= ROW && y>=1 && y<= COL)
    {
        if(show_board[x][y] == '*')
        {
            if (mine_board[x][y] == '1')
            {
                printf("BOOM!!!!你给炸死了QAQ\n");
                display_board(mine_board,ROWS,COLS);
                break;
            }
            
                int count = get_mine_board( mine_board , x , y );
                show_board[x][y] = count + '0';
                display_board(show_board,ROWS,COLS);
                win++;
        }
        else
        {
            printf("目标已占用\n");
        }
    }
    else
    {
        printf("坐标错误请重新输入~~~~~\n");
    }
}
    if(win == ROW*COL-Easy_count)
    {
        printf("恭喜你,排雷成功^ _ ^\n");
        display_board(mine_board,ROWS,COLS);
    }
}
#include "game.h"
#include <stdio.h>
void game(void)
{
    
    char mine_board[ROWS][COLS] = {0};
    char show_board[ROWS][COLS] = {0};
    //初始化
    init_board(mine_board,ROWS,COLS,'0');
    init_board(show_board,ROWS,COLS,'*');
    //打印
  //  display_borad(mine_borad,ROWS,COLS);
  //  display_borad(show_borad,ROWS,COLS);
    //布置雷
    set_mine(mine_board,ROWS,COLS);
    display_board(show_board,ROWS,COLS);
   // display_board(mine_board,ROWS,COLS);
    //排查雷   把mine上的信息反馈到show上
    find_board(mine_board,show_board,ROWS,COLS); 
    //输赢机制
}
void menu(void)
{
    printf("*************************\n");
    printf("********1.play***********\n");
    printf("********0.exit***********\n");
    printf("******    扫雷  **********\n");
    printf("*****   好扫,扫饱他  *****\n");
    printf("*************************\n");
    
}
int main(int argc, const char * argv[])
{
    int input = 0;
    srand((unsigned int)time(NULL));
    //写一个扫雷游戏
    do
    {
        menu();
        printf("请输入你的选择\n");
        scanf("%d",&input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("推出成功\n");
                break;
            default:
                printf("选择错误\n");
                break;
        }
    } while (input);
    return 0;
}

游戏代码详解

游戏框架构建

棋盘绘制

首先定义棋盘的大小,定义棋盘行数和列数。

#define ROW 9

#define COL 9

#define ROWS 9+ROW

#define COLS 9+COL

为了防止数组越界问题出现 我们使用两个棋盘来解决

一个棋盘 mine ,在其上面玩游戏

而另一个棋盘 show ,将结果打印给玩家看 

void display_board(char board[ROWS][COLS],int rows, int cols)
{
    for(int j =0; j<=COL ; j++)
        printf("%d ",j);
    printf("\n");
    for (int i = 1; i <=ROW; i++)
    {
        printf("%d ",i);
        for (int j = 1; j <=COL ; j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
}

 别忘记初始化了

棋盘初始化

void init_board(char board[ROWS][COLS],int rows, int cols,char set)
{
    for (int i = 0; i <ROWS; i++)
    {
        for (int j = 0; j < COLS ; j++)
        {
            board[i][j] = set ;
        }
    }
}

现在我们有了已经初始化好的棋盘,下一步我们就要布置雷在我们的mine棋盘上

void set_mine(char mine_board[ROWS][COLS],int rows, int cols)
{
    int count = Easy_count;
    while (count)
    {
        int x = rand()%ROW+1;
        int y = rand()%ROW+1;
        if ( mine_board[x][y] == '0')
        {
            mine_board[x][y] = '1';
            count--;
        }
    }
}

在本文中我们用1表示雷地 0表示安全地 而*是未探索的区域 我们会在show棋盘上打印*,再将玩家在mine棋盘上扫雷的结果反馈回show棋盘上,布置雷 我们仍是随机布置 使用到rand函数

开始扫雷

玩家输入坐标 我们判断该坐标的合法性 在判断是否为雷1还是安全地0

void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols)
{
    int x = 0;
    int y = 0;
    int win = 0;
   
    //判断坐标合法性
    while(win < ROW*COL-Easy_count)
{
    printf("请输入坐标!!!\n");
    scanf("%d %d",&x,&y);
    if (x>=1 && x<= ROW && y>=1 && y<= COL)
    {
        if(show_board[x][y] == '*')
        {
            if (mine_board[x][y] == '1')
            {
                printf("BOOM!!!!你给炸死了QAQ\n");
                display_board(mine_board,ROWS,COLS);
                break;
            }
            
                int count = get_mine_board( mine_board , x , y );
                show_board[x][y] = count + '0';
                display_board(show_board,ROWS,COLS);
                win++;
        }
        else
        {
            printf("目标已占用\n");
        }
    }
    else
    {
        printf("坐标错误请重新输入~~~~~\n");
    }
}

为了更加贴近真正的扫雷游戏,如果该地为安全地 我们还得返回 四周八个空间内的雷的数量

int get_mine_board(char mine_board[ROWS][COLS],int x, int y)
{
    return  mine_board[x+1][y-1]+
            mine_board[x+1][y]+
            mine_board[x][y+1]+
            mine_board[x+1][y+1]+
            mine_board[x-1][y]+
            mine_board[x][y-1]+
            mine_board[x-1][y-1]+
    mine_board[x-1][y+1]-8*'0';
    
}

输赢判断 

void find_board(char mine_board[ROWS][COLS],char show_board[ROWS][COLS],int rows, int cols)
{
    int x = 0;
    int y = 0;
    int win = 0;
   
    //判断坐标合法性
    while(win < ROW*COL-Easy_count)
{
    printf("请输入坐标!!!\n");
    scanf("%d %d",&x,&y);
    if (x>=1 && x<= ROW && y>=1 && y<= COL)
    {
        if(show_board[x][y] == '*')
        {
            if (mine_board[x][y] == '1')
            {
                printf("BOOM!!!!你给炸死了QAQ\n");
                display_board(mine_board,ROWS,COLS);
                break;
            }
            
                int count = get_mine_board( mine_board , x , y );
                show_board[x][y] = count + '0';
                display_board(show_board,ROWS,COLS);
                win++;
        }
        else
        {
            printf("目标已占用\n");
        }
    }
    else
    {
        printf("坐标错误请重新输入~~~~~\n");
    }
}
    if(win == ROW*COL-Easy_count)
    {
        printf("恭喜你,排雷成功^ _ ^\n");
        display_board(mine_board,ROWS,COLS);
    }
}

主函数 

有了上面这些函数,主函数可以轻松写出 

#include "game.h"
#include <stdio.h>
void game(void)
{
    
    char mine_board[ROWS][COLS] = {0};
    char show_board[ROWS][COLS] = {0};
    //初始化
    init_board(mine_board,ROWS,COLS,'0');
    init_board(show_board,ROWS,COLS,'*');
    //打印
  //  display_borad(mine_borad,ROWS,COLS);
  //  display_borad(show_borad,ROWS,COLS);
    //布置雷
    set_mine(mine_board,ROWS,COLS);
    display_board(show_board,ROWS,COLS);
   // display_board(mine_board,ROWS,COLS);
    //排查雷   把mine上的信息反馈到show上
    find_board(mine_board,show_board,ROWS,COLS); 
    //输赢机制
}
void menu(void)
{
    printf("*************************\n");
    printf("********1.play***********\n");
    printf("********0.exit***********\n");
    printf("******    扫雷  **********\n");
    printf("*****   好扫,扫饱他  *****\n");
    printf("*************************\n");
    
}
int main(int argc, const char * argv[])
{
    int input = 0;
    srand((unsigned int)time(NULL));
    //写一个扫雷游戏
    do
    {
        menu();
        printf("请输入你的选择\n");
        scanf("%d",&input);
        switch (input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("推出成功\n");
                break;
            default:
                printf("选择错误\n");
                break;
        }
    } while (input);
    return 0;
}

本文含有隐藏内容,请 开通VIP 后查看