C语言实现扫雷小游戏

  1. 我们首先说一下基本思路:首先我们需要两个面板,一个显示面板,一个雷面板,这两个面板需要用二维数组来实现。其次,要在雷面板中布置雷,然后需要输入坐标,排查雷,继而判断是否踩到雷,如果踩到雷,那么玩家死翘翘,游戏结束,如果没有踩到雷,需要判断此坐标周围雷的个数。如果最后设置雷的总个数全部被排查出来,那么玩家赢,游戏结束。
  2. 我们需要创建一个头文件lei.h来存放需要用到的函数。创建一个源文件lei.c来实现各个是函数。创建一个源文件main.c来测试各个函数。头文件lei.h中,需要有初始化雷函数,即布置雷、显示面板函数、判断周围雷的个数函数、玩游戏函数。源文件lei.c里面就是实现头文件lei.c里面的函数。源文件main.c里面需要有一个菜单函数,一个玩游戏函数,玩游戏函数里面,首先需要定义两个二维数组,用于创建雷面板和显示面板,接着初始化这两个二维数组,然后布置雷函数,接着显示两个面板函数,然后测试判断周围雷的个数函数,最后测试玩游戏函数。
  3. 具体实现代码如下,里面也有比较详细的注释,供大家参考:

    头文件lei.h

#ifndef __LEI_H_
#define __LEI_H_

#define ROW 10
#define COL 10

#define MINE_COUNT 20  //设置雷的个数

//初始雷 设置雷函数
void set_mine(char mine[ROW + 2][COL + 2], int row, int col);//ROW+2 COL+2是因为为了查看附近的雷方便,给数组的外围又加了一层

//显示雷和面板
void display(char board[ROW][COL], int row, int col);//ROW+2 COL+2是因为输入显示时方便从1开始而不是数组下标的从0开始

//查看附近的雷数
int mine_count(char mine[ROW + 2][COL + 2], int x, int y);

//玩游戏
void play_game(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2]);
#endif

源文件main.c

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

#include "lei.h"

//菜单函数
void menu()
{
    printf("***************************\n");
    printf("******  1.play game  ******\n");
    printf("******  0.exit game  ******\n");
    printf("***************************\n");
}

//定义游戏函数
void game()
{
    //定义雷数组和显示面板数组
    char mine[ROW + 2][COL + 2];
    char board[ROW + 2][COL + 2];
    srand((unsigned)time(NULL));

    //初始化雷数组和显示面板数组  将雷数组初始值设置为'0',有雷的值设置为'1'
    memset(mine, '0', sizeof(mine));//将从当前位置到sizeof(mine)的值全部换成'0'并返回给数组mine
    memset(board, '*', sizeof(board));

    //设置雷
    set_mine(mine, ROW + 2, COL + 2);

    //显示初始化数组
    display(board, ROW + 2, COL + 2);//将ROW+2 COL+2传递入函数

    //查看附近还有几个雷
    mine_count(mine, ROW+2, COL+2);

    //玩游戏
    play_game(mine, board);
}

int main()
{
    int choose = 0;
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &choose);
        switch (choose)
        {
        case 1:
            game();
            break;
        case 0:
            printf("exit game\n");
            break;
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    } while (choose);
    system("pause");
    return 0;
}

源文件lei.c

#include "lei.h"

//初始化雷 设置雷函数
void set_mine(char mine[ROW + 2][COL + 2], int row, int col)//ROW+2 COL+2是因为为了查看附近的雷方便,给数组的外围又加了一层
{
    int count = MINE_COUNT;
    int i = 0;
    for (i = 0; i < count; i++)
    {
        int x = rand() % (row - 2) + 1;//传递过来的实参是ROW+2,rand()%(row-2)+1,就是1-10
        int y = rand() % (col - 2) + 1;
        if (mine[x][y] == '0')//如果将要放入坐标的位置是‘0’,就说明可以放入雷
        {
            mine[x][y] = '1';
        }
        else//如果将要放入坐标的位置不是‘0’,就说明不能放雷,此时将i--,恢复到原来的数值
        {
            i--;
        }
    }
}


//显示雷和面板
void display(char board[ROW+2][COL+2], int row, int col)//ROW+2 COL+2是因为输入显示时方便从1开始而不是数组下标的从0开始
{
    int i = 0;
    int j = 0;
    printf("    1 2 3 4 5 6 7 8 9 10\n");
    printf("    --------------------\n");
    for (i = 1; i <= ROW; i++)
    {
        printf("%2d |",i);
        for (j = 1; j <= COL; j++)
        {
            printf("%c ", board[i][j]);
        }
        printf("|\n");
    }
    printf("    --------------------\n");
}

//查看附近的雷数
int mine_count(char mine[ROW + 2][COL + 2], int x, int y)
{   //雷周围一共8个坐标 int型变量-‘0’就会变为该值的ASCII值,若有雷,返回1,无雷返回0,所以该函数返回的是雷的个数
    return mine[x - 1][y - 1] - '0' + mine[x - 1][y] - '0' + mine[x - 1][y + 1] - '0'
        + mine[x][y + 1] - '0' + mine[x + 1][y + 1] - '0' + mine[x + 1][y] - '0' +
        mine[x + 1][y - 1] - '0' + mine[x][y - 1] - '0';
}

//玩游戏 先输入坐标判断坐标是否合理,再判断是否有雷
void play_game(char mine[ROW + 2][COL + 2], char board[ROW + 2][COL + 2])
{
    int count = 0;//计数器,判断消灭雷的个数
    while (1)
    {
        //输入坐标
        int x = 0;
        int y = 0;
        printf("请输入坐标:");
        scanf("%d%d", &x,&y);
        //判断坐标是否在范围内
        if (((1 <= x) && (x <= ROW)) && ((1 <= y) && (y <= COL)))
        {
            //判断该位置有没有雷
            if (mine[x][y] == '1')
            {
                printf("有雷!你死翘翘啦!\n");
                display(mine, ROW + 2, COL + 2);//显示雷面板,让玩家死的明白
                break;
            }
            else
            {
                int ret = mine_count(mine, x, y);//判断周围雷的个数
                board[x][y] = ret + '0';//ret是int型变量,加‘0’后会转变为相应的ASCII值
                count++;
                display(board, ROW + 2, COL + 2);
                if (count == MINE_COUNT)
                {
                    printf("雷已全部排完,你赢了!\n");
                    break;
                }

            }
        }
        else
        {
            printf("瞎跑,请重新输入\n");
        }

    }
}

猜你喜欢

转载自blog.csdn.net/windyj809/article/details/79951220