C语言-扫雷游戏

一 主要设计到的知识点:

        1.1 二维数组:

        1.2 循环语句

        for()

        while()

        do while()

        1.3 判断语句

        switch()

        1.4 函数的声明以及创建

         函数的声明:

        

二 代码分析:

        

        2.1 //设置随机数的起始点 srand((unsigned int)time(NULL)); 后边设置雷的时候会用到

        2.2进入do while()语句,然后打印游戏界面选择, 进行选择1进入游戏,0退出游戏

        

        当输入其他的,则会输出,输入错误的信息提醒玩家.

        2.3 进入游戏:

        

        这里首先定义两个二维数组,一个是布置好的雷的信息,一个是存放排查雷的信息,首先将二维数组在没布置雷的时候都存储'0',

        

        就是通过循环将传过来的存入二维数组里,代码很简单.

        2.4 没有排查雷的时候都存入'*',调用InitBoard()函数就行.

        2.5设置雷函数逻辑如下:

        

        EASY_COUNT设置的是10个雷,这可以修改,这里整得是宏定义,然后通过生成的随机数进行设置雷.

        2.6 打印这个函数逻辑大妈如下:

        

        2.7 排查雷逻辑代码如下:

三 源代码:

3.1 test.c文件

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#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, '*');

    //打印
    /*DispalyBoard(mine, ROW, COL);*/
    //设置雷
    SetMine(mine, ROW, COL);
    //打印
    //DispalyBoard(mine, ROW, COL);
    DispalyBoard(show, ROW, COL);

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

}


//主函数
int main()
{
    int input = 0;
    //设置随机数的起始点
    srand((unsigned int)time(NULL));
    //首先使用do while()进行循环,然后判断进入游戏或退出游戏
    do
    {
        //打印游戏界面
        menu();
        printf("清选择:>");
        scanf("%d", &input);
        
        //通过switch语句进行判断
        switch (input)
        {
            case 1:
                //进入扫雷游戏
                game();
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("输入错误\n");
                break;
        }
    } while (input);
    return 0;
}

3.2 game.c文件

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

// 初始化数组内容为指定的内容
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ret)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            board[i][j] = ret;
        }
    }

}


//打印
void DispalyBoard(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    printf("---------扫雷游戏----------\n");
    //输出行号
    for (i = 0; i <= row; i++)
    {
        printf("%d ", i);
    }
    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;

    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 meunn()
{
    printf("**********************************\n");
    printf("********    1. 排查雷     ********\n");
    printf("********    0. 标记雷     ********\n");
    printf("**********************************\n");
}

//标记雷函数
void MarkersPort(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int a = 0;
    int b = 0;
    printf("请输入要标记的坐标:>");
    scanf("%d%d", &a, &b);
    if (a >= 1 && a <= row && b >= 1 && b <= col)
    {
        if (show[a][b] == '*')
        {
            show[a][b] = 'Y';
            DispalyBoard(show, ROW, COL);
        }
    }
    else
    {
        printf("输入的坐标非法,请重新输入\n");
    }
}
//排查雷
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)
    {
        meunn();
        int num = 0;
        scanf("%d",&num);
        switch(num)
        {
        case 1: 
        {
            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");
                        DispalyBoard(show, ROW, COL);
                        break;
                    }
                    else //如果不是雷
                    {
                        win++;
                        //统计mine数组中x,y坐标周围有几个雷
                        int count = get_mine_count(mine, x, y);
                        show[x][y] = count + '0'; //转换成数字字符
                        DispalyBoard(show, ROW, COL);
                    }
                }
            }
            else
            {
                printf("输入的坐标非法,请重新输入\n");
            }
            break;
        }
        case 0:
        {
            MarkersPort(mine, show, row, col);
            break;
        }
        default:
            printf("输入错误\n");
            break;
        }
        if (mine[x][y] == '1')
        {
            break;
        }
    }
    if (win == row * col - EASY_COUNT)
    {
        printf("恭喜你,排雷成功!\n");
        DispalyBoard(show, ROW, COL);
    }

}

3.3 game.h文件

#pragma once
#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 ret);

//打印
void DispalyBoard(char board[ROWS][COLS], int row, int col);

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


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值