模拟扫雷

模拟扫雷游戏,代码如下:

#ifndef __GAME_H__
#define __GAME_H__
#define EASY_COUNT 10     //雷数
#define R 9    //行
#define C 9    //列
#define ROWS R + 2
#define COLS C + 2
#include<stdio.h>
void Choose_Menu(int a[ROWS][COLS]);      //选择菜单界面
void Game_Initialize(int a[ROWS][COLS], int row, int col);  //初始化
void Set_Mine(int a[ROWS][COLS], int row, int col);         //布置雷
void Move_Mine(int a[ROWS][COLS], int row, int col, int x, int y);  //移动雷  如果第一次输入的坐标就是雷,则将此处的雷移动至别处,游戏继续。
void Game_Menu_Print(const int a[ROWS][COLS], int row, int col); //游戏中界面输出
void Game_Result_Print(const int a[ROWS][COLS], int row, int col);//游戏结束输出
void Find_Mine(int a[ROWS][COLS], int row, int col); //进行排雷的过程
void Get_Mine(int a[ROWS][COLS], int row, int col);  //计算雷数
void Play_Game(int a[ROWS][COLS],int row, int col); //游戏开始调用的总函数
#endif //__GAME_H__,
#include<bits/stdc++.h>
void Choose_Menu(int a[ROWS][COLS])
{
    int i = 1;
    while (i)
    {
        printf("\t\t\t******************************************************\n");
        printf("\t\t\t******************************************************\n");
        printf("\t\t\t*************    请选择进行的操作:      *************\n");
        printf("\t\t\t*************1.开始游戏    0.退出游戏    *************\n");
        printf("\t\t\t******************************************************\n");
        printf("\t\t\t******************************************************\n");
        printf("\t\t\t输入:>_");
        scanf("%d", &i);
        switch (i)
        {
          case 1: Play_Game(a, R, C); break;
          case 0: printf("退出成功,请按任意键结束!\n"); break;
          default:printf("输入错误,请重新输入!\n"); break;
        }
    }
}
void Game_Initialize(int a[ROWS][COLS], int row, int col)
{
    int i = 0, j = 0;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            a[i][j] = -2;
        }
    }
}
void Set_Mine(int a[ROWS][COLS], int row, int col, int count)
{
    int x = 0;
    int y = 0;
    srand((unsigned int)time(NULL));
    while (count)
    {
        x = rand() % row + 1;
        y = rand() % col + 1;
        if (a[x][y] == -2)
        {
            a[x][y] = -1;
            count--;
        }
    }
}
void Move_Mine(int a[ROWS][COLS], int row, int col, int x, int y)
{
    int x0 = 0;
    int y0 = 0;
    srand((unsigned int)time(NULL));
    while (1)
    {
        x0 = rand() % row + 1;
        y0 = rand() % col + 1;
        if ((x0 != x || y0 != y) && a[x0][y0] != -1)
        {
            a[x0][y0] = -1;
            break;
        }
    }
}
void Game_Menu_Print(const int a[ROWS][COLS], int row, int col)
{
    int i = 0, j = 0;
    printf("\n\t\t\tGame_Menu:\n\n");
    //输出坐标

    printf("\t\t\t\t");
    for (i = 1; i <= col; i++)
    {
        if(i < 10)
        printf(" %d ", i);
        else printf("%d ", i);
    }
    printf("\n\n");

    //输出棋局
    for (i = 1; i <= row; i++)
    {
        printf("\t\t\t   %d ",i);
        for (j = 1; j <=col; j++)
        {
            if (a[i][j] == -2 || a[i][j] == -1)
                printf(" * ");
            else if(a[i][j] == 0)
                printf("   ");
            else printf(" %d ", a[i][j]);
        }
        printf("    %d\n", i);
    }
    //输出坐标
    printf("\n\t\t\t\t");
    for (i = 1; i <= col; i++)
    {
        if (i < 10)
            printf(" %d ", i);
        else printf("%d ", i);
    }
    printf("\n\n");
}
void Game_Result_Print(const int a[ROWS][COLS], int row, int col)
{
    int i = 0, j = 0;
    printf("\n\t\t\tGame_Result:\n\n");
    //输出坐标

    printf("\t\t\t\t");
    for (i = 1; i <= col; i++)
    {
        if (i < 10)
            printf(" %d ", i);
        else printf("%d ", i);
    }
    printf("\n\n");

    //输出棋局
    for (i = 1; i <= row; i++)
    {
        printf("\t\t\t   %d ", i);
        for (j = 1; j <= col; j++)
        {
            if (a[i][j] == -2)
            {
                printf(" * ");
            }
            else if (a[i][j] == -1)
            {
                printf(" @ ");
            }
            else if (a[i][j] == 0)
            {
                printf("   ");
            }
            else printf(" %d ", a[i][j]);
        }
                printf("    %d\n", i);
    }
    //输出坐标
    printf("\n\t\t\t\t");
    for (i = 1; i <= col; i++)
    {
        if (i < 10)
            printf(" %d ", i);
        else printf("%d ", i);
    }
    printf("\n\n");
}
void Get_Mine(int a[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    if ((a[row - 1][col - 1] == -1) + (a[row - 1][col] == -1) + (a[row - 1][col + 1] == -1) + (a[row][col - 1] == -1) + (a[row][col + 1] == -1) + (a[row + 1][col - 1] == -1) + (a[row + 1][col] == -1) + (a[row + 1][col + 1] == -1) != 0)
    {
        a[row][col] =  (a[row - 1][col - 1] == -1) + (a[row - 1][col] == -1) + (a[row - 1][col + 1] == -1) + (a[row][col - 1] == -1) + (a[row][col + 1] == -1) + (a[row + 1][col - 1] == -1) + (a[row + 1][col] == -1) + (a[row + 1][col + 1] == -1);
    }
    else
    {
        //只有在棋盘内才递归
        if (row >= 1 && row <= R && col >= 1 && col <= C)
        {
            a[row][col] = ((a[row - 1][col - 1] == -1) + (a[row - 1][col] == -1) + (a[row - 1][col + 1] == -1) + (a[row][col - 1] == -1) + (a[row][col + 1] == -1) + (a[row + 1][col - 1] == -1) + (a[row + 1][col] == -1) + (a[row + 1][col + 1] == -1));
            //向上
            if (a[row - 1][col] < 0)
                Get_Mine(a, row - 1, col);
            //向右
            if (a[row][col + 1] < 0)
                Get_Mine(a, row, col + 1);
            //向下
            if (a[row + 1][col] < 0)
                Get_Mine(a, row + 1, col);
            //向左
            if (a[row][col - 1] < 0)
                Get_Mine(a, row, col - 1);
        }
    }
}
void Find_Mine(int a[ROWS][COLS], int row, int col)
{
    int x = 0, y = 0;
    int win = 0;
    while (win < row * col - EASY_COUNT)
    {
        //输入坐标
        Game_Menu_Print(a, row, col);
        printf("请输入要排查的坐标:");
        scanf("%d %d", &x, &y);
        //判断有效性
        if (x >= 1 && x <= row && y >= 1 && y <= col) //输入正确
        {

            //
            if (a[x][y] == -1)
            {
                if (win == 0)
                {
                    Move_Mine(a, row, col, x, y);
                    Get_Mine(a, x, y);
                    win++;
                }
                else
                {
                    printf("\nGAME OVER!!!\n\n");
                    break;
                }
            }
            else
            {
                if (a[x][y] != -2)
                {
                    printf("坐标输入有误,请重新输入!\n");
                    continue;
                }
                Get_Mine(a, x, y);
                win++;
            }

        }
        else
        {
            printf("坐标输入有误,请重新输入!\n");
        }
    }
    if (win == row * col - EASY_COUNT)
        printf("\nYou Win!\n\n");
}
void Play_Game(int a[ROWS][COLS], int row, int col)
{
    Game_Initialize(a, ROWS, COLS);
    Set_Mine(a, row, col,EASY_COUNT);
    Find_Mine(a, row, col);
    Game_Result_Print(a, row, col);
}
int main()
{
    int arr[ROWS][COLS] = { 0 };
    Choose_Menu(arr);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42825033/article/details/81329907