贪吃蛇玩法——PVE

这里写图片描述
HX是人控制的蛇,@OO是电脑自动操控的蛇,在之前人控蛇和智能蛇 的基础上将它们融为一体,在一个屏幕上,就可以PVE了。
胜负条件可以有更多,限定时间或者到达指定长度。

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

#define map_high 36
#define map_width 41 
#define snake_head 'H'
#define snake_body 'X'
#define AIsnake_head '@'
#define AIsnake_body 'O'
#define snake_food '$'
#define wall_char '*'
#define blank_char ' '

struct SNAKE{
    int x[100];
    int y[100];
    int lenth ;
};

struct SNAKE snake;
struct SNAKE AIsnake;

struct FOOD{
    int x;
    int y;
}food;

int gamerun = 1;
char construct = 'd';
int AIconstruct = 3;
int HaveFood = 0;
int speed = 400;

char map[map_high][map_width] = {
    "****************************************",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "*                                      *",
    "****************************************" }; 

void PrintMap() {
    int i=0;
    system("cls");
    for ( i=0; i<map_high; i++ ) {
        printf("%s\n", map[i]);
    } 
}

void SpawnFood() {
    food.x = rand() % (map_width - 3) + 1;
    food.y = rand() % (map_high - 2) + 1;
    while(map[food.y][food.x] != blank_char) {
        food.x = rand() % (map_width - 3) + 1;
        food.y = rand() % (map_high - 2) + 1;
    }
    map[food.y][food.x] = snake_food;
    HaveFood = 1;
}

void InitGame() {
    snake.x[1] = 1;
    snake.y[1] = 1;
    snake.x[0] = 2;
    snake.y[0] = 1;
    snake.lenth = 2; 
    map[snake.y[0]][snake.x[0]] = snake_head;
    map[snake.y[1]][snake.x[1]] = snake_body;
    AIsnake.x[1] = 10;
    AIsnake.y[1] = 10;
    AIsnake.x[0] = 11;
    AIsnake.y[0] = 10;
    AIsnake.lenth = 2; 
    map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_head;
    map[AIsnake.y[1]][AIsnake.x[1]] = AIsnake_body;
    gamerun = 1;
    PrintMap();
}

void GameOver() {
    gamerun = 0;
    printf("GAME OVER\n");
}

void GameWin() {
    gamerun = 0;
    printf("YOU WIN\n");
}

void MoveSnake() {
    if(kbhit()) {
        while(kbhit()) construct = getch();
    }
    map[snake.y[snake.lenth-1]][snake.x[snake.lenth-1]] = blank_char;
    map[snake.y[0]][snake.x[0]] = snake_body;
    int i = 0;
    for( i=snake.lenth-1; i; i-- ) {
        snake.x[i] = snake.x[i-1];
        snake.y[i] = snake.y[i-1];
    }
    switch(construct) {
        case 'w': {snake.y[0]--;
            break;
        }
        case 'a': {snake.x[0]--;
            break;
        }
        case 's': {snake.y[0]++;
            break;
        }
        case 'd': {snake.x[0]++;
            break;
        }
    }
    if(map[snake.y[0]][snake.x[0]] != blank_char && map[snake.y[0]][snake.x[0]] != snake_food ) {
       GameOver();
    }
    if(map[snake.y[0]][snake.x[0]] == snake_food ) {
        map[snake.y[0]][snake.x[0]] = snake_head;
        HaveFood = 0;
        snake.lenth++;
    }
    else map[snake.y[0]][snake.x[0]] = snake_head;
}

