RoboCup智能机器人足球教程(三)
RoboCup智能机器人足球教程(三)
实现守门员代码
守门员逻辑实现比较容易,但是最好开始的时候画好流程图,理顺逻辑,守门员一直盯着球,当球距离守门员够近的时候,守门员前去扑球,扑到球后朝对面射出,逻辑图为:
实现逻辑的办法就是定义状态变量,用if控制,在这里,我们定义如下几个重要的状态变量:
isCatchBall: 球是否在脚下
isMove: 是否进行了瞬移,守门员扑到球后是可以进行瞬移的,我们要利用好。
主要架构的伪代码为:
if isCatchBall == truesearch goalkick
elseif ball_distance < 1catch ballelse look at ball
下面是完全的代码:
if(id == 1){if (std::strncmp(msg, "(see ", 5)==0){if(isCatchBall == 0){double ball_distance = 0; // 球的方向double ball_direction = 0; // 球的角度char *p; p = strstr(msg, "(ball)"); if (p == 0) { // 表示看不见球sprintf(command, "(turn 50)"); // 转50度sendMessage(command);return;}std::sscanf(p, "(ball) %lf %lf", &ball_distance, &ball_direction);// 如果与球的角度相差太大,转向球的方向if (ball_direction >5 || ball_direction < -5) { sprintf(command, "(turn %lf)", ball_direction);sendMessage(command);return;}// 当球非常远的时候if(ball_distance > 13){isMove=0; isCatchBall = 0; // 这里是进行防错处理的}// 当球不近也不远的时候if(ball_distance>1 && ball_distance<13){sprintf(command, "(dash 200)"); // 冲向球的位置sendMessage(command);isMove=0; isCatchBall = 0; // 这里是进行防错处理的return;}// 当球很近的时候if (ball_distance<1) { // 如果与球的距离小于3sprintf(command, "(catch %lf)", ball_direction); //发送catch命令以捕获球sendMessage(command);isCatchBall = 1; // 抓住球的布尔变量return;}}// 抓住球的时候if(isCatchBall == 1){ // 如果没有瞬移,先进行瞬移,catch球之后允许瞬移if(isMove == 0) // 这个布尔变量是为了防止二次瞬移的{ sprintf(command, "(move -50 0)");sendMessage(command);isMove = 1;return;}// 现在开始看门double goal_distance = 0; // 门距离double goal_dirction = 0; // 门方向char *p;if(side == 1) p = strstr(msg, "(goal r)"); // 找到门的字符串地址else p = strstr(msg, "(goal l)");if (p != 0) // 获取门的位置信息{if(side == 1) std::sscanf(p, "(goal r) %lf %lf", &goal_distance, &goal_dirction);else std::sscanf(p, "(goal l) %lf %lf", &goal_distance, &goal_dirction);// 踢球!sprintf(command, "(kick 100 %lf)", goal_dirction+20); // 朝门的方向踢球sendMessage(command);isCatchBall = 0;isMove = 0;}else{ // 没看到门,转身看门sprintf(command, "(turn 50)");sendMessage(command);}return;}}
}
RoboCup智能机器人足球教程(二)
RoboCup智能机器人足球教程(四)
RoboCup智能机器人足球教程(三)相关推荐
- RoboCup智能机器人足球教程(二)
RoboCup智能机器人足球教程(二) 运行方式 RoboCup2D仿真平台通过一个服务端,若干客户端联系而成,同时通过监视器进行画面播放.当启动服务端后,客户端通过改写程序内部的client.cpp ...
- RoboCup智能机器人足球教程(五)
一个简易的足球战略实现 我之所以编写这套教程呢,是因为我在小学期学这个智能机器人足球的课程,一共才两三个星期,注定编写不了什么高级的AI,实际上,跑起来都费劲,但即便如此,我们老师在最终要 ...
- Quartz教程三:Job与JobDetail介绍
Quartz教程三:Job与JobDetail介绍 原文链接 | 译文链接 | 翻译:nkcoder | 校对: 本系列教程由quartz-2.2.x官方文档翻译.整理而来,希望给同样对quartz感 ...
- jQuery 3教程(三):jQuery集合
原文地址:jQuery 3教程(三):jQuery集合 Introduction jQuery选择器选择出来的结果很多时候是一个DOM元素集而非单个元素,jQuery可以灵活的访问和修改DOM元素集, ...
- Swift中文教程(三)--流程控制
Swift中文教程(三)--流程控制 原文:Swift中文教程(三)--流程控制 Swift用if和switch编写条件控制语句,用for-in,for,while和do-while编写循环.条件控制 ...
- qpython3可视图形界面_PySide——Python图形化界面入门教程(三)
PySide--Python图形化界面入门教程(三) --使用内建新号和槽 --Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
- Java 结构体之 JavaStruct 使用教程三 JavaStruct 数组进阶
经过前面两篇博客的介绍,相信对于 JavaStruct 的认识以及编程使用,读者已经有一定的基础了.只要理解和实践结合起来,掌握还是很容易的.下面进行一些数组使用方面的实例说明及演示. 在结构体类中使 ...
- MIP开发教程(三) 使用MIP-CLI工具调试组件
一 . 在 mip-extensions 仓库中创建新的组件 二 . 预览调试组件 三 . 在 MIP 页中引用自己编写的 MIP 组件 四 . 组件提交到 GitHub 仓库时需要进行校验 站长开发 ...
- SpringCloud 入门教程(三): 配置自动刷新
Spring Cloud 入门教程(三): 配置自动刷新 之前讲的配置管理, 只有在应用启动时会读取到GIT的内容, 之后只要应用不重启,GIT中文件的修改,应用无法感知, 即使重启Config Se ...
最新文章
- mysql myisam存储引擎_MySQL浅谈MyISAM存储引擎
- qemu 对虚机的地址空间管理
- 搞笑之----普通话
- 51nod-诺德街【数学期望】
- Yolo系列知识点梳理(Yolov1-v5)
- Tomcat关闭失败,SEVERE: Could not contact localhost:8005. Tomcat may not be running.
- 如何删除多余系统引导项
- python人脸识别程序如何嵌入到app_只用Python就能写安卓,简单几步实现人脸识别的App...
- JavaScript中的流程控制
- git pull出现错误的解决办法
- DALSA相机开发记录(01)
- java 负数异常_java基础之异常
- c语言编辑游戏时用哪个软件,我想用C语言编写一个小型游戏,使用什么软件
- C++ Primer 第5版习题答案
- 主析取范式主合取范式
- 移动、联通、电信三大运营商手机号段大全 附手机号正则表达式
- android4.4.3版本root,碉堡了!ROOT精灵支持Nexus 5等Android4.4.3机型ROOT
- 微信机器人_微信聊天消息记录拦截分析
- Lua Busted 单元测试实战
- [渝粤教育] 西安交通大学 环境工程设计与管理 参考 资料