cmd端精简版扫雷= =(纯c)

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

int Menu(){
    printf("██████████████████\n");
    printf("█ █\n");
    printf("█ █\n");
    printf("█  扫      雷 █\n");
    printf("█       █\n");
    printf("█ █\n");
    printf("█ █\n");
    printf("█   1. 开始游戏     █\n");
    printf("█   0. 退出游戏     █\n");
    printf("█     请输入您的选择:     █\n");
    printf("█ █\n");
    printf("██████████████████\n");
    int choice = 0;
    scanf("%d", &choice);
    return choice;
}

#define MAXCHANG 9
#define MAXKUAN 9
#define COUNT 10

void _map(char show_map[MAXCHANG][MAXKUAN], char mine_map[MAXCHANG][MAXKUAN]){
    for (int i = 0; i < MAXCHANG; ++i){
        for (int j = 0; j < MAXKUAN; ++j){
            show_map[i][j] = '*';
        }
    }
    for (int i = 0; i < MAXCHANG; ++i){
        for (int j = 0; j < MAXKUAN; ++j){
            mine_map[i][j] = '0';
        }
    }
    int count = COUNT;    
    //如果是雷用"!",如果不是用0,1,2,3,4,5,6,7,8表示
    while (count > 0){
        int mine_i = rand() % MAXCHANG;
        int minr_j = rand() % MAXKUAN;
        if (mine_map[mine_i][minr_j] == '!'){
            continue;
        }
        mine_map[mine_i][minr_j] = '!';
        --count;
    }
}

void PrintMap(char map[MAXCHANG][MAXKUAN]){
    printf("███████████\n");
    for (int i = 0; i < MAXCHANG; ++i){
        printf("█");
        for (int j = 0; j < MAXKUAN; ++j){
            printf("%c ", map[i][j]);
        }
        printf("█\n");
    }
    printf("███████████\n");
    printf("****横纵坐标为0-8****\n");
}

// (c-1,k-1) (c-1,k) (c-1,k+1)
// (c,k-1)   (c,k)   (c,k+1)
// (c+1,k-1) (c+1,k) (c+1,k+1)
//void open_mine(int x, int y, char mine_map[MAXCHANG][MAXKUAN], char show_map[MAXCHANG][MAXKUAN]);

void judge(int c, int k, char mine_map[MAXCHANG][MAXKUAN], char show_map[MAXCHANG][MAXKUAN]){
    int count = 0;
    if (c - 1 >= 0 && k-1 >= 0 && mine_map[c - 1][k - 1] == '!'){
        ++count;
    }
    if (c - 1 >= 0 && mine_map[c - 1][k] == '!'){
        ++count;
    }
    if (c - 1 >= 0 && k + 1 < MAXKUAN && mine_map[c - 1][k + 1] == '!'){
        ++count;
    }
    if (k - 1 >= 0 && mine_map[c][k - 1] == '!'){
        ++count;
    }
    if (k + 1 < MAXKUAN && mine_map[c][k + 1] == '!'){
        ++count;
    }
    if (c + 1 <= MAXCHANG && k - 1 >= 0 && mine_map[c + 1][k - 1] == '!'){
        ++count;
    }
    if (c + 1 <= MAXCHANG && mine_map[c + 1][k] == '!'){
        ++count;
    }
    if (c + 1 <= MAXCHANG && k + 1 < MAXKUAN && mine_map[c + 1][k + 1] == '!'){
        ++count;
    }
    show_map[c][k] = count + '0';
    //if (count == 0){
    //    open_mine(c, k, mine_map, show_map);
    //}
    //else{
    //    return;
    //}
}

//坐标周围展开
//void open_mine(int x, int y, char mine_map[MAXCHANG][MAXKUAN], char show_map[MAXCHANG][MAXKUAN]){
//    if (x - 1 >= 0 && y - 1 >= 0 && mine_map[x - 1][y - 1] == '0')
//    {
//        judge(x - 1, y - 1, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (x - 1 >= 0 && mine_map[x - 1][y] == '0')
//    {
//        judge(x - 1, y, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (x - 1 >= 0 && y + 1 < MAXKUAN && mine_map[x - 1][y + 1] == '0')
//    {
//        judge(x - 1, y + 1, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (y - 1 >= 0 && mine_map[x][y - 1] == '0')
//    {
//        judge(x, y - 1, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (y + 1 < MAXKUAN && mine_map[x][y + 1] == '0')
//    {
//        judge(x, y + 1, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (x + 1 <= MAXCHANG && y - 1 >= 0 && mine_map[x + 1][y - 1] == '0')
//    {
//        judge(x + 1, y - 1, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (x + 1 <= MAXCHANG && mine_map[x + 1][y] == '0')
//    {
//        judge(x + 1, y, mine_map, show_map);//显示该坐标周围雷数
//    }
//    if (x + 1 <= MAXCHANG && y + 1 < MAXKUAN && mine_map[x + 1][y + 1] == '0')
//    {
//        judge(x + 1, y + 1, mine_map, show_map);//显示该坐标周围雷数
//    }
//}

//int count_show_map(char show_map[MAXCHANG][MAXKUAN])//判断剩余未知区域的个数,个数为雷数时玩家赢
//{
//    int count = 0;
//    int i = 0;
//    int j = 0;
//    for (i = 1; i <= MAXCHANG - 2; i++)
//    {
//        for (j = 1; j <= MAXKUAN - 2; j++)
//        {
//            if (show_map[i][j] == '*')
//            {
//                count++;
//            }
//        }
//
//    }
//    return count;
//}

