Created
July 28, 2014 02:54
-
-
Save thuzhf/6408135a26df32918bcb to your computer and use it in GitHub Desktop.
heb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using xna = 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; | |
private RoboFish fish; | |
private int score; | |
private double hit_x; | |
private double hit_z; | |
private xna.Vector3 goalPoint1; | |
private xna.Vector3 goalPoint2; | |
private List<Ball> balls; | |
private double ball_r; | |
private double[] vTable; | |
private double[] tTable; | |
private double ball_x; | |
private double ball_z; | |
private xna.Vector3 point1; | |
// private bool flag; | |
// private bool colorflag; | |
public Strategy() | |
{ | |
this.decisions = null; | |
//this.colorflag = true; | |
this.score = 0; | |
this.ball_r = 48; | |
this.vTable = new double[] { 0.0, 10.0, 35.0, 67.0, 98.0, 112.0, 135.0, 154.0, 175.0, 227.0, 273.0, 291.0, 298.0, 294.0, 307.0, 317.0 };//现在平台 | |
this.tTable = new double[] { -0.394, -0.297, -0.244, -0.192, -0.137, -0.087, -0.052, 0.0, 0.052, 0.087, 0.137, 0.192, 0.244, 0.297, 0.349, 0.349 }; | |
this.point1 = new xna.Vector3(1000, 0, 0); | |
// this.flag = true; | |
} | |
/// <summary> | |
/// 获取队伍名称 在此处设置参赛队伍的名称 | |
/// </summary> | |
/// <returns>队伍名称字符串</returns> | |
public string GetTeamName() | |
{ | |
return "哈尔滨工程大学"; | |
} | |
/// <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 | |
//decisiong[i]为第i条鱼的决策 | |
if (decisions == null) | |
{// 根据决策类当前对象对应的仿真使命参与队伍仿真机器鱼的数量分配决策数组空间 | |
this.decisions = new Decision[mission.CommonPara.FishCntPerTeam]; | |
} | |
this.fish = mission.TeamsRef[0].Fishes[0]; | |
//this.balls = mission.EnvRef.Balls[0].PositionMm; | |
this.score = mission.TeamsRef[0].Para.Score; | |
xna.Vector3 men = new xna.Vector3(1350f, 0f, 0f); | |
if (mission.TeamsRef[teamId].Para.MyHalfCourt == HalfCourt.LEFT) | |
men.X = -1350; | |
xna.Vector3 lsmen = new xna.Vector3(0, 0, 0); | |
xna.Vector3 jiqiudian = new xna.Vector3(0, 0, 0); | |
xna.Vector3 yutou_1 = mission.TeamsRef[0].Fishes[0].PolygonVertices[0]; | |
xna.Vector3 gangti_1 = mission.TeamsRef[0].Fishes[0].PositionMm; | |
xna.Vector3 yutou_2 = mission.TeamsRef[1].Fishes[1].PolygonVertices[1]; | |
xna.Vector3 gangti_2 = mission.TeamsRef[1].Fishes[1].PositionMm; | |
xna.Vector3 qiuxin_1 = mission.EnvRef.Balls[0].PositionMm; //new xna.Vector3(0, 0, 0); | |
xna.Vector3 qiuxin_2 = mission.EnvRef.Balls[0].PositionMm;//new xna.Vector3(0, 0, 0); | |
xna.Vector3 qiuxin_5 = mission.EnvRef.Balls[4].PositionMm; | |
xna.Vector3 qxin = new xna.Vector3(0, 0, 0); | |
int times = mission.CommonPara.RemainingCycles; | |
////先研究左半场 | |
if (mission.TeamsRef[teamId].Para.MyHalfCourt == HalfCourt.LEFT) | |
{ | |
if (times > 1500) | |
{ | |
////1号鱼顶黄球,2号顶粉球 | |
#region | |
if (!(qiuxin_5.X < -1350 && Math.Abs(qiuxin_5.Z) < 230))////球不在门内 | |
{ | |
//第一条鱼的动作 | |
#region | |
if (!(qiuxin_5.X < -1150 && Math.Abs(qiuxin_5.Z) > 230))////球不在球门两侧 | |
{ | |
jiqiudian = JQD(qiuxin_5, yutou_1, men); | |
// if ((jiqiudian - yutou_1).Length() > 400)/////鱼球距离远,用自己的函数,速度快 | |
// { | |
// this.decisions[0].VCode = Sudu(yutou_1 - gangti_1, jiqiudian - gangti_1, men - qiuxin_5); | |
// this.decisions[0].TCode = Jiaosudu(yutou_1 - gangti_1, jiqiudian - gangti_1, men - qiuxin_5, (jiqiudian - yutou_1).Length() / 314.1); | |
// } | |
// else | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_5), 8, 6, 135, 10, 6, 12, 100, true); | |
} | |
else if (qiuxin_5.X < -1150 && Math.Abs(qiuxin_5.Z) > 230)////球在球门两侧 | |
{ | |
if (qiuxin_5.Z < 0) | |
lsmen = new xna.Vector3(-1000, 0, -230); | |
else lsmen = new xna.Vector3(-1000, 0, 230); | |
jiqiudian = JQD(qiuxin_5, yutou_1, lsmen); | |
// if ((jiqiudian - yutou_1).Length() > 400)/////鱼球距离远,用自己的函数,速度快 | |
// { | |
// this.decisions[0].VCode = Sudu(yutou_1 - gangti_1, jiqiudian - gangti_1, lsmen - qiuxin_5); | |
// this.decisions[0].TCode = Jiaosudu(yutou_1 - gangti_1, jiqiudian - gangti_1, lsmen - qiuxin_5, (jiqiudian - yutou_1).Length() / 314.1); | |
// } | |
// else | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(lsmen - qiuxin_5), 8, 6, 135, 10, 6, 12, 100, true); | |
} | |
#endregion | |
//第二条鱼的动作 | |
#region | |
for (int i = 0; i < 9; i++)////给球心二赋值 | |
{ | |
if (i == 4) | |
continue; | |
if (mission.EnvRef.Balls[i].PositionMm.X <= -1270 && mission.EnvRef.Balls[i].PositionMm.Z > -230 && mission.EnvRef.Balls[i].PositionMm.Z < 230) | |
continue; | |
if (mission.EnvRef.Balls[i].PositionMm.X <= -1220 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) > 230) | |
continue; | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
if (!(qiuxin_2.X <= -1270 && Math.Abs(qiuxin_2.Z) < 230) || !(qiuxin_2.X < -1210 && Math.Abs(qiuxin_2.Z) > 370))////不在 球门区或者球门两侧区域, | |
break; | |
} | |
for (int i = 0; i < 9; i++)//其他的球根球心二比较,距离短,取代 | |
{ | |
qxin = mission.EnvRef.Balls[i].PositionMm; | |
if (i == 4) | |
continue; | |
if (qxin.X <= -1270 && qxin.Z > -230 && qxin.Z < 230)/////在球门内 | |
continue; | |
if ((qxin - men).Length() <= (qiuxin_2 - men).Length())////长度小的,覆盖 | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
} | |
jiqiudian = JQD(qiuxin_2, yutou_2, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
// StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
#endregion | |
} | |
else /////顶粉球 | |
{ | |
////先确定1,2号鱼顶那个球 | |
#region | |
int t = 0;////标记1号鱼所顶的球心 | |
for (int i = 0; i < 9; i++) | |
{ | |
qiuxin_1 = mission.EnvRef.Balls[i].PositionMm; | |
t = i; | |
if (!(qiuxin_1.X < -1270 && Math.Abs(qiuxin_1.Z) < 230)) | |
break; | |
} | |
for (int i = 0; i < 9; i++) | |
{ | |
if (i == 4) | |
continue; | |
if ((mission.EnvRef.Balls[i].PositionMm.X < -1270 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) < 230) || (mission.EnvRef.Balls[i].PositionMm.X < -1210 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) > 370)) | |
continue; | |
if ((qiuxin_1 - men).Length() > (mission.EnvRef.Balls[i].PositionMm - men).Length()) | |
{ | |
qiuxin_1 = mission.EnvRef.Balls[i].PositionMm; | |
t = i; | |
} | |
} | |
/////以上确定球心1 | |
/////一下确定球心2 | |
for (int i = 0; i < 9; i++) | |
{ | |
if (i == t) | |
continue; | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
if (!(qiuxin_2.X < -1270 && Math.Abs(qiuxin_2.Z) < 230) || !(qiuxin_2.X < -1210 && Math.Abs(qiuxin_2.Z) > 370)) | |
break; | |
} | |
for (int j = 0; j < 9; j++) | |
{ | |
if (j == 4 || j == t) | |
continue; | |
if ((mission.EnvRef.Balls[j].PositionMm.X < -1270 && Math.Abs(mission.EnvRef.Balls[j].PositionMm.Z) < 230) || (qiuxin_2.X < -1210 && Math.Abs(qiuxin_2.Z) > 370)) | |
continue; | |
if ((qiuxin_2 - men).Length() > (mission.EnvRef.Balls[j].PositionMm - men).Length()) | |
{ | |
qiuxin_2 = mission.EnvRef.Balls[j].PositionMm; | |
} | |
} | |
////判断是否需要交换1,2所顶的球 | |
if ((yutou_1 - qiuxin_1).Length() + (yutou_2 - qiuxin_2).Length() > (yutou_1 - qiuxin_2).Length() + (yutou_2 - qiuxin_1).Length()) | |
{ | |
qxin = qiuxin_1; | |
qiuxin_1 = qiuxin_2; | |
qiuxin_2 = qxin; | |
} | |
/* if((yutou_2-qiuxin_1).Length()<300)/////////////////////////////////////////////////可不加 | |
{ | |
qxin = qiuxin_1; | |
qiuxin_1 = qiuxin_2; | |
qiuxin_2 = qxin; | |
}*/ | |
#endregion | |
jiqiudian = JQD(qiuxin_1, yutou_1, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 10, 6, 12, 100, true); | |
jiqiudian = JQD(qiuxin_2, yutou_2, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
} | |
////黄球 进了对方的门,1号鱼去顶出来 | |
#region | |
if (qiuxin_5.X > 1200 && Math.Abs(qiuxin_5.Z) < 230) | |
{ | |
jiqiudian = new xna.Vector3(1220, 0, 150); | |
men = new xna.Vector3(1360, 0, 380); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////游近 | |
if (yutou_1.X > 1200) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X + 100, 0, 250); | |
men = new xna.Vector3(1500, 0, 250); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);////游进 | |
} | |
if (yutou_1.X > 1420) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X + 400, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < 40) | |
jiqiudian = new xna.Vector3(yutou_1.X + 200, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < -80)//////放低角度 | |
jiqiudian = new xna.Vector3(yutou_1.X + 200, 0, yutou_1.Z - 400); | |
men = new xna.Vector3(yutou_1.X + 500, 0, yutou_1.Z - 500); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////划过底门 | |
} | |
if (yutou_1.Z < -140 && yutou_1.X > 1200)////划出球门 | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 120, 0, yutou_1.Z - 400);//-160 -400 | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 12, 12, 12, 100, true); | |
} | |
// xna.Vector3 yuanxin=new xna.Vector3(1290,0,-160); | |
// if (gangti_1.Z<-100 && gangti_1.X < 1270 && gangti_1.X>1220)////打转 | |
// { | |
// decisions[0].TCode = 0; | |
// decisions[0].VCode = 1; | |
// } | |
} | |
#endregion | |
} | |
//////最后两分半钟 | |
else | |
{ | |
////2号鱼继续顶球 | |
#region | |
for (int i = 0; i < 9; i++) | |
{ | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
if (!(qiuxin_2.X < -1270 && Math.Abs(qiuxin_2.Z) < 230) || !(qiuxin_2.X < -1210 && Math.Abs(qiuxin_2.Z) > 370)) | |
break; | |
} | |
for (int i = 0; i < 9; i++) | |
{ | |
if (i == 4) | |
continue; | |
if ((mission.EnvRef.Balls[i].PositionMm.X < -1270 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) < 230) || (mission.EnvRef.Balls[i].PositionMm.X < -1210 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) > 370)) | |
continue; | |
if ((qiuxin_2 - men).Length() > (mission.EnvRef.Balls[i].PositionMm - men).Length()) | |
{ | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
} | |
} | |
if (!(mission.EnvRef.Balls[4].PositionMm.X < -1270))//&& Math.Abs(mission.EnvRef.Balls[4].PositionMm.Z) < 230)) | |
qiuxin_2 = mission.EnvRef.Balls[4].PositionMm; | |
jiqiudian = JQD(qiuxin_2, yutou_2, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
#endregion | |
/////1号鱼去挤出对方的球 | |
#region | |
int k = 0;////标记对方球门是否有球 | |
for (int i = 0; i < 9; i++) | |
{ | |
qiuxin_1 = mission.EnvRef.Balls[4].PositionMm; | |
if (qiuxin_1.X >= 1200 && Math.Abs(qiuxin_1.Z) < 230) | |
{ | |
k = 1; | |
break; | |
} | |
qiuxin_1 = mission.EnvRef.Balls[i].PositionMm; | |
if (qiuxin_1.X > 1200 && Math.Abs(qiuxin_1.Z) < 230) | |
{ | |
k = 1; | |
break; | |
} | |
} | |
if (k == 0) | |
{ | |
if (yutou_1.X > 1220 && Math.Abs(yutou_1.Z) > 380) | |
jiqiudian = new xna.Vector3(0, 0, 0); | |
else | |
jiqiudian = new xna.Vector3(1300, 0, 0); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 10, 6, 12, 100, true); | |
if (Math.Abs(gangti_1.Z) < 120 && gangti_1.X > 1150) | |
{ | |
decisions[0].VCode = 1; | |
decisions[0].TCode = 0; | |
} | |
} | |
else | |
{ | |
jiqiudian = new xna.Vector3(1220, 0, 150); | |
men = new xna.Vector3(1360, 0, 380); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////游近 | |
if (yutou_1.X > 1200) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X + 100, 0, 250); | |
men = new xna.Vector3(1500, 0, 250); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);////游进 | |
} | |
if (yutou_1.X > 1420) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X + 400, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < 40) | |
jiqiudian = new xna.Vector3(yutou_1.X + 200, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < -80)//////放低角度 | |
jiqiudian = new xna.Vector3(yutou_1.X + 200, 0, yutou_1.Z - 400); | |
men = new xna.Vector3(yutou_1.X + 500, 0, yutou_1.Z - 500); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////划过底门 | |
} | |
if (yutou_1.Z < -140 && yutou_1.X > 1200)////划出球门 | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 120, 0, yutou_1.Z - 400);//-160 -400 | |
if (yutou_1.Z < 1240) | |
jiqiudian = new xna.Vector3(1240, 0, 380); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 12, 12, 12, 100, true); | |
} | |
} | |
#endregion | |
} | |
#endregion | |
} | |
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { | |
// decisions[0].VCode = sudu((yutou0 - jiqiudian).Length(), Cal(jiqiudian - gangti0) - Cal(yutou0 - gangti0)); | |
//decisions[0].TCode = Jiaosudu(yutou0 - gangti0, jiqiudian - yutou0, qiumen - qiuxin, (jiqiudian - yutou0).Length() / 314.4); | |
// } | |
///////////右半场 | |
if (mission.TeamsRef[teamId].Para.MyHalfCourt == HalfCourt.RIGHT) | |
{ | |
if (times > 1500) | |
{ | |
////1号鱼顶黄球,2号顶粉球 | |
#region | |
if (!(qiuxin_5.X > 1350 && Math.Abs(qiuxin_5.Z) < 230))////球不在门内 | |
{ | |
//第一条鱼的动作 | |
#region | |
if (!(qiuxin_5.X > 1150 && Math.Abs(qiuxin_5.Z) > 230))////球不在球门两侧 | |
{ | |
jiqiudian = JQD(qiuxin_5, yutou_1, men); | |
// if ((jiqiudian - yutou_1).Length() > 400)/////鱼球距离远,用自己的函数,速度快 | |
// { | |
// this.decisions[0].VCode = Sudu(yutou_1 - gangti_1, jiqiudian - gangti_1, men - qiuxin_5); | |
// this.decisions[0].TCode = Jiaosudu(yutou_1 - gangti_1, jiqiudian - gangti_1, men - qiuxin_5, (jiqiudian - yutou_1).Length() / 314.1); | |
// } | |
// else | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_5), 8, 6, 135, 10, 6, 12, 100, true); | |
} | |
else if (qiuxin_5.X > 1150 && Math.Abs(qiuxin_5.Z) > 230)////球在球门两侧 | |
{ | |
if (qiuxin_5.Z < 0) | |
lsmen = new xna.Vector3(1000, 0, -230); | |
else lsmen = new xna.Vector3(1000, 0, 230); | |
jiqiudian = JQD(qiuxin_5, yutou_1, lsmen); | |
// if ((jiqiudian - yutou_1).Length() > 400)/////鱼球距离远,用自己的函数,速度快 | |
// { | |
// this.decisions[0].VCode = Sudu(yutou_1 - gangti_1, jiqiudian - gangti_1, lsmen - qiuxin_5); | |
// this.decisions[0].TCode = Jiaosudu(yutou_1 - gangti_1, jiqiudian - gangti_1, lsmen - qiuxin_5, (jiqiudian - yutou_1).Length() / 314.1); | |
// } | |
// else | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(lsmen - qiuxin_5), 8, 6, 135, 10, 6, 12, 100, true); | |
} | |
#endregion | |
//第二条鱼的动作 | |
#region | |
for (int i = 0; i < 9; i++)////给球心二赋值 | |
{ | |
if (i == 4) | |
continue; | |
if (mission.EnvRef.Balls[i].PositionMm.X > 1270 && mission.EnvRef.Balls[i].PositionMm.Z > -230 && mission.EnvRef.Balls[i].PositionMm.Z < 230) | |
continue; | |
if (mission.EnvRef.Balls[i].PositionMm.X > 1220 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) > 230) | |
continue; | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
if (!(qiuxin_2.X > 1270 && Math.Abs(qiuxin_2.Z) < 230) || !(qiuxin_2.X > 1210 && Math.Abs(qiuxin_2.Z) > 370))////不在 球门区或者球门两侧区域, | |
break; | |
} | |
for (int i = 0; i < 9; i++)//其他的球根球心二比较,距离短,取代 | |
{ | |
qxin = mission.EnvRef.Balls[i].PositionMm; | |
if (i == 4) | |
continue; | |
if (qxin.X > 1270 && qxin.Z > -230 && qxin.Z < 230)/////在球门内 | |
continue; | |
if ((qxin - men).Length() <= (qiuxin_2 - men).Length())////长度小的,覆盖 | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
} | |
jiqiudian = JQD(qiuxin_2, yutou_2, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
// StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
#endregion | |
} | |
else /////顶粉球 | |
{ | |
////先确定1,2号鱼顶那个球 | |
#region | |
int t = 0;////标记1号鱼所顶的球心 | |
for (int i = 0; i < 9; i++) | |
{ | |
qiuxin_1 = mission.EnvRef.Balls[i].PositionMm; | |
t = i; | |
if (!(qiuxin_1.X > 1270 && Math.Abs(qiuxin_1.Z) < 230)) | |
break; | |
} | |
for (int i = 0; i < 9; i++) | |
{ | |
if (i == 4) | |
continue; | |
if ((mission.EnvRef.Balls[i].PositionMm.X > 1270 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) < 230) || (mission.EnvRef.Balls[i].PositionMm.X > 1210 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) > 370)) | |
continue; | |
if ((qiuxin_1 - men).Length() > (mission.EnvRef.Balls[i].PositionMm - men).Length()) | |
{ | |
qiuxin_1 = mission.EnvRef.Balls[i].PositionMm; | |
t = i; | |
} | |
} | |
/////以上确定球心1 | |
/////一下确定球心2 | |
for (int i = 0; i < 9; i++) | |
{ | |
if (i == t) | |
continue; | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
if (!(qiuxin_2.X > 1270 && Math.Abs(qiuxin_2.Z) < 230) || !(qiuxin_2.X > 1210 && Math.Abs(qiuxin_2.Z) > 370)) | |
break; | |
} | |
for (int j = 0; j < 9; j++) | |
{ | |
if (j == 4 || j == t) | |
continue; | |
if ((mission.EnvRef.Balls[j].PositionMm.X > 1270 && Math.Abs(mission.EnvRef.Balls[j].PositionMm.Z) < 230) || (qiuxin_2.X > 1210 && Math.Abs(qiuxin_2.Z) > 370)) | |
continue; | |
if ((qiuxin_2 - men).Length() > (mission.EnvRef.Balls[j].PositionMm - men).Length()) | |
{ | |
qiuxin_2 = mission.EnvRef.Balls[j].PositionMm; | |
} | |
} | |
////判断是否需要交换1,2所顶的球 | |
if ((yutou_1 - qiuxin_1).Length() + (yutou_2 - qiuxin_2).Length() > (yutou_1 - qiuxin_2).Length() + (yutou_2 - qiuxin_1).Length()) | |
{ | |
qxin = qiuxin_1; | |
qiuxin_1 = qiuxin_2; | |
qiuxin_2 = qxin; | |
} | |
/* if((yutou_2-qiuxin_1).Length()<300)/////////////////////////////////////////////////可不加 | |
{ | |
qxin = qiuxin_1; | |
qiuxin_1 = qiuxin_2; | |
qiuxin_2 = qxin; | |
}*/ | |
#endregion | |
jiqiudian = JQD(qiuxin_1, yutou_1, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 10, 6, 12, 100, true); | |
jiqiudian = JQD(qiuxin_2, yutou_2, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
} | |
////黄球 进了对方的门,1号鱼去顶出来 | |
#region | |
if (qiuxin_5.X < -1200 && Math.Abs(qiuxin_5.Z) < 230) | |
{ | |
jiqiudian = new xna.Vector3(-1220, 0, 150); | |
men = new xna.Vector3(-1360, 0, 380); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////游近 | |
if (yutou_1.X < -1200) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 100, 0, 250); | |
men = new xna.Vector3(-1500, 0, 250); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);////游进 | |
} | |
if (yutou_1.X < -1420) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 400, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < 40) | |
jiqiudian = new xna.Vector3(yutou_1.X - 200, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < -80)//////放低角度 | |
jiqiudian = new xna.Vector3(yutou_1.X - 200, 0, yutou_1.Z - 400); | |
men = new xna.Vector3(yutou_1.X - 500, 0, yutou_1.Z - 500); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////划过底门 | |
} | |
if (yutou_1.Z < -140 && yutou_1.X < -1200)////划出球门 | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X + 120, 0, yutou_1.Z - 400);//-160 -400 | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true); | |
} | |
// xna.Vector3 yuanxin=new xna.Vector3(1290,0,-160); | |
// if (gangti_1.Z<-100 && gangti_1.X < 1270 && gangti_1.X>1220)////打转 | |
// { | |
// decisions[0].TCode = 0; | |
// decisions[0].VCode = 1; | |
// } | |
} | |
#endregion | |
} | |
//////最后两分半钟 | |
else | |
{ | |
////2号鱼继续顶球 | |
#region | |
for (int i = 0; i < 9; i++) | |
{ | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
if (!(qiuxin_2.X > 1270 && Math.Abs(qiuxin_2.Z) < 230) || !(qiuxin_2.X > 1210 && Math.Abs(qiuxin_2.Z) > 370)) | |
break; | |
} | |
for (int i = 0; i < 9; i++) | |
{ | |
if (i == 4) | |
continue; | |
if ((mission.EnvRef.Balls[i].PositionMm.X > 1270 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) < 230) || (mission.EnvRef.Balls[i].PositionMm.X > 1210 && Math.Abs(mission.EnvRef.Balls[i].PositionMm.Z) > 370)) | |
continue; | |
if ((qiuxin_2 - men).Length() > (mission.EnvRef.Balls[i].PositionMm - men).Length()) | |
{ | |
qiuxin_2 = mission.EnvRef.Balls[i].PositionMm; | |
} | |
} | |
if (!(mission.EnvRef.Balls[4].PositionMm.X > 1270))//&& Math.Abs(mission.EnvRef.Balls[4].PositionMm.Z) < 230)) | |
qiuxin_2 = mission.EnvRef.Balls[4].PositionMm; | |
jiqiudian = JQD(qiuxin_2, yutou_2, men); | |
StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 10, 6, 12, 100, true); | |
#endregion | |
/////1号鱼去挤出对方的球 | |
#region | |
int k = 0;////标记对方球门是否有球 | |
for (int i = 0; i < 9; i++) | |
{ | |
qiuxin_1 = mission.EnvRef.Balls[4].PositionMm; | |
if (qiuxin_1.X < -1200 && Math.Abs(qiuxin_1.Z) < 230) | |
{ | |
k = 1; | |
break; | |
} | |
qiuxin_1 = mission.EnvRef.Balls[i].PositionMm; | |
if (qiuxin_1.X < -1200 && Math.Abs(qiuxin_1.Z) < 230) | |
{ | |
k = 1; | |
break; | |
} | |
} | |
if (k == 0) | |
{ | |
if (yutou_1.X < -1220 && Math.Abs(yutou_1.Z) > 380) | |
jiqiudian = new xna.Vector3(0, 0, 0); | |
else | |
jiqiudian = new xna.Vector3(-1300, 0, 0); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 10, 6, 12, 100, true); | |
if (Math.Abs(gangti_1.Z) < 120 && gangti_1.X < -1150) | |
{ | |
decisions[0].VCode = 1; | |
decisions[0].TCode = 0; | |
} | |
} | |
else | |
{ | |
jiqiudian = new xna.Vector3(-1220, 0, 150); | |
men = new xna.Vector3(-1360, 0, 380); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////游近 | |
if (yutou_1.X < -1200) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 100, 0, 250); | |
men = new xna.Vector3(-1500, 0, 250); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);////游进 | |
} | |
if (yutou_1.X > 1420) | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 400, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < 40) | |
jiqiudian = new xna.Vector3(yutou_1.X - 200, 0, yutou_1.Z - 200); | |
if (yutou_1.Z < -80)//////放低角度 | |
jiqiudian = new xna.Vector3(yutou_1.X - 200, 0, yutou_1.Z - 400); | |
men = new xna.Vector3(yutou_1.X - 500, 0, yutou_1.Z - 500); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_1), 8, 6, 135, 12, 12, 12, 100, true);//////划过底门 | |
} | |
if (yutou_1.Z < -140 && yutou_1.X < -1200)////划出球门 | |
{ | |
jiqiudian = new xna.Vector3(yutou_1.X - 120, 0, yutou_1.Z - 400);//-160 -400 | |
if (yutou_1.Z > -1240) | |
jiqiudian = new xna.Vector3(-1240, 0, 380); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], jiqiudian, Cal(men - qiuxin_2), 8, 6, 135, 12, 12, 12, 100, true); | |
} | |
} | |
#endregion | |
} | |
#endregion | |
} | |
return decisions; | |
} | |
public xna.Vector3 JQ(xna.Vector3 qiuxin, xna.Vector3 qiumen) | |
{ | |
xna.Vector3 a; | |
double jiao; | |
jiao = Cal(qiumen - qiuxin); | |
a.Y = 0; | |
a.X = (float)(qiuxin.X - 58 * Math.Cos(jiao)); | |
a.Z = (float)(qiuxin.Z - 58 * Math.Sin(jiao)); | |
return a; | |
} | |
public xna.Vector3 JQD(xna.Vector3 qiuxin, xna.Vector3 yutou, xna.Vector3 qiumen) | |
{ | |
xna.Vector3 jiqiudian = JQ(qiuxin, qiumen); | |
xna.Vector3 j1 = new xna.Vector3(0, 0, 0); | |
xna.Vector3 j2 = new xna.Vector3(0, 0, 0); | |
double r = 65; | |
if ((yutou - jiqiudian).Length() > (yutou - qiuxin).Length()) | |
{ | |
j1.X = jiqiudian.X + (float)(r * Math.Sin(Cal(qiumen - qiuxin))); | |
j1.Y = 0; | |
j1.Z = jiqiudian.Z - (float)(r * Math.Cos(Cal(qiumen - qiuxin))); | |
j2.X = jiqiudian.X - (float)(r * Math.Sin(Cal(qiumen - qiuxin))); | |
j2.Y = 0; | |
j2.Z = jiqiudian.Z + (float)(r * Math.Cos(Cal(qiumen - qiuxin))); | |
if ((yutou - j1).Length() < (yutou - j2).Length()) | |
return j1; | |
else return j2; | |
} | |
else | |
return jiqiudian; | |
} | |
public float Cal(xna.Vector3 vector)//一个向量的角度 | |
{ | |
if (((Math.Abs(vector.X) > float.Epsilon) || (Math.Abs(vector.Y) > float.Epsilon)) || (Math.Abs(vector.Z) > float.Epsilon)) | |
{ | |
vector.Normalize(); | |
} | |
float num = xna.Vector3.Dot(vector, new xna.Vector3(1f, 0f, 0f)); | |
if (num > 1f) | |
{ | |
num = 1f; | |
} | |
else if (num < -1f) | |
{ | |
num = -1f; | |
} | |
float num2 = (float)Math.Acos((double)num); | |
if (vector.Z < 0f) | |
{ | |
num2 = -num2; | |
} | |
if (num2 > 3.141593f) | |
{ | |
return (num2 - 6.283185f); | |
} | |
if (num2 < -3.141593f) | |
{ | |
num2 += 6.283185f; | |
} | |
return num2; | |
} | |
public int Jiaosudu(xna.Vector3 a, xna.Vector3 b, xna.Vector3 e, double t)//a鱼刚体方向向量,b是要转过去的向量,t为鱼到击球点的时间 | |
{ | |
double c = Cal(b) - Cal(a);//c是要转角度 | |
if (b.Length() < 30) c = Cal(b) - Cal(e); | |
if (c > Math.PI) c -= 2 * Math.PI; | |
if (c < -Math.PI) c += 2 * Math.PI; | |
int n = 7; | |
double d = (float)Math.Abs((float)Math.Abs(c) - (float)Math.Abs(DataBasedOnExperiment.TCodeAndAngularVelocityTable[0] * 0.1));//d是要转角度的绝对值 | |
if (t > 2.3) t = 2.3; | |
double w = d / t; | |
double[] tt = { -0.3552, -0.2921, -0.2200, -0.1731, -0.1235, -0.0784, -0.0469, 0, 0.0469, 0.0784, 0.1235, 0.1731, 0.2200, 0.2921, 0.3438, 0.3438 };//在vcode=0时,tcode==0,但是T=0,若vcode!=0,当tcode=0,时,T=-0.3552 | |
if (c > Math.PI / 4) return 14; | |
if (c < -Math.PI / 4) return 0; | |
while (n > 0 && w > Math.Abs(tt[n])) | |
{ | |
if (c < 0) | |
n--; | |
else | |
{ | |
n++; | |
if (n > 14) | |
{ | |
n = 14; | |
break; | |
} | |
} | |
} | |
return n; | |
} | |
public int Sudu(xna.Vector3 a, xna.Vector3 b, xna.Vector3 c)//a为刚头向量,b为鱼头到击球点的向量,c为要转过去的向量 | |
{ | |
double yzjd = Cal(b) - Cal(a); | |
if (b.Length() < 40) yzjd = Cal(c) - Cal(a); | |
if (yzjd > Math.PI) yzjd -= 2 * Math.PI; | |
if (yzjd < -Math.PI) yzjd += 2 * Math.PI; | |
if (b.Length() < 150) | |
{ | |
if ((Math.Abs(yzjd) < Math.PI / 18)) return 7; | |
else return 1; | |
} | |
else | |
return (Math.Abs(yzjd) > Math.PI / 4) ? 1 : 14; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment