用两个.c和一个.h分组写初步扫雷游戏

简介: 用两个.c和一个.h分组写初步扫雷游戏
//game.c
#define _CRT_SECURE_NO_WARNINGS 1 
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)//ROWS COLS set以实参的形式传过来
                                                                    //形参就可以用rows,cols接收
{                                             //布置雷,存放雷都是该InitBoard(board,[ROWS][COLS])函数
    int i = 0;                             // 所以,board[i][j]=....需要需要在实参处优先初始化,再传参
    int 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)//形参,row,col接收定义的ROW和COL
{
    int i = 0;
    int j = 0;
    printf("--------------扫雷游戏-----------\n");
    for (i = 0; i <= col; i++)//从0开始,使行列等于下标
    {
        printf("%d ", i);//在此位置开始,就是第一个循环,行循环,打印列号
    }
    printf("\n");//换行
    for (i = 1; i <= row; i++)             //理论创造的棋盘是11*11,但只需要打印9*9棋盘
    {                                      //下标为0和10的COL和ROW不打印
        printf("%d ", i); //在此位置开始,就是第二个循环,列循环,打印行号
        for (j = 1; j <= col; j++)
        {
            printf("%c ", board[i][j]);//打印一行
        }
        printf("\n");//换行
    }//开始打印新的下一行
    printf("--------------扫雷游戏-----------\n");
}
//布置雷(10个)
void SetMine(char mine[ROWS][COLS], int row, int col)
{
    int count = 10;
    while (count)
    {                   //生成随机下标
        int x = rand() % row + 1;              //生成随机下标,但是rand生成的是随即值,只有%9,结果才为0-8
        int y = rand() % col + 1; //调用rand前要用srand(time),,,,直接加在main函数里,全局量
                                  //rand使用时,需要srand(time),并且需要强制转换
                                     //srand((unsigned int) time )NULL));需要头文件<stdlib.h><time.h>
        if (mine[x][y] == '0')//判断是否已经布置为雷(没有布置雷用0表示)
        {
            mine[x][y] = '1';//可以放置雷,并变为1(不能再被放置)
            count--;//count=10-1...
        }
    }
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
//static修饰的get_mine_count,只能在该函数内实现
//get_mine_count只是为了实现FindMine函数,不需要放头文件里
{
    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';
}
//排查雷要两步  1.输入排查的坐标 2.检查坐标是不是雷,是雷,炸死 ,不是,统计统计x,y坐标周围有几个雷,放count
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x = 0;
    int y = 0;
    while (1)//需要多次输入坐标,循环
    {
        printf("请输入要排查的坐标\n");
        scanf("%d%d",&x,&y);//1.输入排查的坐标  
        if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标是否合法(是否在1-9内)
        {
            if (mine[x][y] == '1')//2.判断布置雷排查的小格子处,如果放置的是'1',没有雷,放置的是'0'
            {
                printf("很遗憾,你被炸死了\n");
                DisplayBoard(mine, row, col);
                break;
            }
            else        
            {           //get_mine_count只是为了实现FindMine函数,不需要放头文件里
                int count = get_mine_count(mine, x, y);//不是雷的话,统计x,y坐标周围有几个雷,放count
                                    //将统计出来的 数放在count,这个数是字符‘1’ - ‘9’等,需要转换
                                                     //数字0+48=‘0’
                show[x][y] = count+'0';//count是数字1-9,应变为'1'-'9',所以+'0'
                //显示排查出来的信息
                DisplayBoard(show, row, col);
            }
        }
        else
        {
            printf("坐标不合法,请重新输入\n");
        }
        //2检查该坐标是不是雷,
//如果是雷,很遗憾,炸死-游戏结束;
//如果不是雷,统计坐标周围几个雷-存储排查雷的信息(数量)--游戏继续
    }
}
    //game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9 
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);//传三个参数,board ROWS 和COLS
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col);
//布置雷
void SetMine(char mine[ROWS][COLS], int row, int col);//只操作9*9
  //排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);//11*11的参数,用11*11接收
   //test.c
#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include"game.h"
void menu()
{
    printf("***********************************\n");
    printf("***********  1. play  *************\n");
    printf("***********  0. exit  *************\n");
    printf("***********************************\n");
}
void game()                  //写两个数组,一个存放布置雷,一个存放排放雷
{
    char mine[ROWS][COLS]={0};//布置雷:  存放布置好的雷的信息(是雷的话某一小格用1表示
                              //,不是雷的其他小格用0表示)
    char show[ROWS][COLS]={0};//排查雷    显示存放排除出来的雷的信息(某一格周围有多少
                              //个雷的信息,如某一格周围有1个)
    //初始化棋盘
    InitBoard(mine,ROWS,COLS,'0');//布置雷:字符'0',初始化为放字符‘0’,布置一个放一个字符‘1’(9*9)
                                  //改为(11*11),目的是初始化**和00的棋盘一致(大一些没事)
                                  //ROWS COLS以实参的形式传过来,形参就可以用rows,cols接收
    InitBoard(show,ROWS,COLS,'*');//存放雷:字符'*',初始化为*,排查一个小格之后,如果这个小格有一个雷
                                  //放1,有2个雷放2....排查时设置棋盘需要大一圈的数组(9 * 9变为11 * 11) 
                                  // 因如右下角最后一个小格子查看某一个位置周围的8个坐标时,会超出
    //打印棋盘
    DisplayBoard(show,ROW,COL);//实际打印的是9*9的棋盘,mine是布置雷的棋盘(000000)
      //show显示存放雷的棋盘(******)
    //布置雷
    SetMine(mine,ROW,COL);//把信息传到数组中,实际的行,列
    //DisplayBoard(mine, ROW, COL);//打印雷放置位置的棋盘(不给出)
    //排查雷
    FindMine(mine,show,ROW,COL);//将再mine函数的排查信息放再show函数中(9*9)(mine show顺序不能错)
}
int main()                                                                        
{
    int input = 0;
    srand((unsigned int) time(NULL));//rand使用时,需要srand(time),并且需要强制转换
    do                               //srand((unsigned int) time )NULL));需要头文件<stdlib.h>
    {
        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;
}
//可继续优化点:
//1.如果不是雷,周围没有雷---展开一片
//2.标记雷

804115a06faa4092890e8915927ddc16.png

a50cf827d0214e7f97b741ff2a76f129.png

adabe3ac31604dc3a665780afaf4da04.png

相关文章
|
2月前
|
API 数据安全/隐私保护 开发者
Python自定义异常:从入门到实践的轻松指南
在Python开发中,自定义异常能提升错误处理的精准度与代码可维护性。本文通过银行系统、电商库存等实例,详解如何创建和使用自定义异常,涵盖异常基础、进阶技巧、最佳实践与真实场景应用,助你写出更专业、易调试的代码。
115 0
|
5天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。
|
11天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
3天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
10天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
6天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
500 13
|
4天前
|
编解码 文字识别 算法
一张图能装下“千言万语”?DeepSeek-OCR 用视觉压缩长文本,效率提升10倍!
一张图能装下“千言万语”?DeepSeek-OCR 用视觉压缩长文本,效率提升10倍!
389 10
|
11天前
|
编解码 自然语言处理 文字识别
Qwen3-VL再添丁!4B/8B Dense模型开源,更轻量,仍强大
凌晨,Qwen3-VL系列再添新成员——Dense架构的Qwen3-VL-8B、Qwen3-VL-4B 模型,本地部署友好,并完整保留了Qwen3-VL的全部表现,评测指标表现优秀。
689 7
Qwen3-VL再添丁!4B/8B Dense模型开源,更轻量,仍强大