C语言实现扫雷游戏

本文介绍了一个简单的扫雷游戏实现过程,包括初始化棋盘、布置雷区、搜索雷数及展开等核心函数。通过C语言实现了游戏逻辑,并提供了一个完整的测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

棋盘的初始化,初始两个棋盘,一为布置雷的棋盘,一为向玩家展示的棋盘,在此将用字符‘1’表示 雷,字符‘0’表示安全,此函数将布置雷的棋盘全部初始化为‘0’,以便后期布雷函数的进行,为了方便后期进行坐标周围雷数的计算,将所有棋盘扩大一圈;‘*’为玩家棋盘展示元素这里写图片描述

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < rows; i++)
    {
        for (j = 0; j < cols; j++)
        {
            board[i][j] = set;
        }
    }
}

布置雷,产生10个(宏定义中已说明)随机的坐标进行布雷,将对应坐标更改为改为字符‘1 ’

void SetMine(char board[ROWS][COLS], int row, int col)
{
    int a = 0;
    int b = 0;
    int count = EASY_COUNT;
    while (count)
    {
        a = rand() % ROW+1;
        b = rand() % COL+1;
        if (board[a][b] == '0')
        {
            board[a][b] = '1';
            count--;
        }

    }
}

打印棋盘:

void PrintBoard(char board[ROWS][COLS], int row, int col)
{
    int i = 0;
    int j = 0;
    for (i = 0; i < row+1; i++)
    {
        printf("%d ", i);
    }

    printf("\n");


    for (i = 0; i < row; i++)
    {
        printf("%d", i+1);
        for (j = 0; j < col; j++)
        {
            printf("%2c", board[i+1][j+1]);
        }
        printf("\n");
    }
}

查找对应坐标周围雷的个数并赋值:

void SearchMine(char mine[ROWS][COLS],char show[ROWS][COLS] ,int x, int y)
{
    char count = '0';
    count = 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';
        show[x][y] =  count+'0';
}

展开函数:

void OpenMine(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y)
{
        if (mine[x][y] == '0' && show[x][y] == '*')
        {
            SearchMine(mine,show, x, y);
        }
        if (show[x + 1][y-1] == '*'&&mine[x+1][y-1]=='0')
        {
            SearchMine(mine, show, x + 1, y-1);
            if(show[x+1][y-1] == '0')
                OpenMine(mine, show, x + 1, y-1);
        }
        if (show[x + 1][y] == '*'&&mine[x+1][y]=='0')
        {
            SearchMine(mine, show, x + 1, y);
            if(show[x+1][y] == '0')
                OpenMine(mine, show, x + 1, y);
        }
        if (show[x + 1][y+1] == '*'&&mine[x+1][y+1]=='0')
        {
            SearchMine(mine, show, x + 1, y + 1);
            if (show[x+1][y+1] == '0')
                OpenMine(mine, show, x + 1, y + 1);
        }
        if (show[x][y+1] == '*'&&mine[x][y+1]=='0')
        {
            SearchMine(mine, show, x , y + 1);
            if (show[x][y+1] == '0')
                OpenMine(mine, show, x, y +1);
        }
        if (show[x][y-1] == '*'&&mine[x][y-1]=='0')
        {
            SearchMine(mine, show, x , y - 1);
            if (show[x][y-1] == '0')
                OpenMine(mine, show, x, y - 1);
        }
        if (show[x-1][y + 1] == '*'&&mine[x-1][y+1]=='0')
        {
            SearchMine(mine, show, x - 1, y+1 );
            if (show[x-1][y+1] == '0')
                OpenMine(mine, show, x - 1, y + 1);
        }
        if (show[x - 1][y] == '*'&&mine[x - 1][y ] == '0')
        {
            SearchMine(mine, show, x - 1, y );
            if (show[x-1][y] == '0')
                OpenMine(mine, show, x - 1, y);
        }
        if (show[x][y - 1] == '*'&&mine[x ][y - 1] == '0')
        {
            SearchMine(mine, show, x , y-1 );
            if (show[x][y-1] == '0')
                OpenMine(mine, show, x, y - 1);
        }
        if (show[x - 1][y - 1] == '*'&&mine[x - 1][y - 1] == '0')
        {
            SearchMine(mine, show, x -1, y-1);
            if (show[x-1][y-1] == '0')
                OpenMine(mine, show, x - 1, y - 1);
        }
}

当第一步为雷时 通过改变雷区的当前分布位置,防止玩家被炸死

