扩展版扫雷小游戏

game.h

#ifndef   _GAME_H_
#define   _GAME_H_
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW  9
#define COL  9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#define HARD_COUNT 40
void Init_showboard(char showboard[ROW][COL], int row, int col);//初始化要展示的棋盘
void put_showboard(char showboard[ROW][COL], int x, int y, int count);
void Init_mineboard(char mineboard[ROWS][COLS], int row, int col);//初始化布雷的棋盘
int GetMineCount(char board[ROWS][COLS], int x, int y);//统计周边雷的个数
void Move_mine(char mineboard[ROWS][COLS]);//将雷移走
void put_mine(char mineboard[ROWS][COLS]);
void   send_mine(char mineboard[ROWS][COLS], char showboard[ROW][COL], int x, int y);//扩展扫雷
int   Add(char showboard[ROW][COL]);//统计成功扫雷个数
#endif 

game.c

#include  "game.h";
//设置展示的扫雷棋盘
void Init_showboard(char showboard[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < col + 1; i++)//打印横轴坐标
    {
        printf("%d ", i);
        if (i == col)
            printf("\n");
    }
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);//打印竖轴坐标
        for (j = 0; j < col; j++)
            printf("%c ", showboard[i-1][j]);
        printf("\n");
    }
}
//打印输出坐标后该点周围雷的个数
void  put_showboard(char showboard[ROW][COL],int x,int y,int count)
{
    showboard[x-1][y-1] = count+48;
    Init_showboard(showboard, ROW, COL);
}
//设置雷
void put_mine(char mineboard[ROWS][COLS])
{
    int count = EASY_COUNT;//总共有雷的个数
    int x = 0;
    int y = 0;
    while (count)
    {
        x = rand() % 9 + 1;
        y = rand() % 9 + 1;
        if (mineboard[x][y] == '0')
        {
            mineboard[x][y] = '1';
            count--;
        }
    }
}
//打印布雷的棋盘
void Init_mineboard(char mineboard[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < col+1; i++)
    {
        printf("%d ", i);
        if (i == col)
            printf("\n");
    }
    for (i = 1; i <= row; i++)
    {
        printf("%d ", i);
        for (j = 1; j <=col; j++)
            printf("%c ", mineboard[i][j]);
        printf("\n");
    }
}
//统计一点周围雷的个数
int GetMineCount(char board[ROWS][COLS], int x, int y)
{
    int count = 0;
    int i = 0;
    int j = 0;
    for (j = x - 1; j <= x + 1; j++)
        {
            for (i = y - 1; i <= y + 1; i++)
            {
                if (board[j][i] == '1')
                    count++;
            }
        }
    return count;
}
//当第一个扫到雷时,不能被炸死,将雷移走
void Move_mine(char mineboard[ROWS][COLS])
{
    int x = 0;
    int y = 0;
    x = rand() % 9 + 1;
    y = rand() % 9 + 1;
    if (mineboard[x][y]=='0')
    {
        mineboard[x][y] ='1';
    }
}
//扩展,以一点为中心,向外扩展统计其周围每一点周围的雷的个数
void   send_mine(char mineboard[ROWS][COLS], char showboard[ROW][COL],int x,int y)
{

    if (((x > 0) && (x < ROWS - 1) && (y>0) && (y < COLS - 1)))
    {
        if (mineboard[x - 1][y] == '0')
        {
            showboard[x - 1][y] = GetMineCount(mineboard, (x-1),y) + '0';

        }
        if (mineboard[x - 1][y - 1] == '0')
        {
            showboard[x - 1][y - 1] = GetMineCount(mineboard,( x-1),( y-1)) + '0';
        }

        if (mineboard[x][y - 1] == '0')
        {
            showboard[x][y - 1] = GetMineCount(mineboard, x, (y-1)) + '0';
        }
        if (mineboard[x + 1][y - 1] == '0')
        {
            showboard[x + 1][y - 1] = GetMineCount(mineboard, (x + 1), (y - 1) )+'0';
        }

        if (mineboard[x + 1][y] == '0')
        {
            showboard[x + 1][y] = GetMineCount(mineboard, (x + 1), y) + '0';
        }
        else
        {
            /*show[x + 1][y] = '0'*/;
        }
        if (mineboard[x + 1][y + 1] == '0')
        {
            showboard[x + 1][y + 1] = GetMineCount(mineboard, (x + 1), (y + 1)) + '0';
        }
        if (mineboard[x][y + 1] == '0')
        {
            showboard[x][y + 1] = GetMineCount(mineboard, x, (y + 1)) + '0';
        }

        if (mineboard[x - 1][y + 1] == '0')
        {
            showboard[x - 1][y + 1] = GetMineCount(mineboard, (x - 1), (y + 1)) + '0';
        }

    }
}
//统计排除雷的个数
int   Add(char showboard[ROW][COL])
{
    int i = 0;
    int j = 0;
    int k = 0;
    for (i = 0; i < ROW;i++)
    for (j = 0; j < COL; j++)
    {
        if (showboard[i][j] == '*')
            k++;
    }
    return k;
}

