扫雷小游戏

功能不全不会判断第一次不是雷的情况

还请大师门指导一下

game.c
#include"game.h"

//初始化棋盘
int InitBoard(char Board[ROWS][COLS], int row, int col , char str)
{
    int i, j;

    for (i = 0; i <= row + 1; i++)
    {
        for (j = 0; j <= col + 1; j++)
        {
            Board[i][j] = str;
        }
    }
    return 0;
}
//打印棋盘
int DisPlayBoard(char board[ROWS][COLS], int row, int col)
{
    printf("--------------------------扫 雷 游 戏---------------------------\n");
    int i, j;
    for (i = 0; i < 10; i++)
    {
        printf("%-7d", i);
    }
    printf("\n");
    for (i = 1; i <= row ; i++)
    {
        printf("%-7d", i);
        for (j = 1; j <= col ; j++)
        {
            printf("%-7c",board[i][j]);
        }
        printf("\n\n");
    }
    return 0;
}
//布置雷
int SetMine(char mine[ROWS][COLS], int row, int col)
{
    int x, y;
    int count = EASYCODE;
    while (count)
    {
        x = rand() % row + 1;
        y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }
    return 0;
}
//排除雷
int FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x, y,w,z;
    int cnt=0;
    int count=0;
    cnt = ROW * COL;
    while (cnt!=EASYCODE)
    {
        printf("剩余%d个排雷区", cnt);
        printf("输入坐标排雷:x-y:");
        scanf_s("%d-%d", &x, &y);
        
        count++;
        if (x > 0 && x <= row && y > 0 && y <= col)
        {
            
            if (mine[x][y] == '0')
            {
                if (count > 1)
                    {
                        while (1)
                            {
                                printf("输入已经确认雷的坐标(没有的话输入0键回车):w-z:");
                                scanf_s("%d-%d", &w, &z);
                                if (w == 0)
                                    break;
                                LEI(show, ROW, COL, w, z);
                            }
                    }
                optimzation(mine, show, row, col, x, y);//讲坐标周围的空区请空
                DisPlayBoard(show, ROW, COL);//打印棋盘
                cnt = Leeque(show, ROW, COL);
                if (cnt == EASYCODE)
                {
                    break;
                }
            }
            else {
                printf("很遗憾,踩到雷啦!再来一次");
                DisPlayBoard(mine, ROW, COL);
            }
        }
        else {
            printf("输入错误");
        }
    }
    if (cnt == EASYCODE)
    {
        printf("恭喜你挑战成功:");
    }
}
//?的放置处
static int LEI(char show[ROWS][COLS], int row, int col, int w ,int z)
{
    show[w][z] = '?';
    return 0;
}
//计算show里的布雷区个数
static int Leeque(char show[ROWS][COLS], int row, int col)
{
    int i, j, count = 0;
    for (i = 1; i <= row ; i++){
        for (j = 1; j <= col ; j++){
            if (show[i][j] == '*'||show[i][j]=='?') {
                count++;
            }
        }
    }
    return count;
}
//计算x-y周围的炸弹数量
static int GET_MINE(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][y + 1] +
           mine[x + 1][y + 1] + mine[x - 1][y] +
           mine[x + 1][y - 1] + mine[x + 1][y] - 8 * '0';
}
//通过函数的递归来使x-y周围的为‘0’的显示出来
int optimzation(char mine[ROWS][COLS] , char show[ROWS][COLS] , int row , int col , int x , int y)
{
    int flag = 0;
    flag = GET_MINE(mine, x, y);
    if (flag == 0)
    {
        show[x][y] = ' ';
        if (x - 1 > 0 && x - 1 < row + 1 && y - 1 > 0 && y - 1 < col + 1 && show[x - 1][y - 1] == '*'){
            optimzation(mine, show, ROW, COL, x - 1, y - 1);
        }
        if (x - 1 > 0 && x - 1 < row + 1 && y + 1 > 0 && y + 1 < col + 1 && show[x - 1][y + 1] == '*') {
            optimzation(mine, show, ROW, COL, x - 1, y + 1);
        }
        if (x + 1 > 0 && x + 1 < row + 1 && y - 1 > 0 && y - 1 < col + 1 && show[x + 1][y - 1] == '*') {
            optimzation(mine, show, ROW, COL, x + 1, y - 1);
        }
        if (x + 1 > 0 && x + 1 < row + 1 && y + 1 > 0 && y + 1 < col + 1 && show[x + 1][y + 1] == '*') {
            optimzation(mine, show, ROW, COL, x + 1, y + 1);
        }
        if (x > 0 && x < row + 1 && y - 1 > 0 && y - 1 < col + 1 && show[x][y - 1] == '*') {
            optimzation(mine, show, ROW, COL, x , y - 1);
        }
        if (x > 0 && x < row + 1 && y + 1 > 0 && y + 1 < col + 1 && show[x][y + 1] == '*') {
            optimzation(mine, show, ROW, COL, x , y + 1);
        }
        if (x - 1 > 0 && x - 1 < row + 1 && y > 0 && y  < col + 1 && show[x - 1][y] == '*') {
            optimzation(mine, show, ROW, COL, x - 1, y );
        }
        if (x + 1 > 0 && x + 1 < row + 1 && y > 0 && y  < col + 1 && show[x + 1][y] == '*') {
            optimzation(mine, show, ROW, COL, x + 1, y );
        }

    }
    else
    {
        show[x][y] = flag + '0';
    }
        return 0;
}

text.c

#include"game.h"
menu()//开始菜单
{
    printf("********************************************************************\n");
    printf("*******************       '1'   play   game      *******************\n");
    printf("*******************       '0'   exit   game      *******************\n");
    printf("********************************************************************\n");

}
game()//主游戏逻辑
{
    char mine[ROWS][COLS] = { 0 };
    char show[ROWS][COLS] = { 0 };
    //初始化棋盘
    // 创建函数InitBoard()在game.c里实现
    InitBoard(mine , ROW, COL , '0');
    InitBoard(show , ROW, COL , '*');
    //打印棋盘
    DisPlayBoard(show, ROW, COL);
    //布置雷
    SetMine(mine,ROW,COL);
    //DisPlayBoard(mine, ROW, COL);
    //排查雷
    FineMine(mine,show,ROW,COL);
}
int main()
{
    initgraph(4200, 2000);


    srand((unsigned)(time(NULL)));
    int input = 0;
    printf("\n请选择:(1-开始游戏;0-退出游戏;任意键退出游戏)\n");
    
    do
    {
        menu();
        printf("\n请选择:(1-开始游戏;0-退出游戏;任意键退出游戏)\n");
        scanf_s("%d", &input);
        printf("\n");
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏");
            break;
        default:
            printf("输入错误,请重新输入");

        }

    } while (input);
    system("pause");
    return 0;
}

game.h

#pragma once
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<ColorDlg.h>
//#include<graphics.h>
//#include<conio.h>


#pragma once
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
#define EASYCODE 10

//菜单面板
menu();
//主游戏逻辑
game();
//初始化棋盘
// 创建函数InitBoard()在game.c里实现
InitBoard(char Board[ROWS][COLS], int row, int col, char str);
//打印棋盘
DisPlayBoard(char board[ROWS][COLS], int row, int col);
//布置雷
SetMine(char mine[ROWS][COLS], int row, int col);
FineMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值