C语言实现扫雷游戏

C语言实现扫雷游戏

我的扫雷有如下几个功能:

  • 显示该点周围雷的个数
  • 坐标周围没雷,可以实现展开

一、分功能阐述:

1.初始化两个雷阵

void Initboard(char board[ROWS][COLS],int rows,int cols,char set)
{
    int i = 0;
    for(i=0;i<rows;i++)
    {
        int j = 0;
        for(j=0;j<cols;j++)
        {
            board[i][j] = set;//将mine全部初始化为‘0’,将show全部初始化为‘*’
        }
    }
}

2.打印雷阵及行列号

void Display(char board[ROWS][COLS],int row,int col)
{
    int i = 0;
    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 ",board[i][j]);
        }
        printf("\n");
    }
}

3.布雷

void Setmine(char board[ROWS][COLS],int row,int col)
{
    int count = COUNT;
    while(count)
    {
        int x = rand()%9+1;//产生1-9的随机数
        int y = rand()%9+1;
        if(board[x][y]=='0')
        {
            board[x][y] = '1';
            count--;
        }
    }
}

4.统计当前坐标周围雷的个数

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

5.实现展开功能

void open_mine(char mine[ROWS][COLS],char show[ROWS][COLS],int x, int y)//坐标周围展开函数
{
    if (mine[x - 1][y - 1]== '0')
    {
        show[x - 1][y - 1] = Getminecount(mine,x - 1, y - 1) + '0';//显示该坐标周围雷数
    }
    if (mine[x - 1][y] == '0')
    {
        show[x - 1][y] = Getminecount(mine,x - 1, y) + '0';//显示该坐标周围雷数
    }
    if (mine[x - 1][y + 1] == '0')
    {
        show[x - 1][y + 1] = Getminecount(mine,x - 1, y + 1) + '0';//显示该坐标周围雷数
    }
    if (mine[x][y - 1] == '0')
    {
        show[x][y - 1] = Getminecount(mine,x, y - 1) + '0';//显示该坐标周围雷数
    }
    if (mine[x][y + 1] == '0')
    {
        show[x][y + 1] = Getminecount(mine,x, y + 1) + '0';//显示该坐标周围雷数
    }
    if (mine[x + 1][y - 1] == '0')
    {
        show[x + 1][y - 1] = Getminecount(mine,x + 1, y - 1) + '0';//显示该坐标周围雷数
    }
    if (mine[x + 1][y] == '0')
    {
        show[x + 1][y] = Getminecount(mine,x + 1, y) + '0';//显示该坐标周围雷数
    }
    if (mine[x + 1][y + 1] == '0')
    {
        show[x + 1][y + 1] = Getminecount(mine,x + 1, y + 1) + '0';//显示该坐标周围雷数
    }
}

6.扫雷

void sweepmine(char mine[ROWS][COLS],
               char show[ROWS][COLS],int row,int col)
{
    int x = 0;
    int y = 0;
    int win = 0;
    while(win<col*row-COUNT)
    {

        printf("请输入要排查的坐标:");
        scanf("%d %d",&x,&y);
        if(x>=1 && x<=row && y>=1 && y<=col)
        {
            if(mine[x][y] == '1')
            {
                printf("很遗憾,你被炸死了!\n");
                break;
            }
            else
            {

                int count = Getminecount(mine,x,y);
                win++;
                show[x][y] = count+'0';
                open_mine(mine,show,x,y);
                Display(show,row,col);
            }
        }
        else
        {
            printf("坐标有误!\n");
        }
    }
    if(win == row*col-COUNT)
    {
        printf("恭喜您,扫雷成功!\n");
    }
}

二、分文件

1.game.h中

#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 10

void Initboard(char board[ROWS][COLS],int rows,int cols,char set);
void Display(char board[ROWS][COLS],int row,int col);
void Setmine(char board[ROWS][COLS],int row,int col);
void sweepmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

#endif

2.game.c中

void sweepmine(char mine[ROWS][COLS],
               char show[ROWS][COLS],int row,int col)
{
    int x = 0;
    int y = 0;
    int win = 0;
    while(win<col*row-COUNT)
    {

        printf("请输入要排查的坐标:");
        scanf("%d %d",&x,&y);
        if(x>=1 && x<=row && y>=1 && y<=col)
        {
            if(mine[x][y] == '1')
            {
                printf("很遗憾,你被炸死了!\n");
                break;
            }
            else
            {

                int count = Getminecount(mine,x,y);
                win++;
                show[x][y] = count+'0';
                open_mine(mine,show,x,y);
                Display(show,row,col);
            }
        }
        else
        {
            printf("坐标有误!\n");
        }
    }
    if(win == row*col-COUNT)
    {
        printf("恭喜您,扫雷成功!\n");
    }
}

3.main.c中

#include"game.h"
void game()
{
    char mine[ROWS][COLS] = {0};
    char show[ROWS][COLS] = {0};
    Initboard(mine,ROWS,COLS,'0');
    Initboard(show,ROWS,COLS,'*');
    Setmine(mine,ROW,COL);
    Display(show,ROW,COL);
    sweepmine(mine,show,ROW,COL);
    Display(mine,ROW,COL);
}
void menu()
{
    printf("**************************\n");
    printf("********  1.play  ********\n");
    printf("********  0.exit  ********\n");
    printf("**************************\n");
}
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("退出游戏\n");
            break;
        default:
            printf("选择错误\n");
            break;
        }
    }
    while(input);
}
int main()
{
    test();
    return 0;
}

结果展示:

开始运行:

炸死的情况:
炸死

阅读更多
文章标签: C语言 小游戏
个人分类: c语言
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