void game(){
    char show_map[MAXCHANG][MAXKUAN] = { 0 };
    char mine_map[MAXCHANG][MAXKUAN] = { 0 };
    //1.初始化地图:9*9(第一个二维数组)设置地雷;10个(第二个二维数组)
    _map(show_map, mine_map);
    //2.打印初始地图
    PrintMap(show_map);
    int num = 0;
    //3.玩家踩砖
    while (1){
        printf("请输入你要翻开的位置(先横后纵,空格隔开!): ");
        int c = 0;
        int k = 0;
        scanf("%d %d", &c, &k);
        if (c < 0 || c >= MAXCHANG || k < 0 || k >= MAXKUAN){
            printf("您的输入非法!请重输\n");
            continue;
        }
        if (show_map[c][k] != '*'){
            printf("此位置已近翻开!\n");
            continue;
        }
        //4.判断是否踩雷
        if (mine_map[c][k] == '!'){
            system("cls");
            printf("很遗憾!你踩到地雷了!\n");
            PrintMap(mine_map);
            system("pause");
            printf("game over!\n");
            system("cls");
            return;
        }
        ++num;
        //5.判断胜利,若打开所有的非雷格子则游戏结束
        if (num == MAXCHANG * MAXKUAN - COUNT /*|| count_show_map(show_map) == COUNT*/){
            printf("恭喜你,winner!\n");
            return;
        }
        //6.若没有胜利也没有失败打印踩过砖块之后的地图
        //{
        //(1)若这里不是雷但周围有雷则打印周围8个格子的雷数
        //(2)若这里不是雷周围八个格子也没雷就打开周围的八个格子
        //(3)循环此操作一直到打开的每一个格子周围都有雷的警告为止
        //}
        judge(c, k, mine_map, show_map);
        system("cls");
        PrintMap(show_map);
    }
    
}

int main(){
    srand((unsigned int)time(0));
    while (1){
        int choice = Menu();
        system("cls");
        if (choice == 1){
            game();
        }
        else if (choice == 0){
            printf("good bye!\n");
            break;
        }
        else{
            printf("非法输入请重输\n");
        }
    }
    system("pause");
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很抱歉,我无法为您提供编写游戏的完整代码。但是,我可以为您提供一个基本的思路和一些代码示例,以帮助您开始编写扫雷游戏。 首先,您需要创建一个二维数组来表示扫雷游戏的棋盘。数组中的每个元素将表示一个方块,其中包含以下信息: - 是否是地雷 - 周围地雷的数量 - 是否已经被翻开 - 是否已经被标记 接下来,您可以使用随机数生成器来随机放置地雷。然后,您需要计算每个方块周围的地雷数量,并将其存储在相应的方块中。 接下来,您可以编写一个函数来处理玩家单击方块的情况。如果方块是地雷,游戏结束。否则,将方块标记为已翻开,并显示周围地雷的数量。如果周围没有地雷,您需要递归地翻开周围的方块。 您还需要编写一个函数来处理玩家右键单击方块的情况。如果方块已经被标记,将其取消标记。否则,将其标记为已标记。 最后,您需要编写一个主程序来运行游戏。该程序应该显示棋盘并等待玩家的输入。一旦玩家单击或右键单击方块,程序应该调用相应的函数来处理该情况,并更新棋盘。 以下是一个使用Python编写的基本扫雷游戏的示例代码: ```python import random # 初始化棋盘 board_size = 10 num_mines = 10 board = [[{'mine': False, 'num_mines': 0, 'revealed': False, 'marked': False} for _ in range(board_size)] for _ in range(board_size)] # 随机放置地雷 mines = random.sample(range(board_size * board_size), num_mines) for mine in mines: row = mine // board_size col = mine % board_size board[row][col]['mine'] = True # 计算每个方块周围的地雷数量 for row in range(board_size): for col in range(board_size): if not board[row][col]['mine']: for i in range(max(0, row-1), min(row+2, board_size)): for j in range(max(0, col-1), min(col+2, board_size)): if board[i][j]['mine']: board[row][col]['num_mines'] += 1 # 处理玩家单击方块的情况 def reveal(row, col): if board[row][col]['mine']: print('Game over!') return board[row][col]['revealed'] = True if board[row][col]['num_mines'] == 0: for i in range(max(0, row-1), min(row+2, board_size)): for j in range(max(0, col-1), min(col+2, board_size)): if not board[i][j]['revealed']: reveal(i, j) # 处理玩家右键单击方块的情况 def mark(row, col): board[row][col]['marked'] = not board[row][col]['marked'] # 显示棋盘 def display(): for row in range(board_size): for col in range(board_size): if board[row][col]['revealed']: if board[row][col]['mine']: print('*', end='') else: print(board[row][col]['num_mines'], end='') elif board[row][col]['marked']: print('X', end='') else: print('-', end='') print() # 运行游戏 while True: display() row = int(input('Enter row: ')) col = int(input('Enter col: ')) action = input('Enter action (r for reveal, m for mark): ') if action == 'r': reveal(row, col) elif action == 'm': mark(row, col) ``` 这只是一个基本的示例代码,您可以根据自己的需要进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值