简易扫雷代码(c初阶)

//由于本人是新手代码可能存在缺陷,望海涵。

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


#define ROW 9
#define COL 9
#define easy_count 10

#define ROWS ROW + 2
#define COLS COL + 2

void initboard(char board[ROWS][COLS], int rows, int cols);//board同时照顾mine和show

void printfboard(char board[ROWS][COLS], int row, int col);//传输时还是11行传

void setmine(char board[ROWS][COLS], int row, int col);//布置雷

void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

int  how_many(char mine[ROWS][COLS], int x, int y);


//初始化数组
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
    int i = 0;
    for (i = 0; i < rows; i++)
    {
        int j = 0;
        for (j = 0; j < cols; j++)
        {
            board[i][j] = set;
        }
    }
}

//打印棋盘
void printfboard(char board[ROWS][COLS], int row, int col)//传输时还是11行传
{
    int i = 0;
    int j = 0;
    //给棋盘加些注释
    printf("————————扫雷游戏————————\n");
    //打印列编号
    for (j = 0; j <= col; j++)
    {
        printf("%d ", j);
    }
    printf("\n");


    for (i = 1; i <= row; i++)
    {
        //打印行编号
        printf("%d ", i);
        for (j = 1; j <= col; j++)//为一是因为从11*11函数中截取了9*9的一部分
        {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
    printf("————————扫雷游戏————————\n");


    //布置雷  
}void setmine(char mine[ROWS][COLS], int row, int col)
{
    //难度系数
    int count = easy_count;

    while (count)
    {
        //生成随机值
        int x = rand() % row + 1;

        int y = rand() % col + 1;
        //随机值除余9为8

        //布置雷
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            //雷为‘1’字符1
            count--;
        }

    }
    //printfboard(mine, ROW, COL);
}


//排查雷
void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    printf("请输入要排查的坐标\n");
    int x = 0;
    int y = 0;
    int win = 0;
    while (win < (row * col - easy_count))
    {
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 0 && y <= col)
            //判断在不在正确范围
        {
            if (mine[x][y] == '1')
            {
                printf("你被炸死了哦\n");
                //printfboard(mine, ROW, COL);
                break;
            }
            else
                //计算周围有几个雷
            {
                int n = how_many(mine, x, y);

                //将数字n转换为字符n
                show[x][y] = n + '0';

                printfboard(show, ROW, COL);

                win++;
            }

        }
        else
        {
            printf("输入坐标非法请重新输入\n");
        }
    }
    if (win == (row * col - easy_count))
    {
        printf("你赢了!\n\n");
    }
}


//判断周围几个雷
int  how_many(char mine[ROWS][COLS], int x, int y)
{
    //计算周围八个数各减去‘0’的结果的和 , 即‘1’个数的和
    return
        (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] +
            mine[x][y - 1] + mine[x][y + 1] +
            mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0');
}


void game()
{
    //1.需要存放布置好的雷的信息,存放排查出的雷的信息,我们需要两个二维数组
    //2.排查坐标的时候,为了防止坐标越界,我们给数组的行增加2行,列增加两列
    char mine[ROWS][COLS];//存放好雷的信息
    char show[ROWS][COLS];//排查出雷的信息

    //初始化数组
    initboard(mine, ROWS, COLS, '0');
    initboard(show, ROWS, COLS, '*');

    //打印棋盘
    //不用打印11行,只需9行

    //printfboard(mine, ROW, COL);
    printfboard(show, ROW, COL);

    //布置雷  将雷随机传到中间的9 * 9 个格子

    setmine(mine, ROW, COL);
    //printfboard(mine, ROW, COL);

    //排查雷
    findmine(mine, show, ROW, COL);

}


void menu()
{
    printf("******1.开始游戏*******\n");
    printf("******2.结束游戏*******\n");
}


void test()
{
    srand((unsigned int)time(NULL));
    //这个是强制类型转换

    int input = 0;
    do
    {
        menu();

        printf("请选择\n");
        scanf("%d", &input);

        switch (input)
        {
        case 1:

            game();

            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }

    } while (input);

}