void FirstStep(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
    mine[x][y] = '0';
    int i = 0;
    int j = 0;
    while (1)
    {
        i = rand() % ROW + 1;
        j = rand() % COL + 1;
        if (mine[i][j] == '0' && ((i != x) || (j != y)))
        {
            mine[i][j] = '1';
            break;
        }
    }
    SearchMine(mine, show, x,y);
    OpenMine(mine, show, x,y);
    PrintBoard(show, ROW, COL);
}

排雷的过程,玩家每次输入坐标后,对玩家棋盘进行遍历,若‘ * ’数等于雷数时玩家胜利:

void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int m = 0;
    int n = 0;
    int a = 0; 
    int step = 1;
    while (1)
    {
        printf("请输入要排查的坐标->\n");
        scanf("%d%d", &m, &n);
        if (m > 0 && m < row+1&&n>0 && n < col+1)
        {
            if (mine[m][n] == '1'&& step == 1)
            {
                FirstStep(mine, show, m, n);
                step++;
            }
            else if (mine[m][n] == '1'&& step!=1)
                {
                    printf("很遗憾,你被炸死了\n");
                    PrintBoard(mine, ROW, COL);
                    break;
                }
            else
                {       
                    SearchMine(mine,show, m, n);
                    OpenMine(mine, show, m, n);
                    PrintBoard(show, ROW, COL);
                    step++;
                }
        }
        else
        {
            printf("坐标无效,请重新输入\n");
        }



        int i = 0;
        int j = 0;
        int a = 0;
        for (i = 1; i < row + 1; i++)
        {
            for (j = 1; j <col + 1; j++)
            if (show[i][j] == '*')
                a++;
        }
        if (a ==  EASY_COUNT)
        {
            printf("恭喜你,排雷成功!\n");
            break;
        }
    }
}

函数所需要的头文件:

#ifndef __GAME_H__
#define __GAME_H__

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define EASY_COUNT 10

#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);
void SetMine(char board[ROWS][COLS], int row, int col);
void PrintBoard(char board[ROWS][COLS], int row, int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
void SearchMine(char mine[ROWS][COLS], char show[ROWS][COLS],int x, int y);
void OpenMine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);
void FirstStep(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y);

#endif //__GAME_H__

测试图片:
这里写图片描述
这里写图片描述
game()函数以及测试代码


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



void game()
{
    char mine[ROWS][COLS] = {0};
    char show[ROWS][COLS] = {0};
    InitBoard(mine, ROWS, COLS, '0');
    InitBoard(show, ROWS, COLS, '*');
    PrintBoard(show, ROW, COL);
    SetMine(mine, ROW, COL);
    FindMine(mine, show, ROW, COL);
}



void meau()
{
    printf("*****************************\n");
    printf("*********1.开始游戏**********\n");
    printf("*********0.退出游戏**********\n");
    printf("*****************************\n");
}



int main()
{

    int  i = 1;
    srand((unsigned)time(NULL));

    while (i)
    {
        i = 0;
        meau();
        printf("请选择->\n");
        scanf("%d", &i);
        switch (i)
        {
        case 0:
            printf("退出成功\n");
            break;
        case 1:
            game();
            break;
        default:
            printf("选择错误\n");
            break;
        }
    }
    system ("pause");
    return 0;

}
内容概要:本文深入解析了扣子COZE AI编程及其详细应用代码案例,旨在帮助读者理解新一代低门槛智能体开发范式。文章从五个维度展开:关键概念、核心技巧、典型应用场景、详细代码案例分析以及未来发展趋势。首先介绍了扣子COZE的核心概念,如Bot、Workflow、Plugin、Memory和Knowledge。接着分享了意图识别、函数调用链、动态Prompt、渐进式发布及监控可观测等核心技巧。然后列举了企业内部智能客服、电商导购助手、教育领域AI助教和金融行业合规质检等应用场景。最后,通过构建“会议纪要智能助手”的详细代码案例,展示了从需求描述、技术方案、Workflow节点拆解到调试与上线的全过程,并展望了多智能体协作、本地私有部署、Agent2Agent协议、边缘计算插件和实时RAG等未来发展方向。; 适合人群:对AI编程感兴趣的开发者,尤其是希望快速落地AI产品的技术人员。; 使用场景及目标:①学习如何使用扣子COZE构建生产级智能体;②掌握智能体实例、自动化流程、扩展能力和知识库的使用方法;③通过实际案例理解如何实现会议纪要智能助手的功能,包括触发器设置、下载节点、LLM节点Prompt设计、Code节点处理和邮件节点配置。; 阅读建议:本文不仅提供了理论知识,还包含了详细的代码案例,建议读者结合实际业务需求进行实践,逐步掌握扣子COZE的各项功能,并关注其未来的发展趋势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值