控制台应用--C语言实现扫雷小游戏(无图形库)

又一次c语法练习,比较简单,难点只有展开无雷区(就是点一下展开一大片的逻辑)

先看效果

游戏开始

 输入x,y和操作模式 (1标记0展开)

胜利和失败

附上代码

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

#define MAP_HEIGHT 9 //地图高度
#define MAP_WIDTH 9  //地图宽度
#define BOBM_NUM 10  //炸弹个数

//地图结点定义
typedef struct {
    char bomb;//炸弹位 1 或 0
    char ngb;//周围炸弹个数
    char show;//显示字符
    char spd;//展开标志位
}Node;

//地图数组定义
static Node Map[MAP_HEIGHT][MAP_WIDTH];

//周围格子相对自身的坐标数组定义
const char nLocation[8][2] = {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}};

//游戏结束标志
static char GameOver=0;

//公共变量
int i=0,j=0,k=0,h=0,w=0;

//遍历数组
#define TRA(insize, outsize) ({         \
    for (i = 0; i < MAP_HEIGHT; i++)    \
    {                                   \
        for (j = 0; j < MAP_WIDTH; j++) \
        {                               \
            insize;                     \
        }                               \
        outsize;                        \
    }                                   \
})

//初始化
void Init(){
    //给节点各个参数赋初值
    TRA(Map[i][j].bomb=0;
        Map[i][j].spd=0;
        Map[i][j].ngb=0;
        Map[i][j].show='O';,);
    //生成炸弹
    i=BOBM_NUM;
    while (i){
        srand((unsigned int)time(NULL));
        w=rand()%(MAP_WIDTH-1);
        h=rand()%(MAP_HEIGHT-1);
        if(Map[h][w].bomb==0){
            Map[h][w].bomb=1;
            i--;
        }
    }
    //计算ngb值
    TRA(for(k=0;k<8;k++){
            h = i + nLocation[k][1];
            w = j + nLocation[k][0];
            if (Map[h][w].bomb&&h >=0 && w >=0 && h < MAP_HEIGHT && w < MAP_WIDTH)
                Map[i][j].ngb++;
        },);
}
//展开
void spread(int y,int x){
    if(Map[y][x].show=='0'){
        for(k=0;k<8;k++){
            h = y + nLocation[k][1];
            w = x + nLocation[k][0];
            if (Map[h][w].spd==0&&h >=0 && w >=0 && h < MAP_HEIGHT && w < MAP_WIDTH)
                Map[h][w].show=Map[h][w].ngb+48;
        }
        for(k=0;k<8;k++){
            h = y + nLocation[k][1];
            w = x + nLocation[k][0];
            if (Map[h][w].spd==0&&h >=0 && w >=0 && h < MAP_HEIGHT && w < MAP_WIDTH)
            {
                Map[h][w].spd=1;
                spread(h,w);
            }
        }
    }
    else return;
}
//选择节点
void selectNode(){
    int x,y,t,tNum=0;
    scanf("%d %d %d",&x,&y,&t);
    if((Map[y][x].bomb)&&!t)GameOver=1;
    else{
        if(t==0){
            Map[y][x].show=Map[y][x].ngb+48;
            Map[y][x].spd=1;
            spread(y,x);
        }
        else if(t==1)Map[y][x].show='@';
    }
    TRA(if(Map[i][j].bomb&&Map[i][j].show=='@')tNum++;,);
    if(tNum==BOBM_NUM)GameOver=2;
}
//显示
void showMap(){
    system("cls");
    for(i=-1;i<MAP_HEIGHT;i++){
        if(i==-1)printf("  0 1 2 3 4 5 6 7 8");
        else {
            printf("%d",i);
            for(j=0;j<MAP_WIDTH;j++){
                if(Map[i][j].show!='0')
                    printf(" %c",Map[i][j].show);
                else
                    printf("  ");
            }
        }
        printf("\n\n");
    }
    printf("Enter X Y MODE:");
}
//游戏主函数
void run(){
    while (1)
    {
        if(GameOver==1){
            TRA(if(Map[i][j].bomb)Map[i][j].show='*';else Map[i][j].show=Map[i][j].ngb+48;,);
            showMap();
            printf("\nYou Lose , Game Over ");
            break;
        } 
        else if(GameOver==2){
            showMap();
            printf("\nYou Win ! Ohhhhhhh !!!");
            break;
        }
        else if(!GameOver){
            showMap();
            selectNode();
        }
    } 
}
//main函数
int main(){
    Init();
    run();
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值