using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using xna = Microsoft.Xna.Framework;
using Microsoft.Xna.Framework;
using URWPGSim2D.Common;
using URWPGSim2D.StrategyLoader;
using URWPGSim2D.Core;
namespace URWPGSim2D.Strategy
{
public class Strategy : MarshalByRefObject, IStrategy
{
#region reserved code never be changed or removed
/// <summary>
/// override the InitializeLifetimeService to return null instead of a valid ILease implementation
/// to ensure this type of remote object never dies
/// </summary>
/// <returns>null</returns>
public override object InitializeLifetimeService()
{
//return base.InitializeLifetimeService();
return null; // makes the object live indefinitely
}
#endregion
/// <summary>
/// 决策类当前对象对应的仿真使命参与队伍的决策数组引用 第一次调用GetDecision时分配空间
/// </summary>
///
private Decision[] decisions = null;
/// <summary>
/// 获取队伍名称 在此处设置参赛队伍的名称
/// </summary>
/// <returns>队伍名称字符串</returns>
public string GetTeamName()
{
return "怼2号球向上 往回";
}
public static int i = 0;
float π=(float)Math .PI;
/// <summary>
/// 获取当前仿真使命(比赛项目)当前队伍所有仿真机器鱼的决策数据构成的数组
/// </summary>
/// <param name="mission">服务端当前运行着的仿真使命Mission对象</param>
/// <param name="teamId">当前队伍在服务端运行着的仿真使命中所处的编号
/// 用于作为索引访问Mission对象的TeamsRef队伍列表中代表当前队伍的元素</param>
/// <returns>当前队伍所有仿真机器鱼的决策数据构成的Decision数组对象</returns>
public Decision[] GetDecision(Mission mission, int teamId)
{
// 决策类当前对象第一次调用GetDecision时Decision数组引用为null
if (decisions == null)
{// 根据决策类当前对象对应的仿真使命参与队伍仿真机器鱼的数量分配决策数组空间
decisions = new Decision[mission.CommonPara.FishCntPerTeam];
}
#region 决策计算过程 需要各参赛队伍实现的部分
#region 策略编写帮助信息
//====================我是华丽的分割线====================//
//======================策略编写指南======================//
//1.策略编写工作直接目标是给当前队伍决策数组decisions各元素填充决策值
//2.决策数据类型包括两个int成员,VCode为速度档位值,TCode为转弯档位值
//3.VCode取值范围0-14共15个整数值,每个整数对应一个速度值,速度值整体但非严格递增
//有个别档位值对应的速度值低于比它小的档位值对应的速度值,速度值数据来源于实验
//4.TCode取值范围0-14共15个整数值,每个整数对应一个角速度值
//整数7对应直游,角速度值为0,整数6-0,8-14分别对应左转和右转,偏离7越远,角度速度值越大
//5.任意两个速度/转弯档位之间切换,都需要若干个仿真周期,才能达到稳态速度/角速度值
//目前运动学计算过程决定稳态速度/角速度值接近但小于目标档位对应的速度/角速度值
//6.决策类Strategy的实例在加载完毕后一直存在于内存中,可以自定义私有成员变量保存必要信息
//但需要注意的是,保存的信息在中途更换策略时将会丢失
//====================我是华丽的分割线====================//
//=======策略中可以使用的比赛环境信息和过程信息说明=======//
//场地坐标系: 以毫米为单位,矩形场地中心为原点,向右为正X,向下为正Z
// 负X轴顺时针转回负X轴角度范围为(-PI,PI)的坐标系,也称为世界坐标系
//mission.CommonPara: 当前仿真使命公共参数
//mission.CommonPara.FishCntPerTeam: 每支队伍仿真机器鱼数量
//mission.CommonPara.MsPerCycle: 仿真周期毫秒数
//mission.CommonPara.RemainingCycles: 当前剩余仿真周期数
//mission.CommonPara.TeamCount: 当前仿真使命参与队伍数量
//mission.CommonPara.TotalSeconds: 当前仿真使命运行时间秒数
//mission.EnvRef.Balls:
//当前仿真使命涉及到的仿真水球列表,列表元素的成员意义参见URWPGSim2D.Common.Ball类定义中的注释
//mission.EnvRef.FieldInfo:
//当前仿真使命涉及到的仿真场地,各成员意义参见URWPGSim2D.Common.Field类定义中的注释
//mission.EnvRef.ObstaclesRect:
//当前仿真使命涉及到的方形障碍物列表,列表元素的成员意义参见URWPGSim2D.Common.RectangularObstacle类定义中的注释
//mission.EnvRef.ObstaclesRound:
//当前仿真使命涉及到的圆形障碍物列表,列表元素的成员意义参见URWPGSim2D.Common.RoundedObstacle类定义中的注释
//mission.TeamsRef[teamId]:
//决策类当前对象对应的仿真使命参与队伍(当前队伍)
//mission.TeamsRef[teamId].Para:
//当前队伍公共参数,各成员意义参见URWPGSim2D.Common.TeamCommonPara类定义中的注释
//mission.TeamsRef[teamId].Fishes:
//当前队伍仿真机器鱼列表,列表元素的成员意义参见URWPGSim2D.Common.RoboFish类定义中的注释
//mission.TeamsRef[teamId].Fishes[i].PositionMm和PolygonVertices[0],BodyDirectionRad,VelocityMmPs,
// AngularVelocityRadPs,Tactic:
//当前队伍第i条仿真机器鱼鱼体矩形中心和鱼头顶点在场地坐标系中的位置(用到X坐标和Z坐标),鱼体方向,速度值,
// 角速度值,决策值
//====================我是华丽的分割线====================//
//========================典型循环========================//
//for (int i = 0; i < mission.CommonPara.FishCntPerTeam; i++)
//{
// decisions[i].VCode = 0; // 静止
// decisions[i].TCode = 7; // 直游
//}
//====================我是华丽的分割线====================//
#endregion
//请从这里开始编写代码
#endregion
Vector3[] yu = new Vector3[2];
yu[0] = mission.TeamsRef[teamId].Fishes[0].PolygonVertices[0]; ///鱼头1的位置
yu[1] = mission.TeamsRef[teamId].Fishes[1].PolygonVertices[1]; ///鱼头2的位置
//球的坐标
Vector3 b1 = mission.EnvRef.Balls[0].PositionMm;
Vector3 b2 = mission.EnvRef.Balls[1].PositionMm;
Vector3 b3 = mission.EnvRef.Balls[2].PositionMm;
Vector3 b4 = mission.EnvRef.Balls[3].PositionMm;
Vector3 b5 = mission.EnvRef.Balls[4].PositionMm;
Vector3 b6 = mission.EnvRef.Balls[5].PositionMm;
Vector3 b7 = mission.EnvRef.Balls[6].PositionMm;
Vector3 b8 = mission.EnvRef.Balls[7].PositionMm;
Vector3 b9 = mission.EnvRef.Balls[8].PositionMm;
if(i==0)
{
int times = 0;
StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b8, 0f, 0f, 0f, mission.CommonPara.MsPerCycle, ref times);
decisions[0].VCode = 14;//目标方向弧度改为GetAngleToDestPoint(yu[0].X, yu[0].Y, b2.X, b2.Y)
}//1号鱼游到2号球 优化:1游到鱼正下方 2尝试带球函数 3判断球的位置选择不同距离阈值
/* if (0f < b2.X && b2.X <= 406f)
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b2, 1.57f, 10, 10, 58, 5, 5, 10, 100, false);
//调节速度14、10
else if (406<b2.X)
{
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b2, -0.5235988f, 10, 10, 58, 14, 11, 10, 100, false);
}//3/4Pi
else
{
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b2, 0.5235988f, 10, 10, 58, 14, 11, 10, 100, false);
}//将球推到8号球(上方2分球)右方
}
if (yu[0].Y <= -862)//到达b8 2分球右下方
{
i++;
if (i == 1)
//学姐
//鱼1带2号和7号球的判断
if (b8.X <= 0 && b8.Y < -804)
{
Vector3 positionb8 = new Vector3(b3.X + 58 + 29, 0, b3.Y - 58 * 3);//击球点
float angl1 = -π * 85 / 360;
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], positionb8, angl1, 5, 10, 150, 14, 8, 15, 100, false);//快速到达定点
//鱼1带2号,7号球稳定游动
}
//else
//{
// Vector3 positionb8 = new Vector3(-1164, 0, -876);//目标点
//StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b2, 3.14f, 5, 10, 150, 6, 4, 15, 100, true);
//decisions[1].VCode = 14;
//鱼1只带2号球快速游动
}
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b4, 3.14f, 10, 10, 58, 14, 11, 10, 100, false);
//如果8号球不在范围内
// {StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], b2, 3.14f , 10, 10, 58, 14, 11, 10, 100, false); }
if (b8.X < -1362)
{
Vector3 position2 = new Vector3(b3.X, 0, b3.Y + 58);//击球点
float angl2 = 3.14f * 90 / 360;
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], position2, angl2, 5, 10, 150, 14, 8, 15, 100, false);//快速到达定点
}
} */
return decisions;
}
#region 新函数的引用
private float GetAngleToDestPoint(float cur_x, float cur_z, float dest_x, float dest_z)
{
return (float)Math.Atan2((double)(dest_z - cur_z), (double)(dest_x - cur_x));
}
#endregion
}
}
|