C语言-实现扫雷

一.什么是扫雷

扫雷小游戏_360百科

《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

二.怎么玩扫雷

以windows XP自带扫雷winmine.exe为例(其它版本的扫雷游戏与之大同小异)。游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间),确定大小的矩形雷区中随机布置一定数量的地雷(初级为9*9个方块10个雷,中级为16*16个方块40个雷,高级为16*30个方块99个雷,自定义级别可以自己设定雷区大小和雷数,但是雷区大小不能超过24*30),玩家需要尽快找出雷区中的所有不是地雷的方块,而不许踩到地雷。

三.代码实现过程

(此代码是非常初级的代码,只能实现少部分功能)

//game.h文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define X 9
#define Y 9
#define XS X+2
#define YS Y+2
#define EASY 50

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

void start_game();
void menu();
void Init(char board[XS][YS], char set);
void Print(char board[XS][YS]);
void game();
void Setmine(char mine[XS][YS]);
void Findmine(char mine[XS][YS], char show[XS][YS]);
int num_mine(char mine[XS][XS], int a, int b);


//test.c文件
int main()
{
    start_game();
    return 0;
}

//game.c文件

void menu()
{
    printf("____________________\n");
    printf("|                  |\n");
    printf("|      1.play      |\n");
    printf("|      0.exit      |\n");
    printf("|__________________|\n");
}

void Init(char board[XS][YS], char set)
{
    for (int i = 0; i < XS; i++)
        for (int j = 0; j < YS; j++)
            board[i][j] = set;
}

void Print(char board[XS][YS])
{
    //打印列号
    for (int i = 0; i <= X; i++) {
        if (i == 0) printf("    ");
        else if (i == X) printf("%d列 \n\n", i);
        else printf("%d列 ", i);
    }

    //只打印中间的部分
    for (int i = 1; i <= X; i++)
    {
        //打印行号
        printf("%d行 ", i);
        for (int j = 1; j <= Y; j++)
        {
            printf(" %c  ", board[i][j]);
        }
        printf("\n\n");
    }
    printf("\n");
}

void Setmine(char mine[XS][YS])
{
    srand((unsigned int)time(NULL));//打破伪循环
    int count = EASY;
    while (count)//每布置一个count-- 到0跳出循环
    {
        int x = rand() % X + 1;
        int y = rand() % Y + 1;
        if (mine[x][y] != '1')
        {
            mine[x][y] = '1';
            count--;
        }
    }
}

void Findmine(char mine[XS][YS], char show[XS][YS]) {
    int win = 0;
    while (win<X*Y-EASY)
    {
        printf("请输入行列得以排查雷:");
        int a = 0, b = 0;
        scanf("%d %d", &a, &b);
        if (a >= 1 && a <= X && b >= 1 && b <= Y)
        {
            if (mine[a][b] == '1')
            {
                printf("你被炸到了,%d行%d列有雷\n", a, b);
                Print(mine);
                break;
            }
            else if (mine[a][b] == '0')
            {
                 //'0'-'0'=0      48-48=0
                 //'1'-'0'=1      49-48=0
                int num = num_mine(mine, a, b);
                show[a][b] = '0' + num;//该处是字符非数字
                Print(mine);//!!!test !!!
                Print(show);//!!!test !!!
                win++;
            }
            if (win == X * Y - EASY)
            {
                printf("感谢您排雷成功!\n");
                Print(show);
            }
        }
        else
        {
            printf("输入错误,请重新输入\n");
        }
        
    }
    
}

int num_mine(char mine[XS][XS],int a,int b)
{
    int sum = 0;
    for (int i = a - 1; i <= a + 1; i++)
    {
        for (int j = b - 1; j <= b + 1; j++)
        {
            if (mine[i][j] == '1' && !(i == a && j == b))
            {
                sum++;
            }
        }
    }
    return sum;
}

void game()
{
    char mine[XS][YS] = { 0 };
    char show[XS][YS] = { 0 };
    Init(mine, '0');//初始化雷数组
    Init(show, '*');//初始化显示界面
    Print(show);//显示初始界面
    Setmine(mine);//布置雷
    Print(mine);//显示雷数
    Findmine(mine, show);

}

void start_game()
{
    int  input = 1;

    do
    {
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 0:
            printf("游戏结束\n");
            break;
        case 1:
            game();
            break;
        default:
            printf("输入错误,请重新输入!\n");
            break;
        }
    } while (input);

}

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值