C语言 简化版 扫雷游戏

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

#define MAX_ROW 9
#define MAX_COL 9
#define MINE_COUNT 10
//游戏菜单
int Menu() {
    printf("==============================\n");
    printf("=======欢迎来到扫雷游戏 ======\n");
    printf("========= 1.开始游戏  ========\n");
    printf("========= 0.结束游戏  ========\n");
    printf("==============================\n");
    printf("请输入您的选择\n");
    int choice = 0;
    scanf("%d", &choice);
    return choice;
}
void Init(char showMap[MAX_ROW][MAX_COL], 
    char mineMap[MAX_ROW][MAX_COL]) {
    //1.先初始化mineMap ,把所有的位置都设成'*'
    memset(showMap, '*', MAX_ROW * MAX_COL);
    //2.再初始化 mineMap,先把里面所有的位置都设成0
    //然后随机找出10个位置设成地雷
    srand((unsigned int)time(0));
    memset(mineMap, '0', MAX_ROW * MAX_COL);
    int count = MINE_COUNT;
    while (count > 0) {
        int row = rand() % MAX_ROW;
        int col = rand() % MAX_COL;
        if (mineMap[row][col] == '1') {
            continue;
        }
        mineMap[row][col] = '1';
        count--;
    }
}
void Print(char showMap[MAX_ROW][MAX_COL]) {
    printf("  |");
    for (int col = 0; col < MAX_COL; col++) {
        printf("%d ", col);
    }
    printf("\n");
    printf("--+------------------\n");

    for (int row = 0; row < MAX_ROW; row++) {
        printf("%d |", row);
        for (int col = 0; col < MAX_COL; col++) {
            printf("%c ", showMap[row][col]);
        }
        printf("\n");
    }
}

void Input(char showMap[MAX_ROW][MAX_COL],int *row, int *col) {
    while (1) {
        printf("请输入要翻开位置的坐标:(row,col)\n");
        scanf("%d %d", row, col);
        if (*row < 0 || *row >= MAX_ROW || *col < 0 || *col >= MAX_COL) {
            printf("您的输入有误,请重输!\n");
            continue;
        }
        if (showMap[*row][*col] != '*') {
            printf("当前位置已经被翻开\n");
            continue;
        }
        break;
    }
    
}
int CheckMine(char mineMap[MAX_ROW][MAX_COL],
    int row,int col) {
    if (mineMap[row][col] == '1') {
        return 1;
    }
    return 0;
}

int CheckLastBlank(int *count) {
    *count += 1;
    if (*count == 71) {
        return 1;
    }
    return 0;
}
void Update(char showMap[MAX_ROW][MAX_COL], char mineMap[MAX_ROW][MAX_COL],
    int row, int col) {
    int count = 0;
    for (int r = row - 1; r <= row + 1; r++) {
        for (int c = col - 1; c <= col + 1; c++) {
            if (r < 0 || r >= MAX_ROW || c < 0 || c >= MAX_COL) {
                continue;
            }
            if (r == row && c == col) {
                continue;
            }
            if (mineMap[r][c] == '1') {
                count++;
            }
        }
    }
    showMap[row][col] = count + '0';
}
void game() {
    //1.先创建两个地图,并初始化
    char showMap[MAX_ROW][MAX_COL] = { 0 };
    char mineMap[MAX_ROW][MAX_COL] = { 0 };
    int count;
    Init(showMap, mineMap);
    while (1) {
        //2,打印地图
        Print(mineMap);
        printf("=====================\n");
        Print(showMap);

        //3.提示玩家输入要翻开位置的坐标,并校验
        int row = 0;
        int col = 0;
        Input(showMap,&row, &col);
        //4.检查当前位置是否有雷,如果有,则游戏结束
        if (CheckMine(mineMap, row, col)) {
            Print(mineMap);
            printf("您踩雷了,游戏失败!\n");
            break;
        }
        if (CheckLastBlank(&count)) {
            printf("恭喜您,扫雷成功\n");
            break;
        }
        Update(showMap,mineMap,row,col);
    }
}
int main() {
    while (1) {
        int choice = Menu();
        if (choice == 1) {
            game();
        }
        else if (choice == 0) {
            printf("Goodbey!\n");
            break;
        }
        else {
            printf("您的输入有误!\n");
        }
    }
    system("pause");
    return 0;
}

发布了42 篇原创文章 · 获赞 0 · 访问量 1451

猜你喜欢

转载自blog.csdn.net/HUAERBUSHI521/article/details/103265850