扫雷小游戏——C实现

简介: 扫雷小游戏——C实现

@TOC


:gem::gem::gem: 今天学习一个自制小游戏——扫雷小游戏

在这里插入图片描述

一、效果展示

:sunny::sunny::sunny: 我们可以实现纯C语言实现扫雷小游戏,效果如下

在这里插入图片描述

在这里插入图片描述

大家也可以体现下官方版本:点我即玩
在这里插入图片描述

二、游戏功能实现(详细版)

1.雷盘初始化

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
    int x = 0;
    int y = 0;
    for (x = 0; x < rows; x++) {
        for (y = 0; y < cols; y++) {
            board[x][y] = set;
        }
    }
}

2.布雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
    int count = EASY_COUNT;
    //1~9
    //1~9
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;

        if (board[x][y] == '0')
        {
            board[x][y] = '1';
            count--;
        }
    }
}

3.打印雷盘

void DisplayBoard(char board[ROWS][COLS], int row, int col) {
    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++) {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
    printf("------扫雷游戏------\n");
     
}

4.排查雷

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int win = 0;//找到非雷的个数
    while (win < row * col - EASY_COUNT)
    {
        printf("请输入要排查的坐标:>");
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] != '*')
            {
                printf("该坐标被排查过了,不能重复排查\n");
            }
            else
            {
                //如果是雷
                if (mine[x][y] == '1')
                {
                    printf("很遗憾,你被炸死了\n");
                    DisplayBoard(mine, ROW, COL);
                    break;
                }
                else//如果不是雷
                {
                    win++;
                    //统计mine数组中x,y坐标周围有几个雷
                    int count = get_mine_count(mine, x, y);
                    show[x][y] = count + '0';//转换成数字字符
                    DisplayBoard(show, ROW, COL);
                }
            }
        }
        else
        {
            printf("输入的坐标非法,请重新输入\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功\n");
        DisplayBoard(mine, ROW, COL);
    }
}  
:gem::gem::gem: 这里仅仅是简单的把选择的位置点击出来,不含任何技术,如果大家感兴趣的话,可能用递归实现点击实现一大片的功能
在这里插入图片描述

5.计算周围雷的个数

int get_mine_count(char board[ROWS][COLS], int x, int y)
{
    return (board[x - 1][y] +
        board[x - 1][y - 1] +
        board[x][y - 1] +
        board[x + 1][y - 1] +
        board[x + 1][y] +
        board[x + 1][y + 1] +
        board[x][y + 1] +
        board[x - 1][y + 1] - 8 * '0');
}

三、test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void menu() {
    printf("********************\n");
    printf("****  1.play  ******\n");
    printf("****  0.exit  ******\n");
    printf("********************\n"); 
}
void game() {
    //存放雷的信息
    char mine[ROWS][COLS] = { 0 };
    //存放排查出雷的信息
    char show[ROWS][COLS] = { 0 };
    //初始化数组内容为指定内容
    //mine 数组在没有布置雷的时候都是'0'
    InitBoard(mine, ROWS, COLS, '0');
    //show  数组在没有布置雷的时候都是'*'
    InitBoard(show, ROWS, COLS, '*');
    //设置雷
    SetMine(mine, ROW, COL); 
    DisplayBoard(show, ROW, COL);
    //排查雷
    FindMine(mine, show, ROW, COL);
}
int main() {
    //设置随机数的起点
    srand((unsigned int)time(NULL));
    int input = 0;
    do {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch (input) {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
                break;
        default:
            printf("请重新选择\n");
            break;
        }
    } while (input);
    return 0;
}

四、game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) {
    int x = 0;
    int y = 0;
    for (x = 0; x < rows; x++) {
        for (y = 0; y < cols; y++) {
            board[x][y] = set;
        }
    }
}

void DisplayBoard(char board[ROWS][COLS], int row, int col) {
    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++) {
            printf("%c ", board[i][j]);
        }
        printf("\n");
    }
    printf("------扫雷游戏------\n");
     
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
    int count = EASY_COUNT;
    //1~9
    //1~9
    while (count)
    {
        int x = rand() % row + 1;
        int y = rand() % col + 1;

        if (board[x][y] == '0')
        {
            board[x][y] = '1';
            count--;
        }
    }
}
int get_mine_count(char board[ROWS][COLS], int x, int y)
{
    return (board[x - 1][y] +
        board[x - 1][y - 1] +
        board[x][y - 1] +
        board[x + 1][y - 1] +
        board[x + 1][y] +
        board[x + 1][y + 1] +
        board[x][y + 1] +
        board[x - 1][y + 1] - 8 * '0');
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    int win = 0;//找到非雷的个数
    while (win < row * col - EASY_COUNT)
    {
        printf("请输入要排查的坐标:>");
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (show[x][y] != '*')
            {
                printf("该坐标被排查过了,不能重复排查\n");
            }
            else
            {
                //如果是雷
                if (mine[x][y] == '1')
                {
                    printf("很遗憾,你被炸死了\n");
                    DisplayBoard(mine, ROW, COL);
                    break;
                }
                else//如果不是雷
                {
                    win++;
                    //统计mine数组中x,y坐标周围有几个雷
                    int count = get_mine_count(mine, x, y);
                    show[x][y] = count + '0';//转换成数字字符
                    DisplayBoard(show, ROW, COL);
                }
            }
        }
        else
        {
            printf("输入的坐标非法,请重新输入\n");
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功\n");
        DisplayBoard(mine, ROW, COL);
    }
}  

五、game.h

#pragma once


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


#define ROW 9
#define COL 9

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

#define EASY_COUNT 10

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void SetMine(char board[ROWS][COLS], int row, int col);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
目录
相关文章
|
4月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
64 1
C 语言——实现扫雷小游戏
|
8月前
|
C语言
扫雷游戏
扫雷游戏
57 0
|
8月前
|
Linux C语言
|
C语言
扫雷游戏的实现(上)
扫雷游戏的实现
68 0
|
8月前
|
C语言 C++
C语言项目(1)----扫雷小游戏的实现
C语言项目(1)----扫雷小游戏的实现
68 0
|
小程序
小游戏扫雷实现教学(详解)
小游戏扫雷实现教学(详解)
240 0
小游戏扫雷实现教学(详解)
|
C语言
C/关于扫雷小游戏的创建
C/关于扫雷小游戏的创建
|
8月前
贪吃蛇小游戏
贪吃蛇小游戏
316 5
|
8月前
leetcode-529:扫雷游戏
leetcode-529:扫雷游戏
63 0

相关实验场景

更多