void AIMove() {
    int CanMove[4] = {1,1,1,1};
    if(map[AIsnake.y[0]][AIsnake.x[0]+1] != blank_char && map[AIsnake.y[0]][AIsnake.x[0]+1] != snake_food) CanMove[3] = 0;//right
    if(map[AIsnake.y[0]][AIsnake.x[0]-1] != blank_char && map[AIsnake.y[0]][AIsnake.x[0]-1] != snake_food) CanMove[1] = 0;//left
    if(map[AIsnake.y[0]-1][AIsnake.x[0]] != blank_char && map[AIsnake.y[0]-1][AIsnake.x[0]] != snake_food) CanMove[0] = 0;//up
    if(map[AIsnake.y[0]+1][AIsnake.x[0]] != blank_char && map[AIsnake.y[0]+1][AIsnake.x[0]] != snake_food) CanMove[2] = 0;//down

    if(food.x<=AIsnake.x[0] && food.y<AIsnake.y[0]) AIconstruct=0;
    if(food.x<AIsnake.x[0] && food.y>=AIsnake.y[0]) AIconstruct=1;
    if(food.x>=AIsnake.x[0] && food.y>AIsnake.y[0]) AIconstruct=2;
    if(food.x>AIsnake.x[0] && food.y<=AIsnake.y[0]) AIconstruct=3;

    while(!CanMove[AIconstruct]) AIconstruct = AIconstruct % 4 + 1;

    map[AIsnake.y[AIsnake.lenth-1]][AIsnake.x[AIsnake.lenth-1]] = blank_char;
    map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_body;
    int i = 0;
    for( i=AIsnake.lenth-1; i; i-- ) {
        AIsnake.x[i] = AIsnake.x[i-1];
        AIsnake.y[i] = AIsnake.y[i-1];
    } 
    switch(AIconstruct) {
        case 0: AIsnake.y[0]--; break;
        case 1: AIsnake.x[0]--; break;
        case 2: AIsnake.y[0]++; break;
        case 3: AIsnake.x[0]++; break;
    }
    if(map[AIsnake.y[0]][AIsnake.x[0]] != blank_char && map[AIsnake.y[0]][AIsnake.x[0]] != snake_food ) {
        GameWin();
    }
    if(map[AIsnake.y[0]][AIsnake.x[0]] == snake_food ) {
        map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_head;
        HaveFood = 0;
        AIsnake.lenth++;
    }
    else map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_head;
} 

void GetSpeed() {
    speed = 400 - snake.lenth * 20;
}