游戏.c

#define  _CRT_SECURE_NO_WARNINGS   1
#include  "game.h"
//打印菜单
void menu()
{
    printf("*****************************************\n");
    printf("*******   1.play        0.exit   ********\n");
    printf("*****************************************\n");
}
//游戏的基本实现
void game(char mineboard[ROWS][COLS],char showboard[ROW][COL])
{
    int x = 0;
    int y = 0;
    int count = 0;
    int flag = 0;
    int win = 0;
    do
    {
        ++flag;
        getchar();
        if (((x > 0) && (x < rows - 1) && (y>0) && (y < cols - 1)) != 1)
        {
            printf("输入地址不存在,请重新输入:>");
        }
        printf("玩家请输出坐标:");
        scanf("%d%d", &x, &y);
        if (mineboard[x][y] == '1'&&flag == 1)//第一次不能被炸死
        {
            mineboard[x][y] = '0';
            Move_mine(mineboard);
            printf("移走雷后的棋盘:\n");
            Init_mineboard(mineboard, ROW, COL);
            printf("\n");
        }
        if (mineboard[x][y] == '1')
        {
            printf("炸死了!\n");
            break;
        }
        else
        {
            count = GetMineCount(mineboard, x, y);//统计扫雷点周围雷的个数
            send_mine(mineboard, showboard, x, y);//延展扫雷
            put_showboard(showboard, x, y, count);//输出延展后的棋盘
        }
    } while (Add(showboard) < EASY_COUNT);
    if (Add(showboard) == EASY_COUNT)//判断是否扫雷成功
    {
        printf("恭喜扫雷成功!\n");
        return ;
    }


}
int main()
{
    char mineboard[ROWS][COLS];
    char showboard[ROW][COL];
    int n = 0;
    srand((unsigned)time(NULL));
    do
    {
        menu();
        scanf("%d", &n);
        if (n == 1)
        {
            printf("展示棋盘:\n");
            memset(showboard, '*', (ROW)*(COL));
            Init_showboard(showboard, ROW, COL);
            memset(mineboard, '0', (ROWS)*(COLS));
            printf("设置雷:\n");
            put_mine(mineboard);
            Init_mineboard(mineboard, ROW, COL);

            game(mineboard,showboard);
        }
        else if (n == 0)
        {
            printf("退出游戏!");
            break;
        }
        else
        {
            printf("输入错误,请重新输入:");
        }

    } while (1);
    system("pause");
    return 0;
}

第二次写小游戏了,很多的代码写都不够精炼,调理也不是很清晰,请大神们多多指错和不足!!!

猜你喜欢

转载自blog.csdn.net/HL_HLHL/article/details/78736776