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
}
}
|