C语言练习之扫雷小游戏

扫雷

一、功能介绍:

1.扫雷的基本功能
2.第一次扫,不被炸死
3.当周围没有雷的时候可以向外延伸扩展。

二、代码实现

1、首先创建一个头文件

# ifndef __game_h_
# define __game_h_

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

//初始化雷
void InitBoard(char board[ROWS][COLS], int row, int col, char type);
//设置雷
void SetMine(char board[ROWS][COLS], int NUM);
//显示
void PrintBoard(char board[ROWS][COLS], int row, int col);
//统计周围的字符之和
int SumAround(char board[ROWS][COLS], int i, int j);
//第一次踩中雷,更改雷的位置,将此处置换为非雷空
void BoomCountMine1(char board[ROWS][COLS], char board1[ROWS][COLS]);
//判断是否踩中雷
int BoomCountMine2(char board[ROWS][COLS], char board1[ROWS][COLS]);
//如果周围没有雷,向四周扩展,如果周围有雷,统计雷的个数
void ExpendBlock(char board[ROWS][COLS], char board1[ROWS][COLS], int i, int l);
//判断输赢
int IsWin(char board1[ROWS][COLS], int i, int j, int NUM);

# endif

2、然后建立一个源文件,写入各个函数

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>


void InitBoard(char board[ROWS][COLS], int row, int col, char type)//初始化棋盘数据
{
    memset(board, type, row*col*sizeof(board[0][0]));
}

void SetMine(char board[ROWS][COLS], int NUM)//布置一定数目的雷
{
    int i = 0;
    int j = 0;
    int count = NUM;

    while (count)
    {
        i = rand() % (ROWS - 1);
        j = rand() % (COLS - 1);
        if ((i > 0) && (j > 0) && (board[i][j] == '0'))
        {
            board[i][j] = '1';
            count--;
        }
    }
}