int main()
{
    test();
    return 0;

}


 

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的基于Linux的扫雷游戏C语言代码代码实现了一个简单的扫雷游戏,玩家可以选择不同的难度级别并尝试找到所有地雷。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 10 #define COL 10 #define EASY 10 #define MEDIUM 20 #define HARD 30 int main() { int board[ROW][COL], num_mines, num_flags; int i, j, r, c, count, gameover = 0, win = 0, choice; char action; srand(time(NULL)); printf("Welcome to Minesweeper\n"); printf("----------------------\n"); printf("Choose a difficulty level:\n"); printf("1. Easy\n2. Medium\n3. Hard\n"); scanf("%d", &choice); switch (choice) { case 1: num_mines = EASY; break; case 2: num_mines = MEDIUM; break; case 3: num_mines = HARD; break; default: printf("Invalid choice. Defaulting to Easy difficulty.\n"); num_mines = EASY; break; } //initialize board with 0's for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = 0; } } //place mines randomly for (i = 0; i < num_mines; i++) { r = rand() % ROW; c = rand() % COL; if (board[r][c] == -1) { //already a mine here i--; continue; } board[r][c] = -1; } //fill in numbers for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == -1) { //skip mines continue; } count = 0; if (i-1 >= 0 && j-1 >= 0 && board[i-1][j-1] == -1) count++; if (i-1 >= 0 && board[i-1][j] == -1) count++; if (i-1 >= 0 && j+1 < COL && board[i-1][j+1] == -1) count++; if (j-1 >= 0 && board[i][j-1] == -1) count++; if (j+1 < COL && board[i][j+1] == -1) count++; if (i+1 < ROW && j-1 >= 0 && board[i+1][j-1] == -1) count++; if (i+1 < ROW && board[i+1][j] == -1) count++; if (i+1 < ROW && j+1 < COL && board[i+1][j+1] == -1) count++; board[i][j] = count; } } //game loop while (!gameover && !win) { num_flags = 0; printf("\n\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { if (board[i][j] == -2) { //flag printf("F "); num_flags++; } else if (board[i][j] >= 0 && board[i][j] <= 8) { printf("%d ", board[i][j]); } else { printf("X "); } } printf("\n"); } printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n\n"); printf("Number of flags: %d\n", num_flags); printf("Enter coordinate and action (f = flag, u = unflag, r = reveal): "); scanf("%d %d %c", &r, &c, &action); if (r < 0 || r >= ROW || c < 0 || c >= COL) { printf("Invalid coordinate.\n"); continue; } if (action == 'f' || action == 'F') { //flag if (board[r][c] != -2) { board[r][c] = -2; } else { board[r][c] = 0; } } else if (action == 'r' || action == 'R') { //reveal if (board[r][c] == -1) { //mine gameover = 1; } else { board[r][c] += 10; //reveal if (board[r][c] == 9) { //win win = 1; } else if (board[r][c] == 10) { //empty square //reveal adjacent squares if (r-1 >= 0 && c-1 >= 0 && board[r-1][c-1] >= 0 && board[r-1][c-1] <= 8) board[r-1][c-1] += 10; if (r-1 >= 0 && board[r-1][c] >= 0 && board[r-1][c] <= 8) board[r-1][c] += 10; if (r-1 >= 0 && c+1 < COL && board[r-1][c+1] >= 0 && board[r-1][c+1] <= 8) board[r-1][c+1] += 10; if (c-1 >= 0 && board[r][c-1] >= 0 && board[r][c-1] <= 8) board[r][c-1] += 10; if (c+1 < COL && board[r][c+1] >= 0 && board[r][c+1] <= 8) board[r][c+1] += 10; if (r+1 < ROW && c-1 >= 0 && board[r+1][c-1] >= 0 && board[r+1][c-1] <= 8) board[r+1][c-1] += 10; if (r+1 < ROW && board[r+1][c] >= 0 && board[r+1][c] <= 8) board[r+1][c] += 10; if (r+1 < ROW && c+1 < COL && board[r+1][c+1] >= 0 && board[r+1][c+1] <= 8) board[r+1][c+1] += 10; } } } else if (action == 'u' || action == 'U') { //unflag if (board[r][c] == -2) { board[r][c] = 0; } } else { printf("Invalid action.\n"); } } //game over, reveal all squares printf("\n\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { if (board[i][j] == -2) { //flag printf("F "); } else if (board[i][j] >= 0 && board[i][j] <= 8) { printf("%d ", board[i][j]); } else if (board[i][j] == -1) { //mine printf("M "); } else { printf("X "); } } printf("\n"); } printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n\n"); if (gameover) { printf("Game over! You hit a mine.\n"); } else { printf("Congratulations, you win!\n"); } return 0; } ``` 该代码包括以下功能: - 难度选择 - 地雷随机放置 - 数字填充 - 可以插旗 - 可以取消插旗 - 可以揭开方块 - 只有揭开所有非地雷方块才能获胜 这个代码还有可以改进的地方,比如增加计时器和玩家得分等等。但是,希望这个代码可以给你提供一个基础的思路和参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值