C语言实现扫雷游戏

C语言实现扫雷游戏

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。相信大部分人应该都玩过,今天我们就用C语言来实现一个简单的扫雷小游戏。

此处我分了三个文件,一个是我们一开始的main.c文件;一个是game.c文件;还有一个是game.h文件。

以下是main.c文件的代码:
首先,我们在主函数先自己定义一个函数,我们在这个函数里面打印一个简易的菜单。

int main()
{
    test();
    return 0;
}

我们在test函数里先利用时间戳生成一个随机数,也就是srand((unsigned int)time(NULL));。接着在循环里面实现游戏的菜单程序,输入0则退出游戏;输入1则进入游戏;输出的如果不是这两个数字则会提示“输出错误,请重新输入”。

#include "game.h"
void menu()
{
    printf("*************************\n");
    printf("**** 1.play   0.exit ****\n");
    printf("*************************\n");
}
void test()
{
    int input=0;
    srand((unsigned int)time(NULL));
    do
    {
       menu();
       printf("请选择:\n");
       scanf("%d",&input);
       switch(input)
      {
        case 0:
          printf("退出游戏\n");
          break;
        case 1:
          game();
          break;
        default:
          printf("输入错误,请重新输入\n");
          break;
      }
    }while(input);
}

然后就是进入游戏game函数的实现

void game()
{
    //雷的信息存储
    //1、布置好雷的信息
    char mine[ROWS][COLS]={0};//这个数组棋盘是自己看的布置雷的棋盘
    //2、排查出雷的信息
    char show[ROWS][COLS]={0};//这个数组棋盘是给玩家看的所展现出来的棋盘
    //初始化
    Init(mine,ROWS,COLS,'0');
    Init(show,ROWS,COLS,'*');
    //打印棋盘
    //Displayboard(mine,ROW,COL);//可让自己看到全部初始化为0的棋盘
    Displayboard(show,ROW,COL);//可让玩家看到全部覆盖了布置好的棋盘
    //布置雷
    Setmine(mine,ROW,COL);
    //Displayboard(mine,ROW,COL);可以看到是哪些位置布置了雷
    //扫雷
    Findlei(mine,show,ROW,COL);
}

以上便是main.c文件里的代码了。
接下来是game.c里面对于游戏玩法的实现:

#include "game.h"

void Init(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 board[ROWS][COLS],int row,int col)
{
    int count=LEICOUNT;
    while(count)
    {
        int x=rand()%row+1;
        int y=rand()%col+1;
        if(board[x][y]=='0')
        {
            board[x][y]='1';
            count--;
        }
    }
}

//    字符0减去字符0就等于数字0
//同样字符1(2,3)减去字符0就等于数字1(2,3)
//因为字符0的ASCLL码值是48,字符1,2,3的ASCLL码值为49,50,51
int getmine(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]+
    mine[x+1][y]+
    mine[x-1][y+1]+
    mine[x][y+1]+
    mine[x+1][y+1]-8*'0';
    //用输入坐标周围的8个坐标ASCLL码值 减去 周围8个没有雷的坐标ASCLL码值
    //就可知道附件有几个雷
}

void Findlei(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-LEICOUNT)
    {
      printf("请输入排查雷的坐标:\n");
      scanf("%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//不是雷
        {
            //计算x,y坐标周围有几个雷
            int count=getmine(mine,x,y);
            show[x][y]=count+'0';
            Displayboard(show,row,col);
            win++;
        }
       }
       else
       {
        printf("输入坐标合法,请重新输入:\n");
       }
    }
    if(win==row*col-LEICOUNT)
    {
        printf("恭喜你,排雷成功\n");
        Displayboard(mine,row,col);
    }
}

以上便是game.c文件里的具体玩法实现,
最后便是game.h头文件里的一些定义了:

#define GAME_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define LEICOUNT 10

void Init(char board[ROWS][COLS],int rows,int cols,char set);
void Displayboard(char board[ROWS][COLS],int row,int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void Findlei(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

我们所定义的是9*9的棋盘,如果需要更改棋盘大小,修改定义ROW和COL的大小即可。

以上便是扫雷游戏实现的全过程,虽然我讲的不是很详细,但是代码里面我基本都有注释,相信这也难不倒各位友友们,加油各位!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tyro达令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值