扫雷游戏逐步实现(简单方法)

一.扫雷游戏分析

首先扫雷这个游戏肯定是跟电脑自带的扫雷功能大差不差(在棋盘上随机布置10个雷,不是雷的话显示周围有几个雷,选到雷游戏结束,剩下位置全部是雷,游戏成功。),但是用c语言写出来现阶段还是用c语言控制台去完成游戏。

我们肯定需要一个选择游戏开始的菜单界面比如:

之后需要设置数组来存储布置的雷和排查出的雷的信息,如果这个位置布置雷,我们就存放1,没有布置雷就存放0.

布置雷的棋盘:

让他可以通过坐标来输入并且排查雷。比如(2,2)的位置为1,则是雷,如果输入坐标2,2则选中雷游戏机结束,通过两个二维数组分别来完成这个操作。

同时我们需要在选择的位置附近有雷的情况下,显示出周围附件8个个坐标中,有几颗雷。但 为了防⽌越界,我们在设计的时候,给数组扩⼤⼀圈,雷还是布置在中间的9*9的坐标上,周围⼀圈不去布置雷就⾏,这样就解决了越界的问题。

二.代码逐步实现。

我们先创建一个.c和.h文件。你也可以创建多个.c分别存储(自己随机命名就好,我是创建了一个GAME.h文件和扫雷游戏.c文件(主函数文件)以及一个function.c文件)。

GAME.h文件里面放库函数头文件以及自定义函数声明。(图里面只是小部分,通过后面的代码还会进行补充。)