void PrintBoard(char board[ROWS][COLS], int row, int col)//打印棋盘
{
    int i = 0;
    int j = 0;

    printf("     ");
    for (j = 0; j < col - 2; j++)
    {
        printf("%2d ", j + 1);
    }
    printf("\n");

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

void BoomCountMine1(char board[ROWS][COLS], char board1[ROWS][COLS])//第一次踩中雷,更改雷的位置,将此处置换为非雷空
{
    int i = 0;
    int j = 0;
    int I = 0;
    int J = 0;
    int sum = 0;

    printf("请输入座标:>例:1 1\n");
    scanf("%d %d", &i, &j);
    I = i;
    J = j;

    if (board[i][j] == '1')
    {
        while (1)
        {
            i = rand() % (ROWS - 1);
            j = rand() % (COLS - 1);
            if ((i > 0) && (j > 0) && (board[i][j] == '0'))
            {
                board[i][j] = '1';
                break;
            }
        }
        board[I][J] = '0';
        sum = (board[I - 1][J - 1] + board[I][J - 1] + board[I + 1][J - 1]
            + board[I + 1][J] + board[I + 1][J + 1] + board[I][J + 1]
            + board[I - 1][J + 1] + board[I - 1][J] - 7 * '0');

        board1[I][J] = sum;
        ExpendBlock(board, board1, I, J);

    }
    else
    {
        ExpendBlock(board, board1, i, j);
    }
}

int BoomCountMine2(char board[ROWS][COLS], char board1[ROWS][COLS])//判断是否踩中雷
{
    int i = 0;
    int j = 0;
    int I = 0;
    int J = 0;
    int tmp = 1;

    printf("请输入座标:>例:1 1\n");
    scanf("%d %d", &i, &j);

    while (tmp)
    {
        if (board1[i][j] == ' ')
        {
            printf("此处已经排过雷,请重新输入!\n");
            scanf("%d %d", &i, &j);
        }
        else
        {
            tmp = 0;
        }
    }


    if (board[i][j] == '1')
    {
        for (I = 1; I < ROWS - 1; I++)
        {
            for (J = 1; J < COLS - 1; J++)
            {
                if (board[I][J] == '1')
                {
                    board1[I][J] = 'M';
                }
            }
        }
        board1[i][j] = 'X';
        return 1;
    }

    else
    {
        ExpendBlock(board, board1, i, j);
        return 0;
    }
    return 0;
}

int SumAround(char board[ROWS][COLS], int i, int j)//统计周围的字符之和
{
    int sum = 0;

    sum = (board[i - 1][j - 1] + board[i][j - 1] + board[i + 1][j - 1]
        + board[i + 1][j] + board[i + 1][j + 1] + board[i][j + 1]
        + board[i - 1][j + 1] + board[i - 1][j] - 7 * '0');

    return sum;
}

void ExpendBlock(char board[ROWS][COLS], char board1[ROWS][COLS], int i, int j)//如果周围没有雷,向四周扩展,如果周围有雷,统计雷的个数
{
    int sum = 0;

    sum = SumAround(board, i, j);

    if (sum == '0')
    {
        board1[i][j] = ' ';
    }
    else if (sum > '0')
    {
        board1[i][j] = sum;
    }

    if ((sum <= '0') && (i>0) && (i<ROWS - 1) && (j>0) && (j<COLS - 1))
    {

        if ((board1[i - 1][j - 1] == '*'))//左上
        {
            ExpendBlock(board, board1, i - 1, j - 1);
        }

        if ((board1[i][j - 1] == '*'))//左方
        {
            ExpendBlock(board, board1, i, j - 1);
        }


        if ((board1[i + 1][j - 1] == '*'))//左下
        {
            ExpendBlock(board, board1, i + 1, j - 1);
        }


        if ((board1[i + 1][j] == '*'))//下方
        {
            ExpendBlock(board, board1, i + 1, j);
        }


        if ((board1[i + 1][j + 1] == '*'))//右下
        {
            ExpendBlock(board, board1, i + 1, j + 1);
        }


        if ((board1[i][j + 1] == '*'))//右方
        {
            ExpendBlock(board, board1, i, j + 1);
        }


        if ((board1[i - 1][j + 1] == '*'))//右上
        {
            ExpendBlock(board, board1, i - 1, j + 1);
        }


        if ((board1[i - 1][j] == '*'))//上方
        {
            ExpendBlock(board, board1, i - 1, j);
        }

        if ((board1[i - 1][j] == '*'))//上方
        {
            ExpendBlock(board, board1, i - 1, j);
        }
    }
}

int IsWin(char board1[ROWS][COLS], int i, int j, int NUM)
{
    int count = 0;
    for (i = 1; i < ROWS - 1; i++)
    {
        for (j = 1; j < COLS - 1; j++)
        {
            if (board1[i][j] == '*')
            {
                count++;
            }
        }
    }

    if (count == NUM)
    {
        for (i = 1; i < ROWS - 1; i++)
        {
            for (j = 1; j < COLS - 1; j++)
            {
                if (board1[i][j] == '*')
                {
                    board1[i][j] = 'M';
                }
            }
        }
        return 1;
    }
    return 0;
}

3、最后写一个测试代码 main.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

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

void game()
{
    int ret = 0;
    int ret1 = 0;
    int ret2 = 0;
    int input = 0;
    int num = 0;
    printf("请输入雷的个数:>");
    scanf("%d", &num);
    char Mine[ROWS][COLS] = { 0 };
    char Show[ROWS][COLS] = { 0 };

    InitBoard(Mine, ROWS, COLS, '0');
    InitBoard(Show, ROWS, COLS, '*');

    SetMine(Mine, num);

    PrintBoard(Show, ROWS, COLS);

    while (1)
    {
        int tmp = 2;

        if (input == 1)
        {
            ret = BoomCountMine2(Mine, Show);

            ret1 = IsWin(Show, ROWS, COLS, num);
            if (ret1 == 1)
            {
                printf("\n恭喜你,你赢了!\n");
                PrintBoard(Show, ROWS, COLS);
                break;
            }
            if (ret == 1)
            {
                printf("\n阿喔,你踩到雷了!\n");

                PrintBoard(Show, ROWS, COLS);
                break;
            }
        }
        else
        {
            BoomCountMine1(Mine, Show);
            ret2 = IsWin(Show, ROWS, COLS, num);
            if (ret2 == 1)
            {
                printf("\n恭喜你,你赢了!\n");
                PrintBoard(Show, ROWS, COLS);
                break;
            }
            input++;
        }
        printf("\n");
        PrintBoard(Show, ROWS, COLS);
    }
}
//主函数
int main()
{
    int input = 0;
    srand((unsigned)time(NULL));

    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            printf("准备好了吗?游戏开始!\n");
            game();
            break;
        case 0:
            printf("游戏结束!\n");
            break;
        default:
            printf("输入错误!\n");
            break;
        }
    } while (input);

    system("pause");
    return 0;
}

三、调试结果

1、开始游戏

这里写图片描述
2、输入座标
这里写图片描述
3、踩到雷
这里写图片描述
4、呃呃,老是输,这里就不给大家展示赢的截图啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章