Skip to content

Instantly share code, notes, and snippets.

@thuzhf
Created July 28, 2014 02:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thuzhf/6408135a26df32918bcb to your computer and use it in GitHub Desktop.
Save thuzhf/6408135a26df32918bcb to your computer and use it in GitHub Desktop.
heb
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