扫雷游戏.c则选择存放我们的主函数以及程序。(引用自定义头文件用“”

function.c文件我用来存放自定义函数。

之后我们来创建游戏开始菜单。自定义一个函数命名为menu,里面存放刚开始的我们需要选择1或者0来进入游戏退出游戏的选项。

在游戏开始菜单创建好之后我们开始写进入扫雷游戏的游戏界面,因为我们需要排查雷,所以要注意不要越界,多创建一圈。我们在创建的时候创建两个数组,一个用来存放雷的信息,一个来存放排查出来雷的信息。

创建棋盘代码:

扫雷游戏.c

function.c

GAME.h

控制台

在扫雷棋盘初始化输出好之后,我们就需要往里面埋雷并且我们要让他显示出附件有几个雷,因为我们现在这一步仅仅是一个初始化的空棋盘,里面并没有雷和东西。

我们先来布置雷,用生成随机数的方法,控制电脑在棋盘上随机生成雷

GAME.h

function.c

扫雷游戏.c

现在这一步我们就在mine棋盘上埋好了雷,而接下里我们需要的就是当时我们输入坐标的时候,在他不为雷,就要显示附件有几个雷。

function.c

GAME.h

做到这里差不多的功能以及完成了,因为是9*9的棋盘,所以这个时候我们能需在排查雷的执行过程中循环次数为9(行)*9(列)=81-10(雷的个数)让他在在排完所有雷的时候结束循环。制作出通过提示。并且检测代码是否正常运行。

接下来让我们看一下全部完成之后的代码和效果:

GAME.h的内容:

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#define  EASY_COUNT 10//设置雷的个数方便之后更改

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

#define ROW 9//宏定义行为9
#define COL 9//宏定义列为9.这样定义方便之后更改。

//让他的加一圈,防止越界
#define ROWS ROW+2
#define COLS COL+2

void Initialize_chessboard(char arr[ROWS][COLS], int  rows, int cols,char set);//初始化函数声明

void Print_chessboard(char arr[ROWS][COLS], int row,int col);//打印棋盘函数声明

void SetMine(char arr[ROWS][COLS], int row, int col);//布置雷声明

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷声明

int GetMineCount(char mine[ROWS][COLS], int x, int y);//嵌套进去的让查看附近8个坐标雷的个数

扫雷游戏.c的内容:

#include"GAME.h"

void menu() {//游戏开始菜单
    printf("###############################\n");
    printf("#########   1.paly  ###########\n");
    printf("#########   0.exit  ###########\n");
    printf("###############################\n");

}

void game(){
    char mine[ROWS][COLS];//创建数组棋盘

    char show[ROWS][COLS];

    Initialize_chessboard(mine, ROWS, COLS,'0');//初始化棋盘都为“0”
    Initialize_chessboard(show, ROWS, COLS,'*');//初始化棋盘都为“*”

    Print_chessboard(show, ROW, COL);//打印棋盘

    SetMine(mine, ROW, COL);//把雷放进棋牌

    //Print_chessboard(mine, ROW, COL);//打印棋盘

    FindMine(mine, show, ROW, COL);//排查附近的雷

}

int main() {

    int input = 0;//创建开始菜单选择变量
    srand((unsigned int)time(NULL));

    do {//do while循环开始菜单
        menu();
        printf("请选择开始游戏或者退出:");
        scanf("%d", &input);
        switch (input)//switch根据输入的数字分支选择输出
        {
        case 1:
            game();//创建游戏界面
            break;
        case 0:
            printf("游戏退出\n");
            break;
        default:
            printf("输出错误,请重新选择\n");
            break;
        }
    } while (input);
    return 0;
}

最后就是函数的实现function.c的内容

#include"GAME.h"

void Initialize_chessboard(char arr[ROWS][COLS], int  rows, int cols,char set) {
    int i = 0;//创建变量i控制行
    for (i = 0; i < rows; i++) {
        int j = 0;//创建变量j控制列
        for (j = 0; j < cols; j++) {
            arr[i][j] = set;//初始化棋盘
        }
    }

}

void Print_chessboard(char arr[ROWS][COLS], int row, int col){//打印棋盘函数
    int i = 1;
    printf("*******扫雷游戏开始啦*******\n");
    for (i = 0; i <= row; i++) {//输出列号
        printf("%d ",  i);
    }
    printf("\n");

    for (i = 1; i <= row; i++) {
        int j = 0;
        printf("%d ", i);//输出行号
        for (j = 1; j <= col; j++) {
            printf("%c ", arr[i][j]);
        }
        printf("\n");
    }
    printf("*******扫雷游戏开始啦*******\n");

}

void SetMine(char arr[ROWS][COLS], int row, int col) {
    int lei = EASY_COUNT;//创建10个雷
    while (lei) {

        int x = rand() % row + 1;//生产1-9坐标来布置雷
        int y = rand() % col + 1;

        if (arr[x][y] == '0') {
            arr[x][y] = '1';
            lei--;//一共十个雷,布置一个少一个
        }

    }
}

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
    int z = 0;
    z = (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
    return z;
    //统计周围八个坐标里面有几个炸弹(几个1)

}

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 (mine[x][y] == '1' ) 
            {//找到雷的情况
                printf("恭喜你,你被炸死了!\n");
                Print_chessboard(mine, ROW, COL);//显示出雷在哪里
                Sleep(1000);//睡眠一秒
                system("cls");//完成之后清理屏幕
                break;
            }
            else 
            {//没找到雷,就统计坐标附近有几个雷
                int n = GetMineCount(mine, x, y);
                show[x][y] = n + '0';
                Print_chessboard(show, ROW, COL);
                win++;//没踩雷,就加一直到超出循环
            }
        }
        else 
        {
            printf("坐标输入错误,请重新输入\n");
        }
    }

    if (win == row * col - EASY_COUNT){
        printf("你已经排出全部的雷!恭喜你通过游戏\n");
        Print_chessboard(mine, ROW, COL);//显示出雷在哪里
        Sleep(1000);
        system("cls");//完成之后清理屏幕
    }
}


来看看最终效果呈现吧:

写出来还挺有成就感的,来回刷了好几遍,模仿并用学过的知识加了一点点小功能(睡眠清屏啥的)。一起努力吧大家!!!

写出来的代码放在了(CUI BODONG (cui-bodong) - Gitee.com)码云,可以自提

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值