int main() {
    InitGame() ;
    while (gamerun) {
        PrintMap();
        srand(time(NULL));
        if(!HaveFood) SpawnFood ();
        GetSpeed();
        Sleep(speed);
        MoveSnake();
        AIMove();
    }
    return 0;
}
内容概要:本文研究基于豪猪算法(CPO)实现多无人机协同集群在三维空间中的避障路径规划,旨在通过优化目标函数(最低成本,涵盖路径长度、飞行高度、威胁规避和转弯角度)来提升无人机集群的任务执行效率与安全性。该方法采用Matlab进行算法设计与仿真验证,系统性地展示了CPO算法在复杂三维动态环境下的路径搜索能力与优化性能,突出其在多机协同、动态障碍物规避和资源最优分配方面的优势。研究不仅实现了路径规划的核心算法构建,还提供了完整的代码资源与仿真案例,便于进一步对比分析与工程应用。; 适合人群:具备一定Matlab编程基础,从事无人机控制、智能优化算法、路径规划、协同导航、自动化系统等相关领域的科研人员、研究生及工程技术人员。; 使用场景及目标:①开展多无人机协同作业中的三维路径规划研究;②评估并对比豪猪算法(CPO)与其他智能优化算法(如GA、PSO、GWO、TTHHO等)在路径规划任务中的性能差异;③实现复杂环境中多无人机的安全避障、能耗优化与飞行稳定性提升的仿真与验证。; 阅读建议:建议结合提供的Matlab代码进行仿真实践,重点关注目标函数的建模方式、CPO算法的迭代机制与参数敏感性分析,并通过与其它算法的对比实验深入理解其收敛性、鲁棒性及适用范围。
内容概要:本文档围绕“无电流传感器模型预测MPC串联型谐振DAB模型”的Simulink仿真实现展开,系统介绍了基于模型预测控制(MPC)的高性能控制策略在串联型谐振双有源桥(DAB)变换器中的应用,重点突出无需传统电流传感器的设计思路,以降低硬件成本并提升系统可靠性。文档整合了大量电力电子与控制领域的高价值仿真资源,涵盖LLC谐振变换器、微电网调度、状态估计、故障检测、优化算法等多个方向,并提供配套的Matlab/Simulink代码与模型,部分标注为“创新未发表”或“博士/硕士论文复现”,具有较强的科研前瞻性与复现参考价值。所有资料可通过百度网盘及公众号“荔枝科研社”获取。; 适合人群:电力电子、自动化、电气工程及其相关专业的研究生、高校科研人员,以及从事新能源发电、储能系统、电力变换器开发的工程技术人员。; 使用场景及目标:① 深入理解无电流传感器控制与MPC在DAB变换器中的融合机制与实现方法;② 利用所提供的Simulink模型与Matlab代码进行科研复现、算法改进与系统性能优化;③ 拓展应用于谐振变换器、微电网能量管理、电力电子系统稳定性分析等相关课题的研究与工程实践。; 阅读建议:建议结合仿真模型动手实践,优先从基础案例入手,循序渐进地过渡到复杂系统;重点关注标注“复现”与“创新”的内容以激发科研灵感,同时注意梳理各技术模块间的内在联系,构建系统化的知识架构。
内容概要:本文围绕“基于DDPM的光伏功率时序场景生成方法研究”展开,结合Python代码实现,系统阐述了去噪扩散概率模型(DDPM)在光伏发电功率不确定性建模与场景生成中的应用。研究深入剖析了DDPM的前向扩散与反向生成机制,通过构建时序生成框架,有效捕捉光伏出力的随机性与时空相关性,旨在为电力系统调度、储能配置及风险评估提供高质量的输入场景。文中还引入W-GAN作为对比模型,评估不同生成对抗网络在光伏数据生成任务中的表现差异,并进一步探讨了所生成场景在联合市场环境下虚拟电厂(VPP)竞价与优化决策中的实际应用价值。整体研究强调科研过程中“借力”成熟算法框架与自主创新相结合的重要性,倡导通过复现经典模型提升科研效率与工程实践能力。; 适合人群:具备一定Python编程基础和深度学习理论知识,从事新能源发电预测、电力系统优化、智能电网、虚拟电厂运营等相关领域的科研人员、高校研究生及工程技术开发者。; 使用场景及目标:① 学习并动手复现基于DDPM的光伏功率时间序列生成模型;② 探索并解决光伏出力不确定性带来的调度与规划难题,服务于微电网能量管理、电力市场竞价等应用场景;③ 对比分析DDPM与W-GAN等生成模型在新能源功率场景生成任务中的性能优劣,选择最优技术路线; 阅读建议:建议读者结合文中提供的网盘资源(包括完整代码、训练模型与实测数据集)进行同步实践操作,重点关注DDPM模型的网络结构设计、损失函数定义及采样推理过程的代码实现细节,并结合电力系统背景知识深入理解生成场景的实际物理意义与应用潜力。
内容概要:本文系统研究了基于Wasserstein生成对抗网络(W-GAN)的光伏出力场景生成方法,旨在解决光伏发电固有的随机性与波动性所带来的建模难题。通过Python编程实现W-GAN模型,有效缓解传统GAN训练过程中的梯度消失与模式崩溃问题,显著提升了生成时序数据的真实性、多样性及时序相关性。该方法能够生成高保真的光伏功率出力场景,为电力系统中新能源不确定性建模提供了可靠的数据支撑,广泛应用于优化调度、风险评估、储能配置及微电网规划等领域。研究不仅涵盖模型架构设计、损失函数优化与训练策略,还强调生成场景的统计特性验证与实际应用适配性。; 适合人群:具备Python编程能力及机器学习基础,从事新能源发电、电力系统分析、智能电网优化、不确定性建模等相关领域的研究生、科研人员与工程技术开发者。; 使用场景及目标:①为含高比例光伏的电力系统提供多样化、高精度的出力场景输入;②支撑微电网能量管理、储能系统规划与日前调度决策;③提升新能源接入背景下系统运行的安全性与经济性分析能力;④作为深度学习在能源时序数据生成中的典型应用案例进行教学与科研参考。; 阅读建议:建议读者结合所提供的Python代码深入实践,重点关注生成器与判别器的网络结构设计、Wasserstein距离的实现机制以及梯度惩罚项的引入方式,并在不同地区、不同季节的光伏数据集上进行模型训练与效果对比,以全面掌握W-GAN在新能源场景生成中的关键技术细节与调优策略。
内容概要:本文详细介绍了一种针对LLC谐振变换器的变频移相混合控制模型,并基于Simulink平台完成了系统的仿真实现。该模型深度融合变频控制与移相控制的技术优势,旨在提升LLC变换器在宽范围负载条件下的转换效率与动态响应性能,尤其在低压增益工况下展现出优异的稳定性与调节能力。通过构建精确的Simulink仿真系统,全面验证了所提混合控制策略在稳态精度、瞬态响应及系统鲁棒性方面的有效性,为高频高效电源转换系统的工程化设计与优化提供了可靠的理论依据和技术支撑。; 适合人群:具备电力电子技术、自动控制理论及相关仿真技能背景的科研人员、电气工程领域高校研究生,以及从事新能源电源、电动汽车充电系统、光伏微网等高频电源产品研发的工程技术人员。; 使用场景及目标:①用于高性能LLC谐振变换器的控制策略研究与动态性能优化;②适用于对电源转换效率、响应速度和输出稳定性要求严苛的工业与新能源应用场景,如车载充电机、数据中心电源、可再生能源并网系统等;③为相关科研课题、学位论文或企业技术研发项目提供高保真仿真模型与技术验证平台。; 阅读建议:学习者需熟练掌握Simulink建模方法与电力电子电路工作原理,建议结合具体应用参数调整控制器设计,深入探究变频与移相控制间的协同作用机制,并可通过引入非理想因素进一步开展鲁棒性与优化设计研究。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值