扫雷游戏的简单实现( c语言)

本文介绍了如何在控制台上用C语言实现一个简单的9x9扫雷游戏,涉及游戏功能设计、数据结构(数组)使用、雷的布局与排查、数组边界处理以及代码组织。通过多文件的形式展示了游戏逻辑和初始化过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在学习函数及函数之前的知识后,那怎么用这些知识实现一个小游戏呢?接下来我们以扫雷游戏为例。这里我们实现9*9的简单扫雷。

1.扫雷游戏的分析和设计

1.1:扫雷游戏的功能说明

使用控制台实现经典的扫雷游戏

游戏可以通过菜单实现继续玩还是退出游戏

扫雷的棋盘是9*9的格子

默认随机布置的是10个雷

 可以排查雷

    如果位置不是雷,就显示周围有几个雷

    如果位置是雷,就炸死游戏结束

    把除十个雷之外的所有雷都找出来,排雷成功,游戏结束。

                                                                                                                                                           

     初始界面                                    排雷界面                         排雷失败界面

1.2 游戏的分析和设计

扫雷的过程中,布置的雷和排查出雷的信息都需要存储,所以我们需要一个表格来存储这些数据信息。

因为我们是在9*9的棋盘上布置雷和排查雷,我们可以用一个9*9的数组来存储这些信息。

如果这个位置上有雷就存放1,没有雷就存放0.

假设设置雷的棋盘如下

接下来我们进行排查雷

假设我们排查(2,2)这个坐标,这个坐标周围的雷的个数就为1;我们统计的是以这个坐标为中心围绕这个坐标一圈中雷的个数。

那假设我们排查的是(1,1)这个坐标呢,我们可以由图发现,此时统计此坐标周围雷的个数时,数组已经发生越界了。

那怎么解决数组越界这个问题呢。如果我们每次排查雷之后统计坐标时判断一下坐标是否越界,越界的不统计,不越界的进行统计。这样子看上去可行,但是太麻烦了,因为我们在统计时每一次都要判断此坐标是否越界。那是否有其他的办法解决呢?

当然有,我们可以将此数组扩大一圈,变成11*11的数组 如图:

此时我们在对(1,1)坐标进行排查,就不会产生数组越界的问题了。如图

接下来继续分析;

当我们在棋盘上布置了雷以后,棋盘上雷的信息1和非雷的信息0,当我们排查了某一个坐标后发现其不是雷,但是在其周围有1个雷,此时我们需要将排查出雷的数量进行储存,并且打印出来。作为下一次排雷的参考信息,这个雷的个数信息如何存储?如果存储在布置雷的棋盘中,此时有一个问题,那就是我们排查出的这个雷的信息1,是这个坐标上的雷,还是其坐标周围中雷的信息,这个容易让我们产生混淆。那么如何解决着这个问题呢?

我们可以将雷和非雷的信息不用数字表示,可以用字符表示,这样就可以避免冲突,其次我们可以另给一个与布置雷相同的棋盘,用来存放排查出雷的信息。这样自就可以避免混淆了。这里我们布置雷的棋盘设为mine数组,存放排雷的信息用show数组表示。这样子就互不干扰了,在mine数组中排查雷,然后将排查出的数据存到show数组中,并将show数组打印出来作为下一次排雷时的参考。

同时为了增加游戏趣味性,可以把show数组初始化为字符*号,mine数组初始化为字符0;当布置雷成功时,将字符0改为字符1。此时的初始化棋盘可以用同一套函数。

                                                                     show数组的初始化

2.代码实现

2.1 多文件形式

test.c:实现扫雷游戏的测试

game.c:游戏函数的实现

game.h:  游戏函数的声明

2.2

代码如下

test.c

