C语言 扫雷游戏,(实现 展开一片、标记“雷”)

1、主函数,源文件、部分

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"

game()
{
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    char set = 0;
    
    //初始化棋盘
    initBoard(mine,ROWS,COLS,'0');
    initBoard(show, ROWS, COLS,'*');
    //设置雷
    Setmine(mine,ROW,COL, ESAY_COUNT);

    //打印棋盘
    Display(mine, ROW, COL);        //打印布置雷的情况
    Display(show, ROW, COL);        //打印排查雷情况(界面)
    //排查雷
    FindMine(mine, show, ROW, COL);

}
void menu()
{
    printf("*****************************\n");
    printf("********** 1.play ***********\n");
    printf("********** 0.exti ***********\n");
    printf("*****************************\n");

}
int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请输入:>\n");
        scanf("%d", &input);
        switch (input)
        {
            case 1:
            {
                game();
                break;
            }
            case 0:
            {
                printf("退出游戏\n");
                break;
            }
            default :
                printf("输入错误,请重新输入\n");

        }


    } while (input);

    return 0;
}

2、game.c 源文件部分

#include "game.h"

//标记雷
void mark(char show[ROWS][COLS],int row,int col)
{
    int x = 0; int y = 0;
    printf("请输入要标记的坐标\n");
    scanf("%d %d", &x, &y);

    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
        //if (mine[x][y] == '1')
        //{
        //    printf("你被炸死了,游戏结束\n");
        //    break;
        //}
        if (show[x][y] == '*')
        {
            
            show[x][y] = '#';
            Display(show, ROW, COL);
        }
        else
        {
            printf("该坐标已核查不能标记,请输入其他坐标\n");
        }
    }
    else
    {
        printf("坐标非法,请重新输入:>\n");
    }


}

//如果不是雷,递归,展开一片区域
void DfsMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y, int row, int col,int* win)
{
    
    int count = Getmine(mine, x, y);            //统计雷的个数
    show[x][y] = count + '0';
    if(count!=0)
    {
        return;
    }
    int i = 0;
    int Dfminex[] = { -1, -1,  0,  1, 1, 1, 0, -1 };
    int Dfminey[] = {  0, -1, -1, -1, 0, 1, 1,  1 };

    for(i=0;i<8;i++)
    {
        int dx = x + Dfminex[i];
        int dy = y + Dfminey[i];
        if (dx >= 1 && dx <= row && dy >= 1 && dy <= col && mine[dx][dy] == '0' && show[dx][dy] == '*')
        {
            DfsMine(mine, show, dx, dy, row, col,win);
            if (show[dx][dy] == '0'&count == 0)
            {
                show[dx][dy] = '0';
            }
            *win += 1;
        }
    }
}

//统计雷的个数
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 + 1] + mine[x][y + 1] +
        mine[x - 1][y + 1] + mine[x - 1][y] - 8 * '0');

}


//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int input = 0;
    int x = 0;
    int y = 0;
    int win = 0;
    while (win < row * col - ESAY_COUNT)
    {
        
        printf("进入标记,请输入2,不标记请输入0\n");
        scanf("%d", &input);
        if (2 == input)
        {
            mark(show,ROW,COL);
        }
        else {
            printf("请输入要排查的坐标:>\n");
            scanf("%d %d", &x, &y);
            if (x >= 1 && x <= row && y >= 1 && y <= col)
            {
                if (mine[x][y] == '1')
                {
                    printf("你被炸死了,游戏结束\n");
                    break;
                }
                else if (show[x][y] == '*'|show[x][y]=='#')
                {
                    //show[x][y] = '0';
                    int count = Getmine(mine, x, y);            //统计雷的个数
                    if (count == 0)
                    {
                        DfsMine(mine, show, x, y, row, col, &win);
                        printf("win=%d\n", win);
                    }
                    show[x][y] = count + '0';
                    Display(show, ROW, COL);
                    win++;
                    printf("win2=%d\n", win);
                }
                else
                {
                    printf("该坐标已核查,请输入其他坐标\n");
                }
            }
            else
            {
                printf("坐标非法,请重新输入:>\n");
            }
            if (win == ROW * COL - ESAY_COUNT)
            {
                printf("恭喜你,排雷成功\n");
                Display(show, ROW, COL);
                Display(mine, ROW, COL);
            }
        }
        
    }
}


void Display(char board[ROWS][COLS], int row,int col)        //打印棋盘
{
    int i = 0;
    int j = 0;
    printf("----------扫雷游戏----------\n");
    for (i = 0; i <= col; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    for (i = 1; i <= row; i++)
        {
            printf("%d ", i);
            
            for(j=1; j<= row; j++)
            {
                printf("%c ", board[i][j]);
            }
            printf("\n");
        }
}

void Setmine(char board[ROWS][COLS], int row, int col, int count)        //设置雷
{
    while (count)
    {
        //printf("count1=%d\n", count);
        int i = rand() % row + 1;
        int j = rand() % col + 1;
        if (board[i][j] == '0')
        {
            board[i][j] = '1';
            count--;
            //printf("%d\n", count);
        }
    }

}

void initBoard(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;
            //printf("%c ", board[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

3、game.h  头文件  声明部分

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include      <stdio.h>
#include      <stdlib.h>
#include      <time.h>


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

//初始化棋盘
void initBoard(char board[ROWS][COLS], int rows, int cols, char set);
//设置雷
void Setmine(char board[ROW][COL], int row, int col, int count);

//打印棋盘
void Display(char board[ROWS][COLS], int row, int col);


//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

//统计雷的个数
int Getmine(char mine[ROWS][COLS], int row, int col);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值