深入理解博客园仿真足球竞赛平台的仿真周期

在上一篇文章中,我们讲解了如何使用如何利用CSharp球队模板编写自己的足球队,为了编写出更加智能的球队,我们需要进一步了解平台的仿真周期。

订阅本系列文章

首先,我们还是来看这个图中被黄色标记的“将更新后的场上信息发送给球队*”的部分。

Drawing11 

平台发送过来的场上信息在封装在了CnblogsDotNetSDK.Data.WorldModel中。

CnblogsDotNetSDK.Data.WorldModel中包含了10个CnblogsDotNetSDK.Data.Agent(前5个代表自己的球员信息,后5个代表对方的)信息和1个CnblogsDotNetSDK.Data.Ball的信息。

由于CnblogsDotNetSDK.Data名字空间中定义的数据是用来与平台进行数据交互的,所以你无法直接在其中加入自己定义的一些属性。

所以在每个仿真周期的开始阶段,我们会调用一个函数将只包含最基本信息的数据类型转化为自定义的数据类型

在我们的CSharp球队模板

我们在Main主函数中,每个仿真周期都会调用SetWorldModelFromServer这个函数。

//从服务器获得本周期的场上比赛信息
CnblogsDotNetSDK.Data.WorldModel wmData = Communicator.Instance.GetWorldModelFromServer();

//将从服务器接收到的全场信息转化为自己的信息结构
myTeam.SetWorldModelFromServer(wmData);

我们来详细看看SetWorldModelFromServer函数的实现

/// <summary>
/// 将从服务器中获得的场上信息转化为自己定义的数据结构
/// </summary>
/// <param name="wmData">从服务器中获得的场上信息</param>
/// <remarks>每个周期开始的时候调用</remarks>
public void SetWorldModelFromServer(CnblogsDotNetSDK.Data.WorldModel wmData)
{
    //设置我方球员的信息
    for (int i = 0; i < RuleSettings.Instance.AgentNum; i++)
    {
        _wm.OwnAgents[i].Pos = wmData.agents[i].Pos;
        _wm.OwnAgents[i].Dir = wmData.agents[i].Dir;
    }
    //设置对方球员的信息
    for (int i = 0; i < RuleSettings.Instance.AgentNum; i++)
    {
        _wm.OpsAgents[i].Pos = wmData.agents[i + RuleSettings.Instance.AgentNum].Pos;
        _wm.OpsAgents[i].Dir = wmData.agents[i + RuleSettings.Instance.AgentNum].Dir;
    }
    //设置足球的信息
    _wm.Ball.Pos = wmData.ball.Pos;
    _wm.Ball.Vel = wmData.ball.Vel;
}

在这个函数中,我们将CnblogsDotNetSDK.Data.WorldModel中的数据转移到了自己的重新定义了DemoTeamCSharp.WorldModel,DemoTeamCSharp.AgentDemoTeamCSharp.WorldModel。这样做可以为我们提供更多的方便,比如我们在自己定义的DemoTeamCSharp.WorldModel区分了我方的机器人(OwnAgents)和对方的机器人(OpsAgents),这样就方便了我们区分敌我的情况。

特别注意,每个仿真周期中我们从平台得到的消息都是经过平台自身处理后的,也就是说,无论你的球队实际是在哪边运行(左边或者右边),都是给的你在左边的信息。所以说,在实际编写的代码的时候,始终把自己当成是左边的队伍来考虑即可。

 

下面我们来简单分析一下我们可爱的球员,拿左边的蓝色球员来说

b005

我们看到的球员大小,就是他可以踢球的范围。如何足球在这个范围内,那么球员在本周期是可以踢足球的(可以使用Kick命令)

122222222222

这个球员中的红色箭头代表该踢球的身体朝向。球员的身体的朝向就是我们的球员的奔跑方向。这也就是说,球员的奔跑的时候,只能以当前自己的身体朝向前进。

 

为了更好地理解仿真周期,大家可以观看以下这段视频演示。

清晰版下载

 

 

视频中我们实现了以下3个功能:

  • 让球员朝向足球

Vector2f tempPos = _wm.Ball.Pos - _wm.OwnAgents[4].Pos;

_commands[4].CType = CommandType.Turn;
_commands[4].Parameter1 = tempPos.GetDirection();

  • 让球员跑向足球
Vector2f tempPos = _wm.Ball.Pos - _wm.OwnAgents[4].Pos;

if (Math.Abs(tempPos.GetDirection() - _wm.OwnAgents[4].Dir) < 2)
{
    _commands[4].CType = CommandType.Dash;
    _commands[4].Parameter1 = RuleSettings.Instance.MaxDashVel;
}
else
{
    _commands[4].CType = CommandType.Turn;
    _commands[4].Parameter1 = tempPos.GetDirection();
}
  • 让球员去踢足球
Vector2f tempPos = _wm.Ball.Pos - _wm.OwnAgents[4].Pos;

if (tempPos.GetLength() < RuleSettings.Instance.MaxKickBallDistance)
{
    _commands[4].CType = CommandType.Kick;
    _commands[4].Parameter1 = 1.0;
    _commands[4].Parameter2 = 0;
}
else if (Math.Abs(tempPos.GetDirection() - _wm.OwnAgents[4].Dir) < 2)
{
    _commands[4].CType = CommandType.Dash;
    _commands[4].Parameter1 = RuleSettings.Instance.MaxDashVel;
}
else
{
    _commands[4].CType = CommandType.Turn;
    _commands[4].Parameter1 = tempPos.GetDirection();
}

在下一篇文章中,我们将详细了解一下平台的物理模型以及球员命令的分析

博客园仿真足球交流小组

相关资源下载

相关文章

数字电路课程设计的报告,包括部分代码和截图 设计目的 学会应用数字方法设计电路 进一步提高maxplus2软件的应用能力 培养学生实践的综合实力 二、设计方案 用maxplus2软件设计多功能数字钟,采用层次化的设计方法,底层使用VHDL语言设计各模块的功能,然后使用画图方法设计顶层。 设计中包括计时,校时,整点闹铃,闹钟4大模块 计时模块:用VHDL语言设计24进制计时、60进制计分、60进制计秒模块,秒的进位为分的计数脉冲,分的进位为时的计数脉冲,按键MM选择六选一多路选择器动态输出,频率设定为256hz,然后将二进制转为七段显示码动态显示 校时模块:因为SA.SB.SC是产生抖动,所以用频率64HZ的D触发器消除抖动,当按键时,通过二选一选择4HZ频率调节。Sa键按下时计时器就会迅速递增以调节为所需时间,SB键按下则是计分器迅速递增并调节,SC键时清零秒位。 整点闹时:当59分50秒时开始闹时,按键sin选择alart模块,当时间为59分50.52.54.56.58秒时,报时频率为512HZ,00:00时为1024HZ 闹钟模块:按键MC选择settime模块,然后MA.MB按键选择设定时分闹钟时间,按键set选择compare模块比较时间和设定时间的时。分闹时,闹钟时间为1分钟、 分频模块:用一个11位二进制,在时钟信号clk下,逐渐递增,根据原理可知,此二进制的每一位均可代表不同频率,在本次设计中,用到的是1hz,4hz,64hz,512hz,1024hz,所以输出只需要二进制的0,2,6,9,10位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值