/扫雷
#include<stdio.h>
#include"game.h"
 void menu()
{
     printf("************************\n");
     printf("********   1.play   ****\n");
     printf("********   2.exat   ****\n");
     printf("************************\n");
}
 void game()
 {

     char mine[ROWS][COLS];
     char show[ROWS][COLS];
     //初始化棋盘
     InitBoard(mine, ROWS, COLS, '0');
     InitBoard(show, ROWS, COLS, '*');
     //打印棋盘
     DisplayBoard(show, ROW, COL); 
     //DisplayBoard(mine, ROW, COL);*/
     //1.布置雷
     SetMine(mine, ROW, COL);
     //cc7u playBoard(mine, ROW, COL);
     //2.排查雷
     FindMine(mine, show, ROW, COL);
 }
int main()
{
    int imput=0;
    srand((unsigned int)time(NULL));
    do {
          
        menu();
        printf("请输入:");
            scanf_s("%d", &imput);
            switch (imput)
            {
            case 1:
                
                printf("扫雷\n");
                game();
                break;
            case 2:
                printf("退出游戏\n");
                break;
            default:
                printf("选择错误,重新选择\n");
                break; 
            }
    } while (imput);
    return 0;
}

game.c

#include"game.h"
void InitBoard(char arr[ROWS][COLS], int rows, int cols, char set)
{
    int i = 0, j = 0;
    for (i = 0; i < ROWS; i++)
    {
        for (j = 0; j < COLS; j++)
        {
            arr[i][j] = set;
        }
    }
    
}
 void DisplayBoard(char arr[ROWS][COLS], int row, int col)
 {
     printf("**********************  扫雷   **********************\n");

     int i = 1;
     for (i = 0; i <=col; i++)
     {
         printf("%d ", i);
     }
     printf("\n");
     for (i = 1; i <= row; i++)
     {
         int j = 0;
         printf("%d ", i);
         for (j = 1; j <= col; j++)
         {
             printf("%c ", arr[i][j]);
         }
         printf("\n");
     }
     printf("**********************  扫雷   **********************\n");
 }
 void SetMine(char arr[ROWS][COLS], int row, int col)
 {
     int count = easycount;
     while (count)

     {
         
         int x = rand() % row + 1;
             int y = rand() % col + 1;
             if (arr[x][y] == '0')
             {
                 arr[x][y] = '1';
                 count--;
             }
     }
 }
 int GetMinecount(char mine[ROWS][COLS], int x, int y)
 {
     return mine[x - 1][y - 1] + mine[x][y - 1] + mine[x - 1][y + 1] + mine[x + 1][y + 1] + mine[x + 1][y] + mine[x - 1][y] + mine[x][y + 1]+mine[x+1][y-1]-8*'0';
 

 }

 void  FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int  row, int col)
 {
     int x = 0;
     int y = 0;
     int win = 0;
     while (win<row*col-easycount)
     {
         printf("请输入你要排查的坐标\n");
             scanf_s("%d %d", &x, &y);
         if (x >= 1 && x <= row && y >= 1 && y <= col)
         {
             if (mine[x][y] == '1')

             {

                 printf("很遗憾,你被炸死了\n");
                 DisplayBoard(mine, ROW, COL);
                 break;

             }
             else
             {
                 int n = GetMinecount(mine, x, y);
                 show[x][y] = n + '0';
                 DisplayBoard(show, ROW, COL);
                 win++;
             }
             if (win == row * col - easycount)
             {
                 printf("恭喜你,排雷成功\n");
             }
         }
         else
         {
             printf("坐标非法,请重新输入\n");
         }
     }
 }

game.h

#pragma once
#define ROW 9
#define COL 9
#define  ROWS ROW+2
#define  COLS COL+2
#define easycount 10
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
 void InitBoard(char arr[ROWS][COLS], int rows, int cols,char set);
 void DisplayBoard(char arr[ROWS][COLS], int row, int col);
 void SetMine(char arr[ROWS][COLS], int row, int col);
 void  FindMine(char mine[ROWS][COLS] ,char show[ROWS][COLS], int  rows, int cols );
 今天的扫雷游戏就分享到里,如果小伙伴后续甘兴趣,我会出一篇扫雷游戏代码的讲解。

谢谢观看!点个赞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值