c语言简单扫雷实现

思想:创建一个棋盘,但是棋盘有边界,在统计雷时要考虑边界就很麻烦,所以不能直接将棋拿来使用,所以将棋盘边界不适用,数组下标从1开始,末处边界也不使用。创建两个字符数据,选字符数组可以可以直接通过字符设置雷,一个字符数组用于向外展示,一个字符数组不展示。向外展示的遮盖住,不向外展示的用来设置雷区,通过用户的输入,现在雷区中判定是否该位置有雷,或者是周围有多少雷,然后在向外展示数组将覆盖处改成雷的个数。

头文件

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

#define Row 12//横通过改变此处来改变棋盘的大小
#define Col 12//纵
#define Num 20//雷的个数
#define Boom '@'//雷的字符

extern void Menu();
extern void Game();
extern void Show(char Bord[][Col]);//用于展示棋盘
extern void SetMine(char clear[][Col]);//设置雷在棋盘中
extern int BoomCount(char Bord[][Col],int x,int y);//统计改坐标附近八个位置雷的个数

源文件

#include"myclear.h"

int main() {
    srand((unsigned long)time(NULL));//下次游戏重新设置雷
    int flag = 1;
    while (flag) {
    int select = 0;
    Menu();
    scanf("%d", &select);
    switch (select) {
    case 1:Game();
        break;
    case 2:flag = 0;
        printf("拜拜\n");
        break;
    default:
        printf("输入有误,重新输入\n");
        break;
     }
    }

Sleep(1000);

system("cls");
    return 0;
}

源文件

#include"myclear.h"

void Menu() {
    printf("#################\n");
    printf("# 1.开始 2.退出 #\n");
    printf("#################\n");
    printf("Please select: ");
}

void SetMine(char clear[][Col]) {
    int _x, _y;
    int index = Num;
    while (index) {
        _x = rand() % 10 + 1;
        _y = rand() % 10 + 1;
        if (clear[_x][_y] == Boom)
            continue;
        clear[_x][_y] = Boom;
        index--;
    }
}

void Show(char Bord[][Col]){
    for (int i = 1; i <= Row - 2; i++) {
        for (int j = 1; j <= Col - 2; j++) {
            printf("%2c", Bord[i][j]);
        }
        printf("\n");
    }
}

int  BoomCount(char Bord[][Col],int x,int y) {
    return (Bord[x - 1][y - 1] + Bord[x - 1][y] +
        Bord[x - 1][y + 1] + Bord[x][y - 1] +
        Bord[x][y + 1] + Bord[x + 1][y - 1] +
        Bord[x + 1][y] + Bord[x + 1][y + 1] - 8 * '0') / 16;
}

void Game() {
    char Show_clear[Row][Col];//向外展示的区域
    char My_clear[Row][Col];//不向外展示的区域
    memset(My_clear, '0', sizeof(My_clear));
    memset(Show_clear, '*', sizeof(Show_clear));
    SetMine(My_clear);
    int blank = (Row - 2) * (Col - 2) - Num;//棋盘中不是雷的块
    int clearnum = 0;//扫到不是雷块就记录起来
    while (1) {
        system("cls");//清屏,保证再次输入的界面在最上面
        Sleep(1);//清屏的时间间隔
        Show(Show_clear);
        int x = 0, y = 0;
        printf("请输入坐标:");
        scanf("%d %d", &x, &y);
        if (x<1 && x>Row - 2 && y<1 && y>Col - 2) {
            printf("输入有误,重新输入\n");
            continue;
        }
        if (Show_clear[x][y] != '*') {
            printf("该处雷已经被排除,重新输入\n");
            continue;
        }
        if (My_clear[x][y] == '@') {
            printf("你被炸死了!\n");

            printf("请选择:\n");
            Sleep(1000);
            break;
        }
        else {
            int count = BoomCount(My_clear, x, y);
            Show_clear[x][y] = count + '0';//将该位置改成周围雷的数量
            clearnum++;
        }
        if (clearnum >= blank) {//若扫雷区不是雷块数量大于等于blank
            printf("你已经获得胜利!\n");
            break;
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个学编程的

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

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

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

打赏作者

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

抵扣说明:

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

余额充值