c语言实现扫雷(非图形化界面)

游戏介绍:
扫雷是一款非常有规律而又简单智力的小游戏,不了解的一定不知道它里面出现的数字都是什么含义吧?这里小编给大家解释一下,其实那上面花花绿绿的数字不是空穴来风的,而是表示当前你所点击的位置上下左右的位置的周围中隐藏的雷的个数,好吧,这样一讲你一定不太明白,那就整图吧!
这里写图片描述
这里写图片描述

每次输入一个坐标,必然要判断当前坐标是不是雷,如果不是就要显示当前坐标和其周围8个非雷坐标点的周围8个点的雷的数量。

设计思路:
棋盘设计:
这里我们采用两个二位数组,一个是显示出来的二维数组(棋盘),另一个是隐藏的棋盘(真实的棋盘);
这里写图片描述
(那么你一定很好奇为什么这样,因为要处理边界点的周围8个点的雷的个数,所以这样设计,不然边界点的周围点就不满8个数了,这样设计是为了方便代码编写和程序员理解。)
然后我们通过外部输入坐标来替代当前用户点击的是哪个坐标点,然后就是现实当前点周围出现雷的个数了。
这里写图片描述
雷的设计:
这里我们设定当前坐标是雷为1,当前坐标不是雷为0;
游戏规则:
1.输入某个坐标,显示该坐标及其周围8个点的雷的分布状况;
2.如果炸死了就要显示棋盘的雷的分布情况;
3.如果排雷成功就要显示胜利信息和棋盘的信息;

好了,现在开始撸代码吧:

game.h头文件

#ifndef Head_File
#define Head_File

#define ROW 10
#define LINE 10
#define MINE 20

void display_arr(char arr[ROW][LINE],int row,int line);
void display_mine(char arr[ROW+2][LINE+2],int row,int line);
void set_mine(char arr[ROW+2][LINE+2],int lei);
void player(char arr[ROW+2][LINE+2],char copy[ROW][LINE],int *count,int row,int line);

#endif

game.c文件

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"

void display_mine(char arr[ROW+2][LINE+2],int row,int line)
{
    int i=0,j=0;
    for(i=0;i<=row;i++)
    {
        printf(" %d  ",i);
    }
    printf("\n--------------------------------------------\n");
    for(i=1;i<=row;i++)
    {
        printf("%2d |",i);
        for(j=1;j<=line;j++)
        {
            printf(" %c |",arr[i][j]);
        }
        printf("\n--------------------------------------------\n");
    }
}
void display_arr(char arr[ROW][LINE],int row,int line)
{
    int i=0,j=0;
    for(i=0;i<=row;i++)
    {
        printf(" %d  ",i);
    }
    printf("\n--------------------------------------------\n");
    for(i=0;i<row;i++)
    {
        printf("%2d |",i+1);
        for(j=0;j<line;j++)
        {
            printf(" %c |",arr[i][j]);
        }
        printf("\n--------------------------------------------\n");
    }
}
void set_mine(char arr[ROW+2][LINE+2],int lei)
{
    int x=0,y=0;
    while(lei)
    {
        x=rand()%ROW+1;
        y=rand()%LINE+1;
        if(arr[x][y]=='0')
        {
            arr[x][y]='1';
            lei--;
        }
    }
}
void player(char arr[ROW+2][LINE+2],char copy[ROW][LINE],int *count,int row,int line)
{
    int x=0,y=0;
    while(1)
    {
        int i=0,j=0;
        printf("请玩家输入坐标:\n");
        scanf("%d%d",&x,&y);
        if(x>=0&&x<=row&&y<=line&&y>=0)
        {
            if(arr[x][y]=='0')
            {
                for(i=x-1;i<=x+1;i++)
                {
                    for(j=y-1;j<=y+1;j++)
                    {
                        if(arr[i][j]=='0'&&(i-1>=0)&&(i-1<=row-1)&&(j-1>=0)&&(j-1<=line-1)&&copy[i-1][j-1]=='*')
                        {
                            copy[i-1][j-1]=(arr[i-1][j-1]-'0'+arr[i][j-1]-'0'+arr[i+1][j-1]-'0'+arr[i-1][j]-'0'+arr[i+1][j]-'0'+arr[i-1][j+1]-'0'+arr[i][j+1]-'0'+arr[i+1][j+1]-'0')+'0';
                            (*count)++;
                        }
                        else
                            continue;
                    }
                }
                break;
            }
            else
            {
                *count=row*line;
                break;
            }
        }
        else
        {
            printf("输入坐标不合法!");
        }
    }
}

main头文件:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include"game.h"
void menu()
{
    printf("*************************************\n");
    printf("*************    扫雷   *************\n");
    printf("*************  PLAY--1  *************\n");
    printf("*************  EXIT--0  *************\n");
    printf("*************************************\n");
}
enum menu
{
    EXIT,PLAY
};
void Game()
{
    int count=0;
    char mine[ROW+2][LINE+2]={0};
    char arr[ROW][LINE]={0};
    memset(mine,'0',sizeof(char)*(ROW+2)*(LINE+2));//初始化数组mine为0
    memset(arr,'*',sizeof(char)*(ROW)*(LINE));
    set_mine(mine,MINE);//埋雷操作
    while(count<(ROW*LINE-MINE))
    {
        display_arr(arr,ROW,LINE);//打印雷盘
        player(mine,arr,&count,ROW,LINE);//玩家操作
    }
    if(count<=ROW*LINE-MINE)
    {
        display_arr(arr,ROW,LINE);//打印雷盘
        printf("排雷成功!\n");
    }
    else
    {
        printf("排雷失败,您被炸死了!\n");
        display_mine(mine,ROW,LINE);//失败显示雷区
    }
}
int main()
{
    int input;
    srand((unsigned int)time(NULL));
    do
    {
        menu();
        printf("请选择->");
        scanf("%d",&input);
        switch(input)
        {
        case PLAY:
            Game();
            break;
        case EXIT:
            break;
        default:
            printf("输入非法,请重新输入:\n");
            break;
        }
    }while(input);
    system("pause");
    return 0;
}

运行结果:
这里写图片描述

这里写图片描述

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值