public static int CalcCost(int startCoord, int endCoord, int enemyCoord) { if (FastCoord.Distance(startCoord, endCoord) < FastCoord.Distance(enemyCoord, endCoord)) { return(0); } var startX = FastCoord.GetX(startCoord); var startY = FastCoord.GetY(startCoord); var endX = FastCoord.GetX(endCoord); var endY = FastCoord.GetY(endCoord); var deltaX = endX - startX; var deltaY = endY - startY; var enemyDist = int.MaxValue; for (int i = 1; i < 10; i++) { var x = startX + deltaX * i / 10; var y = startY + deltaY * i / 10; var dist = FastCoord.Distance(enemyCoord, FastCoord.Create(x, y)); if (dist < enemyDist) { enemyDist = dist; } } if (enemyDist >= costs.Length) { return(0); } return(costs[enemyDist]); }
private void RunOrSuicide(TurnState turnState) { if (turnState.myShips.Max(s => s.rum) > turnState.enemyShips.Max(s => s.rum) || turnState.myShips.Min(s => s.rum) > 50) { foreach (var ship in turnState.myShips) { StrategicDecision prevDecision; strateg.decisions.TryGetValue(ship.id, out prevDecision); strateg.decisions[ship.id] = strateg.RunAway(turnState, ship, prevDecision); } return; } if (turnState.myShips.Count == 1) { var ship = turnState.myShips[0]; StrategicDecision prevDecision; strateg.decisions.TryGetValue(ship.id, out prevDecision); strateg.decisions[ship.id] = strateg.RunAway(turnState, ship, prevDecision); return; } var ship1 = turnState.myShips[0]; var ship2 = turnState.myShips[1]; if (ship1.rum > ship2.rum) { var tmp = ship1; ship1 = ship2; ship2 = tmp; } if (FastCoord.Distance(ship1.fbow, ship2.fbow) <= 4) { StrategicDecision prevDecision; strateg.decisions.TryGetValue(ship1.id, out prevDecision); if (prevDecision?.role == StrategicRole.Fire || prevDecision?.role == StrategicRole.Explicit) { strateg.decisions[ship1.id] = new StrategicDecision { role = StrategicRole.Explicit, explicitCommand = ShipMoveCommand.Slower }; strateg.decisions[ship2.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = prevDecision.fireToCoord }; } else { var nextShip1Position = FastShipPosition.GetFinalPosition(FastShipPosition.Move(ship1.fposition, ShipMoveCommand.Wait)); nextShip1Position = FastShipPosition.GetFinalPosition(FastShipPosition.Move(nextShip1Position, ShipMoveCommand.Slower)); strateg.decisions[ship1.id] = new StrategicDecision { role = StrategicRole.Fire, fireToCoord = FastShipPosition.Coord(nextShip1Position) }; strateg.decisions[ship2.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = FastShipPosition.Coord(nextShip1Position) }; } } else { var x = (FastCoord.GetX(ship1.fcoord) + FastCoord.GetX(ship2.fcoord)) / 2; var y = (FastCoord.GetY(ship1.fcoord) + FastCoord.GetY(ship2.fcoord)) / 2; if (x < 5) { x = 5; } if (x > Constants.MAP_WIDTH - 6) { x = Constants.MAP_WIDTH - 6; } if (y < 5) { y = 5; } if (y > Constants.MAP_HEIGHT - 6) { x = Constants.MAP_HEIGHT - 6; } strateg.decisions[ship1.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = FastCoord.Create(x, y) }; strateg.decisions[ship2.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = FastCoord.Create(x, y) }; } }
public void MakeStrategicDecisions(TurnState turnState) { if (turnState.barrels.Any()) { strateg.MakeStandardStrategicDecisions(turnState); return; } if (turnState.myShips.Max(s => s.rum) > turnState.enemyShips.Max(s => s.rum) || turnState.myShips.Min(s => s.rum) > 50) { foreach (var ship in turnState.myShips) { StrategicDecision prevDecision; strateg.decisions.TryGetValue(ship.id, out prevDecision); strateg.decisions[ship.id] = strateg.RunAway(turnState, ship, prevDecision); } return; } if (turnState.myShips.Count == 1) { var ship = turnState.myShips[0]; StrategicDecision prevDecision; strateg.decisions.TryGetValue(ship.id, out prevDecision); strateg.decisions[ship.id] = strateg.RunAway(turnState, ship, prevDecision); return; } var maxRum = turnState.myShips.Max(s => s.rum); var minRum = turnState.myShips.Min(s => s.rum); var ship1 = turnState.myShips.First(s => s.rum == minRum); var ship2 = turnState.myShips.Last(s => s.rum == maxRum); var last = turnState.myShips.FirstOrDefault(s => s != ship1 && s != ship2); if (last != null) { StrategicDecision prevDecision; strateg.decisions.TryGetValue(last.id, out prevDecision); strateg.decisions[last.id] = strateg.RunAway(turnState, last, prevDecision); } if (FastCoord.Distance(ship1.fbow, ship2.fbow) <= 4) { StrategicDecision prevDecision; strateg.decisions.TryGetValue(ship1.id, out prevDecision); if (prevDecision?.role == StrategicRole.Fire || prevDecision?.role == StrategicRole.Explicit) { strateg.decisions[ship1.id] = new StrategicDecision { role = StrategicRole.Explicit, explicitCommand = ShipMoveCommand.Slower }; strateg.decisions[ship2.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = prevDecision.fireToCoord }; } else { var nextShip1Position = FastShipPosition.GetFinalPosition(FastShipPosition.Move(ship1.fposition, ShipMoveCommand.Wait)); nextShip1Position = FastShipPosition.GetFinalPosition(FastShipPosition.Move(nextShip1Position, ShipMoveCommand.Slower)); strateg.decisions[ship1.id] = new StrategicDecision { role = StrategicRole.Fire, fireToCoord = FastShipPosition.Coord(nextShip1Position) }; strateg.decisions[ship2.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = FastShipPosition.Coord(nextShip1Position) }; } } else { var x = (FastCoord.GetX(ship1.fcoord) + FastCoord.GetX(ship2.fcoord)) / 2; var y = (FastCoord.GetY(ship1.fcoord) + FastCoord.GetY(ship2.fcoord)) / 2; if (x < 5) { x = 5; } if (x > Constants.MAP_WIDTH - 6) { x = Constants.MAP_WIDTH - 6; } if (y < 5) { y = 5; } if (y > Constants.MAP_HEIGHT - 6) { x = Constants.MAP_HEIGHT - 6; } strateg.decisions[ship1.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = FastCoord.Create(x, y) }; strateg.decisions[ship2.id] = new StrategicDecision { role = StrategicRole.Approach, targetCoord = FastCoord.Create(x, y) }; } }
public void Fire(int fastCoord) { Console.WriteLine($"FIRE {FastCoord.GetX(fastCoord)} {FastCoord.GetY(fastCoord)} FIRE {FastCoord.GetX(fastCoord)} {FastCoord.GetY(fastCoord)}"); }