public void Move(Car self, World world, Game game, Move move) { double nextWaypointX = (self.NextWaypointX + 0.5) * game.TrackTileSize; double nextWaypointY = (self.NextWaypointY + 0.5) * game.TrackTileSize; Console.WriteLine (self.NextWaypointX + " " + self.NextWaypointY); double cornerTileOffset = 0.25D * game.TrackTileSize; switch (world.TilesXY [self.NextWaypointX] [self.NextWaypointY]) { case TileType.LeftTopCorner: nextWaypointX += cornerTileOffset; nextWaypointY += cornerTileOffset; break; case TileType.RightTopCorner: nextWaypointX -= cornerTileOffset; nextWaypointY += cornerTileOffset; break; case TileType.LeftBottomCorner: nextWaypointX += cornerTileOffset; nextWaypointY -= cornerTileOffset; break; case TileType.RightBottomCorner: nextWaypointX -= cornerTileOffset; nextWaypointY -= cornerTileOffset; break; } double angleToWaypoint = self.GetAngleTo (nextWaypointX, nextWaypointY); double speedModule = hypot (self.SpeedX, self.SpeedY); move.WheelTurn = (angleToWaypoint * 32.0D / System.Math.PI); move.EnginePower = (1.0D); if (speedModule > 30) move.EnginePower = 0; if (speedModule * speedModule * System.Math.Abs (angleToWaypoint) > 2.5D * 2.5D * System.Math.PI) { move.EnginePower = (0.0D); if (speedModule > 10) { move.IsBrake = true; if (angleToWaypoint > 0) move.WheelTurn = 1; else move.WheelTurn = -1; } } move.IsThrowProjectile = true; move.IsSpillOil = true; }
public void Move(Car self, World world, Game game, Move move) { double nextWaypointX = (self.NextWaypointX + 0.5D) * game.TrackTileSize; double nextWaypointY = (self.NextWaypointY + 0.5D) * game.TrackTileSize; double angleToWaypoint = self.GetAngleTo(nextWaypointX, nextWaypointY); if (backNumber < maxBackNumber) { backNumber++; move.WheelTurn = -oldAngle; move.EnginePower = -1; number = -100; return; } double speedModule = Math.Sqrt(self.SpeedX * self.SpeedX + self.SpeedY * self.SpeedY); if (Math.Abs(speedModule) < .05) number++; else number = 0; if (number > maxNumber) { backNumber = 0; number = 0; oldAngle = angleToWaypoint * 32.0D / Math.PI; } move.EnginePower = 1; if (Math.Abs(nextWaypointX - self.X) < 1600 && Math.Abs(nextWaypointY - self.Y) < 1600) { angleToWaypoint = AngelToWayPoint(self, world, game, move); move.IsBrake = IsUseBreak(self, world, game, move); } move.WheelTurn = angleToWaypoint * 32.0D / Math.PI; Console.WriteLine(String.Format("{0} - {1}", self.SpeedX, self.SpeedY)); move.IsUseNitro = IsUseNitro(self, world, game, move); move.IsThrowProjectile = IsThrow(self, world, game, move); move.IsSpillOil = IsSpillOil(self, world, game, move); veryOldTileType = oldTileType; oldTileType = world.TilesXY[self.NextWaypointX][self.NextWaypointY]; Console.WriteLine(speedModule); }
public void Move(Car self, World world, Game game, Move move) { if (stop) return; if (world.Tick == 0) { startX = self.X; startY = self.Y; prevX = self.X; prevY = self.Y; } move.EnginePower = 0; if (world.Tick > game.InitialFreezeDurationTicks) { double nextWaypointX = (self.NextWaypointX + 0.5D) * game.TrackTileSize; double nextWaypointY = (self.NextWaypointY + 0.5D) * game.TrackTileSize; double angleToWaypoint = self.GetAngleTo(nextWaypointX, nextWaypointY); double distToWaypoint = self.GetDistanceTo(nextWaypointX, nextWaypointY); double speedModule = Math.Sqrt(self.SpeedX * self.SpeedX + self.SpeedY * self.SpeedY); travelled += self.GetDistanceTo(prevX, prevY); travelled2 += self.GetDistanceTo(prevX, prevY); prevX = self.X; prevY = self.Y; move.EnginePower = 1; if (travelled > 1500) { move.EnginePower = 0; if (self.EnginePower == 0) { if (t == -10) { travelled2 = 0; Console.WriteLine("S: {0},{1} {2}", self.X, self.Y, self.SpeedY); t = 1; SimulatedControl ctrl = new SimulatedControl(); ctrl.enginePower = move.EnginePower; pos = simulator.Simulate(t, 1, self, world, game, ctrl); Console.WriteLine("P: {0},{1} {2}", pos.position.X, pos.position.Y, pos.speed.Y); } else if (t > 1) { t--; } else if (t == 1) { t--; Console.WriteLine("R: {0},{1} {2}", self.X, self.Y, self.SpeedY); Console.WriteLine("%: {0} / {1} ({2})", travelled2, self.GetDistanceTo(pos.position.X, pos.position.Y), 100 * self.GetDistanceTo(pos.position.X, pos.position.Y) / travelled2); } } } } }
private double AngelToWayPoint(Car self, World world, Game game, Move move) { double nextWaypointX = (self.NextWaypointX + 0.5D) * game.TrackTileSize; double nextWaypointY = (self.NextWaypointY + 0.5D) * game.TrackTileSize; double speedModule = Math.Sqrt(self.SpeedX * self.SpeedX + self.SpeedY * self.SpeedY); double max = .32D; double delta = speedModule / MaxSpeed; double cornerTileOffset = max * delta * game.TrackTileSize; switch (world.TilesXY[self.NextWaypointX][self.NextWaypointY]) { case TileType.LeftTopCorner: nextWaypointX += cornerTileOffset; nextWaypointY += cornerTileOffset; break; case TileType.RightTopCorner: nextWaypointX -= cornerTileOffset; nextWaypointY += cornerTileOffset; break; case TileType.LeftBottomCorner: nextWaypointX += cornerTileOffset; nextWaypointY -= cornerTileOffset; break; case TileType.RightBottomCorner: nextWaypointX -= cornerTileOffset; nextWaypointY -= cornerTileOffset; break; } return self.GetAngleTo(nextWaypointX, nextWaypointY); }
private bool IsThrow(Car self, World world, Game game, Move move) { int maxShootDistance = 1000; if (self.ProjectileCount <= 0) { return false; } foreach (Car c in world.Cars) { if (c.IsTeammate) { continue; } double enemyCarAngel = self.GetAngleTo(c.X, c.Y); Console.WriteLine(self.GetDistanceTo(c)); if (self.GetDistanceTo(c) > maxShootDistance) { continue; } if (Math.Abs(enemyCarAngel) < 0.1) { return true; } } return false; }