C语言实现简易版扫雷游戏

最近用C语言实现了一个简易版的扫雷游戏,感觉很有意思!
效果图:

游戏界面

这里写图片描述

效果图

这里写图片描述

这里写图片描述

代码如下

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


#define ROW 9
#define COL 9
#define ROWS (ROW+2)
#define COLS (COL+2)
#define MAX 10

//初始化
void init_board(char arr[ROWS][COLS], char set, int row, int col)
{
    memset(arr, set, row*col*sizeof(arr[0][0]));

}
//打印棋盘
void display(char arr[ROWS][COLS], int row, int col)
{
    int i = 1, j = 1;
    printf("   ");
    for (i = 1; i <= row - 2; i++)
    {
        printf("%d ", i);
    }
    printf("\n");

    for (i = 1; i <= row - 2; i++)
    {
        printf("%d  ", i);

        for (j = 1; j <= col - 2; j++)
        {
            printf("%c ", arr[i][j]);
        }
        printf("\n");
    }

}

//布雷
void set_boom(char arr[ROWS][COLS])
{
    int count = MAX;

    while (count > 0)
    {
        int x = rand() % 9 + 1;//产生1~9的随机数
        int y = rand() % 9 + 1;

        if (arr[x][y] == '0')
        {
            arr[x][y] = '1';
            count--;//布雷
        }
    }

}

//扫描雷
int  get_boom(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 fun(char arr[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{

    if ((x >= 0) && (x <= 11) && (y >= 0) && (y <= 11))//递归约束条件
    {
        if (get_boom(arr, x, y) == 0)//判断雷的个数
        {
            show[x][y] = ' ';
            if (show[x - 1][y - 1] == '*')//对周围八个位置分别进行递归
            {
                fun(arr, show, x - 1, y - 1);
            }
            if (show[x - 1][y] == '*')
            {
                fun(arr, show, x - 1, y);
            }
            if (show[x - 1][y + 1] == '*')
            {
                fun(arr, show, x - 1, y + 1);
            }
            if (show[x][y - 1] == '*')
            {
                fun(arr, show, x, y - 1);
            }
            if (show[x][y + 1] == '*')
            {
                fun(arr, show, x, y + 1);
            }
            if (show[x + 1][y - 1] == '*')
            {
                fun(arr, show, x + 1, y - 1);
            }
            if (show[x + 1][y] == '*')
            {
                fun(arr, show, x + 1, y);
            }
            if (show[x + 1][y + 1] == '*')
            {
                fun(arr, show, x + 1, y + 1);
            }

        }
        else
            show[x][y] = get_boom(arr, x, y) + '0';//如果周围有雷则显示雷的个数

    }
}


void game()
{
    char arr[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    int win = 0;
    int x = 0;
    int y = 0;

    init_board(arr, '0', ROWS, COLS);
    init_board(show, '*', ROWS, COLS);
    set_boom(arr);
    display(show, ROWS, COLS);
    while (win != MAX)//判断是否排完雷
    {
        printf("请输入坐标:");
        scanf("%d %d", &x, &y);
        if (((x >= 1) && (x <= ROW)) && ((y >= 1) && (y <= COL)))
        {
            if (arr[x][y] == '1')
            {
                printf("GAME OVER!\n");
                break;
            }
            else
            {
                fun(arr, show, x, y);
                for (int i = 1; i <= 9; i++)
                {
                    for (int j = 1; j <= 9; j++)
                    {
                        if (show[i][j] == '*')
                        {
                            win++;
                        }

                    }
                }

                display(show, ROWS, COLS);

            }
        }
        else
        {
            printf("输入坐标有误\n");
        }
    }
    if (win == MAX)
    {
        printf("CONGRATULATIONS!");
    }
    printf("雷阵如下:\n");
    display(arr, ROWS, COLS);
}

void menu()
{
    printf("******************************\n");
    printf("******1.piay     0.exit*******\n");
    printf("******************************");
}


void test()
{
    int input = 0;
    srand((unsigned int)time(NULL));

    do
    {
        menu();
        printf("请选择:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            break;
        default:
            printf("选择错误,请重新选择!");
            break;
        }
    } while (input);

}

int main()
{
    test();

    system("pause");
    return 0;
}

希望可以和大家一起学习,交流!

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的C语言扫雷游戏实现步骤: 1. 定义游戏所需要的变量,如雷区大小、雷数、游戏状态、扫雷数组等。 ```c int row, col; // 雷区的行数和列数 int total_mines; // 雷区中的雷数 int game_state; // 游戏状态,0表示游戏正在进行,1表示游戏胜利,2表示游戏失败 int mine_field[MAX_ROW][MAX_COL]; // 扫雷数组,0表示没有雷,1表示有雷 ``` 2. 初始化雷区,将扫雷数组中的所有元素置为0,然后随机生成指定数量的雷,并将它们的位置标记在扫雷数组中。 ```c void init_mine_field() { int i, j, count = 0; // 将扫雷数组中的所有元素置为0 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { mine_field[i][j] = 0; } } // 随机生成指定数量的雷,并将它们的位置标记在扫雷数组中 while (count < total_mines) { int x = rand() % row; int y = rand() % col; if (mine_field[x][y] == 0) { mine_field[x][y] = 1; count++; } } } ``` 3. 实现用于显示雷区的函数,根据扫雷数组中的元素值,在控制台上输出相应的字符,如“#”表示未翻开的格子,“*”表示有雷的格子,“0”~“8”表示周围的雷数。 ```c void display_mine_field() { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (mine_field[i][j] == 0) { printf("# "); } else if (mine_field[i][j] == 1) { printf("* "); } else { printf("%d ", mine_field[i][j] - 2); } } printf("\n"); } } ``` 4. 实现用于翻开指定位置格子的函数,如果该位置有雷,则游戏失败;否则,统计周围的雷数并在扫雷数组中标记该位置的状态。 ```c void open_cell(int x, int y) { if (mine_field[x][y] == 1) { game_state = 2; // 游戏失败 printf("Game over!\n"); } else { int i, j, count = 0; // 统计周围的雷数 for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i >= 0 && i < row && j >= 0 && j < col && mine_field[i][j] == 1) { count++; } } } // 标记该位置的状态 mine_field[x][y] = count + 2; if (count == 0) { // 如果周围没有雷,则递归翻开周围的格子 for (i = x - 1; i <= x + 1; i++) { for (j = y - 1; j <= y + 1; j++) { if (i >= 0 && i < row && j >= 0 && j < col && mine_field[i][j] == 0) { open_cell(i, j); } } } } } } ``` 5. 主函数中首先初始化游戏变量,然后循环进行游戏,直到游戏结束为止。在每一轮循环中,先显示当前雷区的状态,然后读取玩家输入并翻开相应的格子。 ```c int main() { srand(time(NULL)); // 初始化随机种子 printf("Please enter row, col and total mines: "); scanf("%d %d %d", &row, &col, &total_mines); init_mine_field(); // 初始化雷区 game_state = 0; // 游戏正在进行 while (game_state == 0) { display_mine_field(); // 显示当前雷区的状态 int x, y; printf("Please enter cell position: "); scanf("%d %d", &x, &y); open_cell(x, y); // 翻开指定位置的格子 } return 0; } ``` 以上是一个简单的C语言扫雷游戏实现示例,您可以根据自己的需求和喜好进行修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值