扫雷(C语言)

一.游戏介绍

扫雷的规则是我们随便点一个格子,方格即被打开并显示出方格中的数字,方格中数字则表示其周围的8个方格隐藏了几颗雷,点开的数字是几,则说明该数字旁边的8个位置中有几个雷,如果挖开的是地则会输掉游戏,重新开始,是一款带有运气成分的策略游戏(本篇讲述的是最基本的9*9棋盘)。

二.实现思路

    • 创建棋盘

创建mine和show,mine[ROWS][COLS],show[ROWS][COLS]

ROWS的值为11,COLS的值为11,以后改变ROWS,COLS的值,可以改变游戏的难度。

注:本次扫雷的基础棋盘是9x9的,计算一个坐标周围雷的个数时,会计算周围八个坐标中雷的个数之和。所以,为了防止当输入坐标在边缘时,计算周围雷的个数时发生数组越界的情况,所以我们创建的二维数组mine和show是11x11的,即棋盘为11x11的。)

    • 初始化和打印棋盘

Initboard(mine,ROWS,COLS,'0');
Initboard(show,ROWS,COLS,'*');
    • 随机布置雷

#define EASY 20  其中 EASY就是雷的个数

(这里雷的个数可以自己控制)

为了使雷分布的比较随机,我们可以使用库函数rand(),需要引用头文件#include<stdlib.h>

在使用rand()之前需要调用srand()生成时间戳,这样可以保证雷的分布更加随机。

但是一定要注意,srand()不能写在随机数生成的循环中,因将srand()放在主函数。

x=rand()%row+1;//范围为1~row,row的值为9
y=rand()%col+1;//范围为1~col,col的值为9
    • 排雷

玩家开始游戏时,则进入循环,游戏结束可以跳出循环。跳出循环时,要么是玩家已经展开除雷外的所有区域,游戏成功;要么是玩家踩到了雷,游戏结束。

玩家输入坐标,若坐标的周围有雷,则坐标会显示周围雷的个数。

    • 计算周围雷的个数

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

三.实现代码

main.c

#include"game.h"
void menu()
{
    printf("******************************\n");
    printf("*            1.play          *\n");
    printf("*            0.exit          *\n");
    printf("******************************\n");
}
void game()
{
    char show[ROWS][COLS];
    char mine[ROWS][COLS];
    Initboard(mine,ROWS,COLS,'0');
    Initboard(show,ROWS,COLS,'*');
    Displayboard(show,ROW,COL);
    Setboard(mine,ROW,COL);
    //Displayboard(mine,ROW,COL);
    Findboard(mine,show,ROW,COL);
}
int main()
{
    int input=0;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择\n");
        scanf("%d",&input);
        switch(input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("选择错误,重新选择\n");
                break;
        }
    }while(input);
    return 0;
}

game.c

#include "game.h"
void Initboard(char board[ROWS][COLS],int rows,int cols,char set)
{
    int i=0,j=0;
    for(i=0;i<rows;i++)
    {
        for(j=0;j<cols;j++)
        {
            board[i][j]=set;
        }
    }
}
void Displayboard(char board[ROWS][COLS],int row,int col)
{
    printf("———————————————————\n");
    int i=0,j=0;
    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 Setboard(char mine[ROWS][COLS],int row,int col)
{
    int x=0,y=0;
    int count=0;
    while(count<EASY)
    {
        x=rand()%row+1;
        y=rand()%col+1;
        if(mine[x][y]=='0')
        {
            mine[x][y]='1';
            count++;
        }
    }
}
int JG(char mine[ROWS][COLS],int x,int y)
{
    return mine[x-1][y-1]+
    mine[x-1][y]+
    mine[x-1][y+1]+
    mine[x][y-1]+
    mine[x][y+1]+
    mine[x+1][y-1]+
    mine[x+1][y]+
    mine[x+1][y+1]-8*'0';
}
void Findboard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
    int x=0,y=0;
    int count=0;
    while(count<row*col-EASY)
    {
        printf("请输入排雷坐标\n");
        scanf("%d %d",&x,&y);
        if(x>=1&&x<=row&&y>=1&&y<=col)
        {
            if(show[x][y]=='*')
            {
                if(mine[x][y]=='1')
                {
                    printf("排雷失败,游戏结束\n");
                    Displayboard(mine,ROW,COL);
                    break;
                }
                else
                {
                    int ret=JG(mine,x,y);
                    show[x][y]=ret+'0';
                    Displayboard(show,ROW,COL);
                    count++;
                }
            }
            else
            {
                printf("该坐标被占用,重新输入\n");
            }
        }
        else
        {
            printf("输入坐标非法,重新输入坐标\n");
        }
    }
    if(count==row*col-EASY)
    {
        Displayboard(mine,ROW,COL);
        printf("恭喜排雷成功\n");
    }
}

game.h

#ifndef game_h
#define game_h
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#endif /* game_h */

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

#define EASY 20

void Initboard(char board[ROWS][COLS],int rows,int cols,char set);
void Displayboard(char board[ROWS][COLS],int row,int col);
void Setboard(char mine[ROWS][COLS],int row,int col);
void Findboard(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);

四.运行截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值