Last active
April 15, 2016 07:47
-
-
Save thuzhf/e9da4f8a704c413954c4 to your computer and use it in GitHub Desktop.
机器鱼协作过孔代码
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 | |
{ | |
public string GetTeamName() | |
{ | |
return "THU"; | |
} | |
#region still fish0 | |
private int stillState = 0; | |
private int stillState_up = 1; | |
#endregion | |
private int downState = 0; | |
private int upState = 0; | |
#region///定义 | |
private Decision[] decisions; | |
private xna.Vector3 goalDest1; | |
private xna.Vector3 goalDest0; | |
private double r; | |
private double time; | |
private xna.Vector3 position1; | |
private xna.Vector3 position2; | |
private xna.Vector3 position3; | |
private xna.Vector3 position4; | |
private xna.Vector3 position5; | |
private xna.Vector3 position6; | |
private xna.Vector3 position7; | |
private xna.Vector3 position8; | |
private xna.Vector3 position9; | |
private xna.Vector3 position10; | |
private xna.Vector3 position11; | |
private xna.Vector3 finish_place1; | |
private xna.Vector3 finish_place2; | |
private xna.Vector3 finish_place3; | |
private xna.Vector3 finish_place4; | |
private xna.Vector3 finish_place5; | |
private xna.Vector3 finish_place6; | |
private xna.Vector3 finish_place7; | |
private xna.Vector3 finish_place8; | |
private xna.Vector3 finish_place9; | |
private xna.Vector3 finish_placeup; | |
private xna.Vector3 finish_placeright; | |
private xna.Vector3 finish_placep1; | |
private xna.Vector3 finish_placep2; | |
private xna.Vector3 finish_placep3; | |
private xna.Vector3 finish_placep4; | |
private xna.Vector3 finish_placep5; | |
private xna.Vector3 finish_placep6; | |
private xna.Vector3 finish_placep7; | |
private xna.Vector3 finish_placep8; | |
private xna.Vector3 finish_placep9; | |
private int fish1_still_flag; | |
private float pi = (float)3.1415926; | |
#endregion | |
public Strategy() | |
{ | |
fish1_still_flag = 1; | |
this.decisions = null; | |
this.r = 58.0; | |
#region///给出所有坐标 | |
this.position1 = new xna.Vector3(-680, 0, -750);//鱼到的位置 | |
this.position2 = new xna.Vector3(0, 0, 750); | |
this.position3 = new xna.Vector3(680, 0, -750); | |
this.position4 = new xna.Vector3(1000, 0, 50); | |
this.position5 = new xna.Vector3(1150, 0, -750); | |
this.position6 = new xna.Vector3(300, 0, -750); | |
this.position7 = new xna.Vector3(550, 0, 900); | |
this.position8 = new xna.Vector3(-500, 0, 800); | |
this.position9 = new xna.Vector3(-200, 0, -850); | |
this.position10 = new xna.Vector3(-1100, 0, -600); | |
this.position11 = new xna.Vector3(-1000, 0, 100); //50 | |
this.finish_place1 = new xna.Vector3(650, 0, -800); | |
this.finish_place2 = new xna.Vector3(0, 0, -600); | |
this.finish_place3 = new xna.Vector3(0, 0, 650); | |
this.finish_place4 = new xna.Vector3(-150, 0, 550); | |
this.finish_place5 = new xna.Vector3(-600, 0, 200); | |
this.finish_place6 = new xna.Vector3(-680, 0, -700); | |
this.finish_place7 = new xna.Vector3(-1400, 0, 0); | |
this.finish_place8 = new xna.Vector3(-1300, 0, -750); | |
this.finish_place9 = new xna.Vector3(450, 0, -800); | |
this.finish_placep1 = new xna.Vector3(670, 0, -750); | |
this.finish_placep2 = new xna.Vector3(670, 0, -800); | |
this.finish_placep3 = new xna.Vector3(0, 0, -700); | |
this.finish_placep4 = new xna.Vector3(0, 0, 800); | |
this.finish_placep5 = new xna.Vector3(0, 0, 660); | |
this.finish_placep6 = new xna.Vector3(-600, 0, 600); //(-600, 0, 400) | |
this.finish_placep7 = new xna.Vector3(-600, 0, 300); | |
this.finish_placep8 = new xna.Vector3(-600, 0, -100); | |
this.finish_placep9 = new xna.Vector3(-680, 0, -670); | |
#endregion | |
} | |
public void checkFish2FishCollision(xna.Vector3 fish1pos, xna.Vector3 fish2pos, int r, float fishrad, ref Decision decision) | |
{ | |
double distance = Math.Pow(fish1pos.X - fish2pos.X, 2.0) + Math.Pow(fish1pos.Z - fish2pos.Z, 2.0); | |
r = 300; | |
if (2 * Math.Pow(r, 2.0) <= distance) | |
{ | |
double reg = Math.Atan((fish1pos.Z - fish2pos.Z) / (fish1pos.X - fish2pos.X)); | |
if (reg < 0 && reg >= -pi / 2 && fishrad < 0 && fishrad >= -pi / 2) | |
{ | |
decision.VCode = 14; | |
decision.TCode = 2; | |
} | |
else if (reg < -pi / 2 && reg >= -pi && fishrad < -pi / 2 && fishrad >= -pi) | |
{ | |
decision.VCode = 14; | |
decision.TCode = 12; | |
} | |
else if (reg >= 0 && reg < pi / 2 && fishrad >= 0 && fishrad < pi / 2) | |
{ | |
decision.VCode = 1; | |
decision.TCode = 12; | |
} | |
else if (reg >= pi / 2 && reg <= pi && fishrad >= pi / 2 && fishrad <= pi) | |
{ | |
decision.VCode = 1; | |
decision.TCode = 2; | |
} | |
} | |
} | |
public int CheckZone(xna.Vector3 pos) | |
{ | |
float z1 = -600f - 58f; | |
float z2 = -600f; | |
float z3 = 600f + 58f; | |
float z4 = 600f; | |
if (pos.X >= 1320f) | |
{ | |
return 0; | |
} | |
if (pos.X >= 750f && pos.X < 1320f && pos.Z >= z1) | |
{ | |
return 1; | |
} | |
else if (pos.X >= 600f && pos.X < 750f && pos.Z >= z1 && pos.Z < z2) | |
{ | |
return 10; | |
} | |
else if (pos.X >= 125f && pos.Z < z1) | |
{ | |
return 2; | |
} | |
else if (pos.X >= 75f && pos.X < 125f && pos.Z < z2) | |
{ | |
return 3; | |
} | |
else if (pos.X >= 125f && pos.X <= 600f && pos.Z >= z1 && pos.Z < z2) | |
{ | |
return 4; | |
} | |
else if (pos.X >= 75f && pos.X <= 600f && pos.Z >= z2 && pos.Z < z3) | |
{ | |
return 5; | |
} | |
else if (pos.X >= -75f && pos.X < 75f && pos.Z >= z4 && pos.Z < z3) | |
{ | |
return 11; | |
} | |
else if (pos.X >= -75f && pos.X <= 600f && pos.Z >= z3) | |
{ | |
return 6; | |
} | |
else if (pos.X >= -600f && pos.X <= -75f && pos.Z >= z4) | |
{ | |
return 7; | |
} | |
else if (pos.X >= -600f && pos.X <= -75f && pos.Z >= z1 && pos.Z < z4) | |
{ | |
return 8; | |
} | |
// else if (pos.X >= -600f && pos.X <= -75f && pos.Z >= z1 && pos.Z < z4) | |
// { | |
// return 9; | |
// } | |
else | |
{ | |
return -1; | |
} | |
} | |
public Decision[] GetDecision(Mission mission, int teamId) | |
{ | |
if (this.decisions == null) | |
{ | |
this.decisions = new Decision[mission.CommonPara.FishCntPerTeam]; | |
this.r = mission.EnvRef.Balls[0].RadiusMm; | |
} | |
#region///定义变量 | |
xna.Vector3 fishPm0 = mission.TeamsRef[teamId].Fishes[0].PositionMm; | |
xna.Vector3 fishPm1 = mission.TeamsRef[teamId].Fishes[1].PositionMm; | |
xna.Vector3 ballsPm = mission.EnvRef.Balls[0].PositionMm; | |
RoboFish fish0 = mission.TeamsRef[teamId].Fishes[0]; | |
RoboFish fish1 = mission.TeamsRef[teamId].Fishes[1];//定义 | |
this.time = mission.CommonPara.RemainingCycles; | |
bool f01 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish0AtStage1"]); | |
bool f11 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish1AtStage1"]); | |
bool f02 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish0AtStage2"]); | |
bool f12 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish1AtStage2"]); | |
bool f03 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish0AtStage3"]); | |
bool f13 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish1AtStage3"]); | |
bool f04 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish0AtStage4"]); | |
bool f14 = Convert.ToBoolean(mission.HtMissionVariables["IsCollidedBallAndFish1AtStage4"]); | |
int no = Convert.ToInt32(mission.HtMissionVariables["ExecutingTaskNo"]); | |
// this.finish_place1 = new xna.Vector3((float)(ballsPm.X - this.r * (Math.Acos(Math.PI / 4))), 0, (float)(ballsPm.Z - this.r * (Math.Asin(Math.PI / 4)))); | |
this.finish_placeup = new xna.Vector3((float)(ballsPm.X), 0, (float)(ballsPm.Z + this.r));//击球点在球上侧 | |
this.finish_placeright = new xna.Vector3((float)(ballsPm.X - this.r), 0, (float)(ballsPm.Z - 20));//击球点在球右侧 | |
// this.position11 = new xna.Vector3((float)(ballsPm.X + 1.5 * this.r), 0, ballsPm.Z); | |
int times = 10000; | |
#endregion/// | |
//no = 2; | |
//f01 = true; | |
//f11 = true; | |
//f02 = true; | |
//f12 = true; | |
xna.Vector3 goalDest = new xna.Vector3(); | |
float goalRad = 0; | |
#region 控制fish0 | |
if ((no == 1)) | |
{ | |
if (f01 == false) | |
{ | |
/* | |
if (fishPm0.X < -750) | |
{ | |
actFast(0, position1, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], position1, (float)Math.Atan((position1.Z - fishPm0.Z) / (position1.X - fishPm0.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
} | |
if (fishPm0.X > -750 && fishPm0.X < -30) | |
{ | |
actFast(0, position2, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], position2, (float)Math.Atan((position2.Z - fishPm0.Z) / (position2.X - fishPm0.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
} | |
if (fishPm0.X > -30 && fishPm0.X < 650) | |
{ | |
actFast(0, position3, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], position3, (float)Math.Atan((position3.Z - fishPm0.Z) / (position3.X - fishPm0.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
}*/ | |
if (mission.TeamsRef[0].Fishes[0].PositionMm.X < -616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z > -300) | |
{ | |
//Console.WriteLine("stage 1"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > -1.5 && mission.TeamsRef[0].Fishes[0].BodyDirectionRad < 1.7) | |
{ | |
decisions[0].TCode = 0; | |
decisions[0].VCode = 5; | |
//Console.WriteLine("turn left"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad >= 1.7 || mission.TeamsRef[0].Fishes[0].BodyDirectionRad < -1.9) | |
{ | |
decisions[0].TCode = 14; | |
decisions[0].VCode = 5; | |
//Console.WriteLine("turn right"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
//Console.WriteLine("go straight"); | |
decisions[0].TCode = 7; | |
decisions[0].VCode = 14; | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.X < 0 && mission.TeamsRef[0].Fishes[0].PositionMm.X > -616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z < -700 || mission.TeamsRef[0].Fishes[0].PositionMm.X < -616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z < -300) | |
{ | |
//Console.WriteLine("stage 2"); | |
decisions[0].TCode = 14; | |
decisions[0].VCode = 8; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.X < 0 && mission.TeamsRef[0].Fishes[0].PositionMm.Z < 300) | |
{ | |
//Console.WriteLine("stage 3"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > -1.7 && mission.TeamsRef[0].Fishes[0].BodyDirectionRad < 1.5) | |
{ | |
decisions[0].TCode = 14; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > 1.9 || mission.TeamsRef[0].Fishes[0].BodyDirectionRad <= -1.7) | |
{ | |
decisions[0].TCode = 0; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("turn left"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
//Console.WriteLine("go straight"); | |
decisions[0].TCode = 7; | |
decisions[0].VCode = 14; | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.X > -616 && mission.TeamsRef[0].Fishes[0].PositionMm.X < 0 && mission.TeamsRef[0].Fishes[0].PositionMm.Z > 300 || mission.TeamsRef[0].Fishes[0].PositionMm.X > 0 && mission.TeamsRef[0].Fishes[0].PositionMm.X < 616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z > 700) | |
{ | |
//Console.WriteLine("stage 4"); | |
decisions[0].TCode = 0; | |
decisions[0].VCode = 8; | |
//Console.WriteLine("turn left"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.X < 616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z > -300) | |
{ | |
//Console.WriteLine("stage 5"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > -1.5 && mission.TeamsRef[0].Fishes[0].BodyDirectionRad < 1.5) | |
{ | |
decisions[0].TCode = 0; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("turn left"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > 1.9 || mission.TeamsRef[0].Fishes[0].BodyDirectionRad < -1.9) | |
{ | |
decisions[0].TCode = 14; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("turn right"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
decisions[0].TCode = 7; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("go straight"); | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.X > 0 && mission.TeamsRef[0].Fishes[0].PositionMm.X < 616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z < -300 || mission.TeamsRef[0].Fishes[0].PositionMm.X > 616 && mission.TeamsRef[0].Fishes[0].PositionMm.Z < -700) | |
{ | |
//Console.WriteLine("stage 6"); | |
decisions[0].TCode = 14; | |
decisions[0].VCode = 8; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.Z < -500) | |
{ | |
//Console.WriteLine("stage 7"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > -1.5 && mission.TeamsRef[0].Fishes[0].BodyDirectionRad < 1.5) | |
{ | |
decisions[0].TCode = 14; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[0].BodyDirectionRad > 1.9 || mission.TeamsRef[0].Fishes[0].BodyDirectionRad < -1.9) | |
{ | |
decisions[0].TCode = 0; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("turn left"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[0].BodyDirectionRad); | |
decisions[0].TCode = 7; | |
decisions[0].VCode = 14; | |
//Console.WriteLine("go straight"); | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[0].PositionMm.Z > -500 && mission.TeamsRef[0].Fishes[0].PositionMm.Z < 200) | |
{ | |
//Console.WriteLine("state 8"); | |
goalDest = new xna.Vector3(mission.EnvRef.Balls[0].PositionMm.X + 30, mission.EnvRef.Balls[0].PositionMm.Y, mission.EnvRef.Balls[0].PositionMm.Z); | |
goalRad = 1.5f; | |
times = 0; | |
StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], goalDest, goalRad, 30.0f, 10f, mission.CommonPara.MsPerCycle, ref times); | |
//StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], goalDest, goalRad, 5, 10, 150, 6, 4, 15, 100, true); | |
//Console.WriteLine("-------------------times--------------" + times); | |
decisions[1].VCode = 0; | |
decisions[1].TCode = 1; | |
} | |
if (fishPm0.X >= 650) | |
{ | |
actFast(0, position4, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], position4, (float)Math.Atan((position4.Z - fishPm0.Z) / (position4.X - fishPm0.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
if (fishPm0.Z > 40) | |
{ | |
number_act(0, 3, fishPm0, ballsPm, fish0, finish_placeright); | |
} | |
} | |
} | |
else | |
{ | |
number_act(0, 3, fishPm0, ballsPm, fish0, finish_placeright); | |
if (fishPm0.X > 1350) | |
{ | |
this.decisions[0].TCode = 2; | |
this.decisions[0].VCode = 8; | |
} | |
if (ballsPm.X < 1250) | |
{ | |
actFast(0, position3, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
} | |
if (fishPm0.Z < -600) | |
{ | |
// times = 100; | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], position6, (float)Math.Atan((position6.Z - fishPm0.Z) / (position6.X - fishPm0.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
//actSlow(0, position6, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
//xna.Vector3 dest = new xna.Vector3(132, 0, -840); | |
//StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], dest, -90, 30, 14, 100, 6, 4, 15, 100, false); | |
if (stillState == 0) | |
stillState = 1; | |
} | |
if (stillState == 1) | |
{ | |
xna.Vector3 dest = new xna.Vector3(130, 0, -700); | |
StrategyHelper.Helpers.Dribble(ref decisions[0], mission.TeamsRef[teamId].Fishes[0], dest, -90, 30, 14, 100, 6, 4, 15, 100, false); | |
if (fishPm0.X < 200) | |
{ | |
stillState = 2; | |
} | |
} | |
if (stillState == 2) | |
{ | |
this.decisions[0].TCode = 10; | |
this.decisions[0].VCode = 1; | |
if (fish0.BodyDirectionRad > (-Math.PI / 9 * 5) && fish0.BodyDirectionRad < (-Math.PI / 5 * 2)) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 0; | |
stillState = 3; | |
} | |
} | |
if (stillState == 3) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 0; | |
if (stillState_up == 1) | |
{ | |
if (fish0.PolygonVertices[0].Z > -920) | |
{ | |
this.decisions[0].VCode = 3; | |
} | |
else | |
{ | |
stillState_up = 0; | |
} | |
} | |
} | |
Console.WriteLine("DirRad: {0:f}", fish0.BodyDirectionRad); | |
Console.WriteLine("stillState: {0:d}", stillState); | |
/* | |
xna.Vector3 length1 = fishPm0 - position6; | |
if (fish0.BodyDirectionRad > (-Math.PI / 2) && fish0.BodyDirectionRad < (-Math.PI / 3) && fishPm0.X < 650 && length1.Length() < 100) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 0; | |
} | |
*/ | |
} | |
} | |
if (no == 2) | |
{ | |
if (fish0.BodyDirectionRad > (-Math.PI / 2) && fish0.BodyDirectionRad < (-Math.PI / 3)) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 0; | |
} | |
if (fishPm0.Z > -650) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 3; | |
} | |
} | |
if (no == 3) | |
{ | |
actFast(0, position7, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
if (fishPm0.Z > 600 && fishPm0.X > 0)//使鱼静止 | |
{ | |
this.decisions[0].TCode = 9; | |
this.decisions[0].VCode = 1; | |
if (fish0.BodyDirectionRad > Math.PI / 2 && fish0.BodyDirectionRad < Math.PI) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 0; | |
} | |
} | |
if (ballsPm.Z < 350 && ballsPm.Z > -50) | |
{ | |
actFast(0, position8, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[0].BodyDirectionRad); | |
} | |
if (fishPm0.Z > 600 && fishPm0.X < -100)//使鱼静止 | |
{ | |
this.decisions[0].TCode = 9; | |
this.decisions[0].VCode = 1; | |
if (fish0.BodyDirectionRad > 2.1 && fish0.BodyDirectionRad < 3.0) | |
{ | |
this.decisions[0].TCode = 7; | |
this.decisions[0].VCode = 0; | |
} | |
} | |
if (ballsPm.Z < 0) | |
{ | |
number_act(0, 5, fishPm0, ballsPm, fish0, finish_place6); | |
} | |
if (ballsPm.Z < -600) | |
{ | |
number_act(0, 6, fishPm0, ballsPm, fish0, finish_place8); | |
} | |
} | |
if (no == 4) | |
{ | |
// number_act(0, 6, fishPm0, ballsPm, fish0, finish_place8); | |
number_act(0, 3, fishPm0, ballsPm, fish0, finish_place7); | |
} | |
#endregion | |
#region 控制fish1 | |
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// | |
//if (time > 5850) | |
//{ | |
// this.decisions[1].TCode = 7; | |
// this.decisions[1].VCode = 0; | |
//} | |
fish1_still_flag = 0; | |
if (fish1_still_flag == 1) | |
{ | |
this.decisions[1].TCode = 7; | |
this.decisions[1].VCode = 0; | |
if (fish0.PositionMm.X > -600)// && fish0.PositionMm.Z > -800) | |
{ | |
fish1_still_flag = 0; | |
} | |
} | |
else | |
{ | |
if (no == 1) | |
{ | |
if (f11 == false) | |
{ | |
/* | |
if (fishPm1.X < -750) | |
{ | |
actFast(1, position1, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
} | |
if (fishPm1.X > -750 && fishPm1.X < -30) | |
{ | |
actFast(1, position2, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
} | |
if (fishPm1.X > -30 && fishPm1.X < 650) | |
{ | |
actFast(1, position3, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
}*/ | |
if (CheckZone(mission.TeamsRef[0].Fishes[1].PositionMm) == 1) | |
{ | |
goalDest1 = new xna.Vector3(1000f, 0f, 700f); | |
StrategyHelper.Helpers.PoseToPose(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], goalDest1, pi / 2, 30.0f, 150f, mission.CommonPara.MsPerCycle, ref times); | |
//StrategyHelper.Helpers.Dribble(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], goalDest0, pi/2, 5, 10, 150f, 4, 6, 15, mission.CommonPara.MsPerCycle, false); | |
checkFish2FishCollision(mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[0].PositionMm, mission.TeamsRef[teamId].Fishes[1].CollisionModelRadiusMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad, ref decisions[1]); | |
} | |
else | |
{ | |
if (((mission.TeamsRef[0].Fishes[0].PositionMm.X - mission.TeamsRef[0].Fishes[1].PositionMm.X) * (mission.TeamsRef[0].Fishes[0].PositionMm.X - mission.TeamsRef[0].Fishes[1].PositionMm.X) + (mission.TeamsRef[0].Fishes[0].PositionMm.Z - mission.TeamsRef[0].Fishes[1].PositionMm.Z) * (mission.TeamsRef[0].Fishes[0].PositionMm.Z - mission.TeamsRef[0].Fishes[1].PositionMm.Z)) < 390 * 390) | |
{ | |
//Console.WriteLine("Fish 2"); | |
//Console.WriteLine((mission.TeamsRef[0].Fishes[0].PositionMm.X - mission.TeamsRef[0].Fishes[1].PositionMm.X) * (mission.TeamsRef[0].Fishes[0].PositionMm.X - mission.TeamsRef[0].Fishes[1].PositionMm.X) + (mission.TeamsRef[0].Fishes[0].PositionMm.Z - mission.TeamsRef[0].Fishes[1].PositionMm.Z) * (mission.TeamsRef[0].Fishes[0].PositionMm.Z - mission.TeamsRef[0].Fishes[1].PositionMm.Z)); | |
decisions[1].TCode = 7; | |
decisions[1].VCode = 0; | |
} | |
else | |
{ | |
//Console.WriteLine("Fish 2"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].PositionMm); | |
if (mission.TeamsRef[0].Fishes[1].PositionMm.X < -616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z > -500) | |
{ | |
//Console.WriteLine("stage 1"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > -1.5 && mission.TeamsRef[0].Fishes[1].BodyDirectionRad < 1.7) | |
{ | |
decisions[1].TCode = 0; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn left"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad >= 1.7 || mission.TeamsRef[0].Fishes[1].BodyDirectionRad < -1.9) | |
{ | |
decisions[1].TCode = 14; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn right"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
//Console.WriteLine("go straight"); | |
decisions[1].TCode = 7; | |
decisions[1].VCode = 14; | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[1].PositionMm.X < 0 && mission.TeamsRef[0].Fishes[1].PositionMm.X > -616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z < -700 || mission.TeamsRef[0].Fishes[1].PositionMm.X < -616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z < -500) | |
{ | |
//Console.WriteLine("stage 2"); | |
decisions[1].TCode = 14; | |
decisions[1].VCode = 14; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].PositionMm.X < 0 && mission.TeamsRef[0].Fishes[1].PositionMm.Z < 500) | |
{ | |
//Console.WriteLine("stage 3"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > -1.7 && mission.TeamsRef[0].Fishes[1].BodyDirectionRad < 1.5) | |
{ | |
decisions[1].TCode = 14; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > 1.9 || mission.TeamsRef[0].Fishes[1].BodyDirectionRad <= -1.7) | |
{ | |
decisions[1].TCode = 0; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn left"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
//Console.WriteLine("go straight"); | |
decisions[1].TCode = 7; | |
decisions[1].VCode = 14; | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[1].PositionMm.X > -616 && mission.TeamsRef[0].Fishes[1].PositionMm.X < 0 && mission.TeamsRef[0].Fishes[1].PositionMm.Z > 500 || mission.TeamsRef[0].Fishes[1].PositionMm.X > 0 && mission.TeamsRef[0].Fishes[1].PositionMm.X < 616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z > 700) | |
{ | |
//Console.WriteLine("stage 4"); | |
decisions[1].TCode = 0; | |
decisions[1].VCode = 14; | |
//Console.WriteLine("turn left"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].PositionMm.X < 616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z > -500) | |
{ | |
//Console.WriteLine("stage 5"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > -1.5 && mission.TeamsRef[0].Fishes[1].BodyDirectionRad < 1.5) | |
{ | |
decisions[1].TCode = 0; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn left"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > 1.9 || mission.TeamsRef[0].Fishes[1].BodyDirectionRad < -1.9) | |
{ | |
decisions[1].TCode = 14; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn right"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
decisions[1].TCode = 7; | |
decisions[1].VCode = 14; | |
//Console.WriteLine("go straight"); | |
} | |
} | |
else if (mission.TeamsRef[0].Fishes[1].PositionMm.X > 0 && mission.TeamsRef[0].Fishes[1].PositionMm.X < 616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z < -500 || mission.TeamsRef[0].Fishes[1].PositionMm.X > 616 && mission.TeamsRef[0].Fishes[1].PositionMm.Z < -700) | |
{ | |
//Console.WriteLine("stage 6"); | |
decisions[1].TCode = 14; | |
decisions[1].VCode = 14; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].PositionMm.Z < 0) | |
{ | |
//Console.WriteLine("stage 7"); | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > -1.5 && mission.TeamsRef[0].Fishes[1].BodyDirectionRad < 1.5) | |
{ | |
decisions[1].TCode = 14; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn right"); | |
} | |
else if (mission.TeamsRef[0].Fishes[1].BodyDirectionRad > 1.9 || mission.TeamsRef[0].Fishes[1].BodyDirectionRad < -1.9) | |
{ | |
decisions[1].TCode = 0; | |
decisions[1].VCode = 5; | |
//Console.WriteLine("turn left"); | |
} | |
else | |
{ | |
//Console.WriteLine(mission.TeamsRef[0].Fishes[1].BodyDirectionRad); | |
decisions[1].TCode = 7; | |
decisions[1].VCode = 14; | |
//Console.WriteLine("go straight"); | |
} | |
} | |
} | |
} | |
if (fishPm1.X >= 650) | |
{ | |
actSlow(1, position5, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
if (fish0.PolygonVertices[0].X > 1100) | |
{ | |
// actFast(1, position4, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
StrategyHelper.Helpers.PoseToPose(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], position4, (float)Math.Atan((position4.Z - fishPm1.Z) / (position4.X - fishPm1.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
} | |
if (fishPm1.Z > 0) | |
{ | |
this.decisions[1].VCode = 1; | |
this.decisions[1].TCode = 2; | |
if (fish1.BodyDirectionRad > (-Math.PI / 2) && fish1.BodyDirectionRad < (-Math.PI / 3)) | |
{ | |
this.decisions[1].VCode = 0; | |
this.decisions[1].TCode = 7; | |
} | |
} | |
if (fishPm0.Z < -200 && f01 == true) | |
{ | |
number_act(1, 1, fishPm1, ballsPm, fish1, finish_placep2); | |
} | |
} | |
} | |
else | |
{ | |
//number_act(1, 1, fishPm1, ballsPm, fish1, finish_placep2); | |
//if (ballsPm.Z < -600 && ballsPm.Z > -660) | |
//{ | |
// number_act(1, 2, fishPm1, ballsPm, fish1, finish_placep1); | |
//} | |
//if (ballsPm.Z < -660 || ballsPm.X < 750) | |
//{ | |
// number_act(1, 2, fishPm1, ballsPm, fish1, mission.TeamsRef[teamId].Fishes[0].BodyPolygonVertices[3]); //原来是finish_placep3 | |
//} | |
if (upState == 0) | |
{ | |
number_act(1, 1, fishPm1, ballsPm, fish1, finish_placep2); | |
if (ballsPm.Z < -660)// && ballsPm.Z > -660) | |
{ | |
upState = 1; | |
} | |
} | |
if (upState == 1) | |
{ | |
number_act(1, 2, fishPm1, ballsPm, fish1, finish_placep1); | |
//if (ballsPm.Z < -660 || ballsPm.X < 750) | |
if (ballsPm.X < 750) | |
{ | |
upState = 2; | |
} | |
} | |
if (upState == 2) | |
{ | |
number_act(1, 2, fishPm1, ballsPm, fish1, mission.TeamsRef[teamId].Fishes[0].BodyPolygonVertices[3]); //原来是finish_placep3 | |
} | |
} | |
} | |
if (no == 2) | |
{ | |
number_act(1, 2, fishPm1, ballsPm, fish1, mission.TeamsRef[teamId].Fishes[0].BodyPolygonVertices[3]); //原来是finish_placep3 | |
if (f02 == true) | |
{ | |
//if (ballsPm.Z < 350) | |
//{ | |
// Console.WriteLine("第1个"); | |
// number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep4); | |
//} | |
//else if (ballsPm.Z < 660)// || ballsPm.Z >= 660 && ballsPm.X >= 30) | |
//{ | |
// Console.WriteLine("第2个"); | |
// number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep5); | |
//} | |
//else if (ballsPm.Z >= 660)// && ballsPm.X < 30) | |
//{ | |
// Console.WriteLine("第3个"); | |
// xna.Vector3 tmp = new xna.Vector3(ballsPm.X - 50, 0, ballsPm.Z); | |
// number_act(1, 4, fishPm1, ballsPm, fish1, tmp);//finish_placep6); | |
// /* if (ballsPm.Z - fishPm1.Z >= 100) | |
// { | |
// times = 100; | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], position11, (float)Math.Atan((position11.Z - fishPm1.Z) / (position11.X - fishPm1.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
// } | |
// else | |
// { | |
// number_act(1, 4, fishPm1, ballsPm, fish1, finish_place4); | |
// }*/ | |
//} | |
if (downState == 0) | |
{ | |
if (ballsPm.Z < 350) | |
{ | |
//Console.WriteLine("第1个"); | |
number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep4); | |
} | |
else | |
{ | |
downState = 1; | |
} | |
} | |
if (downState == 1) | |
{ | |
if (ballsPm.Z < 660 || ballsPm.Z >= 660 && ballsPm.X >= 10) | |
{ | |
//Console.WriteLine("第2个"); | |
number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep5); | |
} | |
else | |
{ | |
downState = 2; | |
} | |
} | |
if (downState == 2) | |
{ | |
xna.Vector3 tmp = new xna.Vector3(ballsPm.X - 50, 0, ballsPm.Z); | |
number_act(1, 4, fishPm1, ballsPm, fish1, tmp); | |
} | |
//if (ballsPm.Z < 350) | |
//{ | |
// number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep4); | |
//} | |
//else if (ballsPm.Z < 660) | |
//{ | |
// xna.Vector3 tmp = new xna.Vector3(0, 0, 700); | |
// number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep5); | |
//} | |
//else | |
//{ | |
// xna.Vector3 tmp = new xna.Vector3(ballsPm.X - 50, 0, ballsPm.Z); | |
// number_act(1, 4, fishPm1, ballsPm, fish1, tmp); | |
//} | |
} | |
} | |
if (no == 3) | |
{ | |
/* | |
number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep7); | |
if (ballsPm.X > -80 && ballsPm.Z > 630) | |
{ | |
number_act(1, 3, fishPm1, ballsPm, fish1, finish_placep7); | |
} | |
if (ballsPm.Z < 600 && ballsPm.Z > 200) | |
{ | |
number_act(1, 7, fishPm1, ballsPm, fish1, finish_placep8); | |
} | |
if (ballsPm.Z < 200 && ballsPm.Z > -200) | |
{ | |
number_act(1, 7, fishPm1, ballsPm, fish1, finish_placep9); | |
} | |
*/ | |
xna.Vector3 tmp = new xna.Vector3(ballsPm.X - 40, 0, ballsPm.Z); | |
number_act(1, 3, fishPm1, ballsPm, fish1, tmp); | |
if (ballsPm.X < -460)// && fish1.PolygonVertices[0].X > -480) | |
{ | |
//xna.Vector3 tmp1 = new xna.Vector3(-600, 0, 1000);// ballsPm.Z + 70); | |
xna.Vector3 tmp1 = new xna.Vector3(-600, 0, (ballsPm.Z > 800 ? 1000 : ballsPm.Z + 200)); | |
actSlow(1, tmp1, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
} | |
if (fish1.PolygonVertices[0].X <= -550 && ballsPm.Z >= -600) | |
{ | |
//Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); | |
int i = 1; | |
xna.Vector3 fp = mission.TeamsRef[teamId].Fishes[i].PositionMm; // fish position | |
float dir_x = -150f; | |
float dir_z = dir_x / (float)Math.Sqrt(8); | |
xna.Vector3 dir = new xna.Vector3(dir_x, 0f, dir_z); | |
xna.Vector3 targetPoint = fp + dir; | |
float targetDirection = -(float)Math.PI / 6 * 5; | |
StrategyHelper.Helpers.Dribble( | |
ref decisions[i], mission.TeamsRef[teamId].Fishes[i], targetPoint, targetDirection, 5, 10, 150, 14, 7, 15, 100, true | |
); | |
} | |
if (ballsPm.Z < -600) | |
{ | |
// this.decisions[1].TCode = 6; | |
// this.decisions[1].VCode = 6; | |
actFast(1, position10, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
} | |
if (fishPm1.X < -750) | |
{ | |
actFast(1, position11, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
} | |
} | |
if (no == 4) | |
{ | |
xna.Vector3 length2 = position11 - fishPm1; | |
if (stillState == 3) | |
{ | |
if (length2.Length() > 60) | |
{ | |
//actFast(1, position11, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
actSlow(1, position11, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
// StrategyHelper.Helpers.PoseToPose(ref decisions[1], mission.TeamsRef[teamId].Fishes[1], position11, (float)Math.Atan((position11.Z - fishPm1.Z) / (position11.X - fishPm1.X)), 30.0f, 40, mission.CommonPara.MsPerCycle, ref times); | |
} | |
else | |
{ | |
stillState = 4; | |
} | |
} | |
else if (stillState == 4) //旋转到指定角度 | |
{ | |
//if (fish1.BodyDirectionRad > -Math.PI / 2 && fish1.BodyDirectionRad < -1.06 && length2.Length() < 60) | |
if (fish1.BodyDirectionRad > -Math.PI / 4 * 3 && fish1.BodyDirectionRad < -Math.PI / 3 * 2) | |
{ | |
stillState = 5; | |
} | |
else | |
{ | |
this.decisions[1].VCode = 1; | |
this.decisions[1].TCode = 0; | |
} | |
} | |
else if (stillState == 5) | |
{ | |
if (ballsPm.Z > -200) | |
{ | |
stillState = 6; | |
} | |
else | |
{ | |
this.decisions[1].VCode = 0; | |
this.decisions[1].TCode = 7; | |
} | |
} | |
else if (stillState == 6) | |
{ | |
//number_act(1, 3, fishPm1, ballsPm, fish1, finish_place7); | |
number_act(1, 3, fishPm1, ballsPm, fish1, new xna.Vector3(ballsPm.X - 30, 0, ballsPm.Z)); | |
} | |
/* if (ballsPm.Z < -600) | |
{ | |
actFast(1, position10, mission.TeamsRef[teamId].Fishes[1].PositionMm, mission.TeamsRef[teamId].Fishes[1].BodyDirectionRad); | |
} | |
if (fish1.BodyDirectionRad > -Math.PI / 2 && fish1.BodyDirectionRad < -1.06) | |
{ | |
this.decisions[1].VCode = 0; | |
this.decisions[1].TCode = 7; | |
} | |
if (f14 == true) | |
{ | |
this.decisions[1].VCode = 1; | |
this.decisions[1].TCode = 7; | |
}*/ | |
} | |
} | |
#endregion | |
#region final | |
if (mission.EnvRef.Balls[0].PositionMm.X <= -1264 && mission.EnvRef.Balls[0].PositionMm.Z >= -104 && !(f04 && f14)) | |
{ | |
decisions[0].TCode = 7; | |
decisions[0].VCode = 0; | |
} | |
#endregion | |
if (f04 && f14) | |
{ | |
decisions[0].TCode = 7; | |
decisions[0].VCode = 0; | |
} | |
return this.decisions; | |
} | |
public Decision actFast(int i, xna.Vector3 position, xna.Vector3 fishPm, double bodyDirectionRad)//找点 | |
{ | |
double x = fishPm.X; | |
double z = fishPm.Z; //鱼的刚体坐标 | |
double num11 = position.X; | |
double num12 = position.Z; | |
double num14 = Math.Atan((num12 - z) / (num11 - x));//刚体和目标点这条直线与x轴的角度正切值 | |
if ((num11 - x) < 0.0)//鱼在球的右侧 | |
{ | |
if (num14 > 0.0) | |
{ | |
num14 -= Math.PI; | |
} | |
else | |
{ | |
num14 += Math.PI; | |
} | |
} | |
double num15 = num14 - bodyDirectionRad; | |
if (num15 > Math.PI)//---------鱼实际要转过的角度取最优法 | |
{ | |
num15 -= Math.PI * 2; | |
} | |
else if (num15 < -Math.PI) | |
{ | |
num15 += Math.PI * 2; | |
} | |
double juli = Math.Sqrt(Math.Pow(x - num11, 2.0) + Math.Pow(z - num12, 2.0)); | |
if (num15 > 0) | |
{ | |
if (Math.Abs(num15) > 0.1 * Math.PI) | |
{ | |
decisions[i].TCode = 15; | |
decisions[i].VCode = 1; | |
} | |
else | |
{ | |
decisions[i].TCode = 7; | |
if (juli > 10) | |
{ | |
decisions[i].VCode = 15; | |
} | |
else | |
{ | |
decisions[i].VCode = 0; | |
} | |
} | |
} | |
if (num15 < 0) | |
{ | |
if (Math.Abs(num15) > 0.1 * Math.PI) | |
{ | |
decisions[i].TCode = 0; | |
decisions[i].VCode = 1; | |
} | |
else | |
{ | |
decisions[i].TCode = 7; | |
if (juli > 10) | |
{ | |
decisions[i].VCode = 15; | |
} | |
else | |
{ | |
decisions[i].VCode = 0; | |
} | |
} | |
} | |
return decisions[i]; | |
} | |
public Decision actSlow(int i, xna.Vector3 position, xna.Vector3 fishPm, double bodyDirectionRad)//找点 | |
{ | |
double x = fishPm.X; | |
double z = fishPm.Z; //鱼的刚体坐标 | |
double num11 = position.X; | |
double num12 = position.Z; | |
double num14 = Math.Atan((num12 - z) / (num11 - x));//刚体和目标点这条直线与x轴的角度正切值 | |
if ((num11 - x) < 0.0)//鱼在球的右侧 | |
{ | |
if (num14 > 0.0) | |
{ | |
num14 -= Math.PI; | |
} | |
else | |
{ | |
num14 += Math.PI; | |
} | |
} | |
double num15 = num14 - bodyDirectionRad; | |
if (num15 > Math.PI)//---------鱼实际要转过的角度取最优法 | |
{ | |
num15 -= Math.PI * 2; | |
} | |
else if (num15 < -Math.PI) | |
{ | |
num15 += Math.PI * 2; | |
} | |
double juli = Math.Sqrt(Math.Pow(x - num11, 2.0) + Math.Pow(z - num12, 2.0)); | |
if (num15 > 0) | |
{ | |
if (Math.Abs(num15) > 0.1 * Math.PI) | |
{ | |
decisions[i].TCode = 15; | |
decisions[i].VCode = 1; | |
} | |
else | |
{ | |
decisions[i].TCode = 7; | |
if (juli > 550) | |
{ | |
decisions[i].VCode = 12; | |
} | |
if (juli > 350 && juli < 550) | |
{ | |
decisions[i].VCode = 9; | |
} | |
if (juli > 150 && juli < 350) | |
{ | |
decisions[i].VCode = 8; | |
} | |
if (juli > 50 && juli < 150) | |
{ | |
decisions[i].VCode = 7; | |
} | |
if (juli < 50) | |
{ | |
decisions[i].VCode = 0; | |
} | |
} | |
} | |
if (num15 < 0) | |
{ | |
if (Math.Abs(num15) > 0.1 * Math.PI) | |
{ | |
decisions[i].TCode = 0; | |
decisions[i].VCode = 1; | |
} | |
else | |
{ | |
decisions[i].TCode = 7; | |
if (juli > 550) | |
{ | |
decisions[i].VCode = 12; | |
} | |
if (juli > 350 && juli < 550) | |
{ | |
decisions[i].VCode = 9; | |
} | |
if (juli > 150 && juli < 350) | |
{ | |
decisions[i].VCode = 8; | |
} | |
if (juli > 50 && juli < 150) | |
{ | |
decisions[i].VCode = 7; | |
} | |
if (juli < 50) | |
{ | |
decisions[i].VCode = 0; | |
} | |
} | |
} | |
return decisions[i]; | |
} | |
public Decision number_act(int i, int j, xna.Vector3 fishPm, xna.Vector3 ballsPm, RoboFish fish, xna.Vector3 finish_place) | |
{ | |
double xg = finish_place.X; | |
double zg = finish_place.Z;//终点位置 | |
double r = 58.0; | |
double x = fishPm.X; | |
double z = fishPm.Z; //鱼的刚体坐标 | |
double num6 = ballsPm.X; | |
double num7 = ballsPm.Z; //球心坐标 | |
double d = Math.Atan((zg - num7) / (xg - num6));//球心到目标点这条直线和x轴的角度正切值 | |
if ((xg - num6) < 0.0)//目标点位于球心左侧 | |
{ | |
if (d > 0.0) | |
{ | |
d -= Math.PI; | |
} | |
else | |
{ | |
d += Math.PI; | |
} | |
} | |
float targetDirection = (float)d; | |
double num0 = ballsPm.X + (Math.Sqrt(3) * r * Math.Sin(d)); | |
double num1 = ballsPm.Z - (Math.Sqrt(3) * r * Math.Cos(d)); | |
double num2 = ballsPm.X - (Math.Sqrt(3) * r * Math.Sin(d)); | |
double num3 = ballsPm.Z + (Math.Sqrt(3) * r * Math.Cos(d)); | |
double num11 = num6 - (r * Math.Cos(d)); | |
double num12 = num7 - (r * Math.Sin(d));//找到击球点---延长线上 | |
double num13 = num6 + (r * Math.Cos(d)); | |
double num14 = num7 + (r * Math.Sin(d)); | |
double len1 = Math.Sqrt(Math.Pow(x - num11, 2.0) + Math.Pow(z - num12, 2.0)); | |
double len2 = Math.Sqrt(Math.Pow(x - num13, 2.0) + Math.Pow(z - num14, 2.0)); | |
if (len1 < len2) | |
{ | |
xna.Vector3 targetPoint = new xna.Vector3((float)num11, 0f, (float)num12); | |
switchDribble(i, j, fish, targetPoint, targetDirection, true); | |
} | |
else | |
{ | |
double len3 = Math.Sqrt(Math.Pow(x - num0, 2.0) + Math.Pow(z - num1, 2.0)); | |
double len4 = Math.Sqrt(Math.Pow(x - num2, 2.0) + Math.Pow(z - num3, 2.0)); | |
if (len3 > len4) | |
{ | |
xna.Vector3 targetPoint = new xna.Vector3((float)num2, 0f, (float)num3); | |
switchDribble(i, j, fish, targetPoint, targetDirection, true); | |
} | |
else | |
{ | |
xna.Vector3 targetPoint = new xna.Vector3((float)num0, 0f, (float)num1); | |
switchDribble(i, j, fish, targetPoint, targetDirection, true); | |
} | |
} | |
return decisions[i]; | |
} | |
public Decision switchDribble(int i, int j, RoboFish fish, xna.Vector3 targetPoint, float targetDirection, bool flag) | |
{ | |
switch (j) | |
{ | |
case 1: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 4, 4, 200, 11, 4, 10, 100, flag); break;//1 | |
case 2: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 5, 3, 120, 3, 9, 6, 100, flag); break; //2 | |
case 3: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 6, 4, 200, 10, 5, 10, 100, flag); break;//3 | |
case 4: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 4, 4, 200, 10, 4, 10, 100, flag); break;//4 | |
case 5: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 6, 4, 200, 10, 5, 10, 100, flag); break;//5 | |
case 6: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 4, 4, 200, 10, 4, 10, 100, flag); break;//6 | |
case 7: StrategyHelper.Helpers.Dribble(ref decisions[i], fish, targetPoint, targetDirection, 10, 4, 200, 10, 8, 10, 100, flag); break;//快 | |
default: break; | |
} | |
return decisions[i]; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment