Class AbstractAI

java.lang.Object
net.sf.colossus.ai.AbstractAI
All Implemented Interfaces:
AI
Direct Known Subclasses:
SimpleAI

public abstract class AbstractAI extends Object implements AI
Abstract implementation of the Colossus AI interface. This class should hold most of the helper functions. Ideally, most (all) "data-gathering" functions from the AIs should be here, mostly as "final protected". AIs should mostly only use information gathered from here to make decisions. There's still a LOT of work to do...
Author:
Romain Dolbeau Also contains extracted code from SimpleAI:, Bruce Sherrod, David Ripton, Romain Dolbeau Also contains extracted code from RationalAI:, Bruce Sherrod, David Ripton, Romain Dolbeau, Corwin Joy
  • Field Details

    • LOGGER

      private static final Logger LOGGER
    • bec

      public final BattleEvalConstants bec
    • cvc

      protected final AbstractAI.CreatureValueConstants cvc
    • client

      protected final Client client
      The Client we're working for.
    • variant

      protected Variant variant
    • random

      protected final Random random
      Our random source.
    • hintSectionUsed

      protected List<IVariantHint.AIStyle> hintSectionUsed
      For the Oracle Hint stuff, the play style we use. This can be replaced by AI implementation.
    • duplicateHexChecker

      private final Set<BattleHex> duplicateHexChecker
      Set of hex name, to check for duplicates. I assume the reason it is a class variable and not a local variable inside the function is performance (avoiding creation/recreation).
  • Constructor Details

    • AbstractAI

      protected AbstractAI(Client client)
  • Method Details

    • setVariant

      public void setVariant(Variant v)
      Specified by:
      setVariant in interface AI
    • getVariantRecruitHint

      public final CreatureType getVariantRecruitHint(LegionClientSide legion, MasterHex hex, List<CreatureType> recruits)
      Specified by:
      getVariantRecruitHint in interface AI
    • buildEnemyAttackMap

      protected final Map<MasterHex,List<Legion>>[] buildEnemyAttackMap(Player player)
      arrays and generics don't work well together -- TODO replace the array with a list or model some intermediate classes
    • getNumberOfWaysToTerrain

      protected final int getNumberOfWaysToTerrain(Legion legion, MasterHex hex, String terrainTypeName)
    • doesSetContainHexWithTerrain

      private final boolean doesSetContainHexWithTerrain(Set<MasterHex> set, String terrainTypeName)
    • findStrikeMap

      public final Map<BattleHex,Integer> findStrikeMap()
      Return a map of target hex label to number of friendly creatures that can strike it
    • generateDamageMap

      protected final Map<BattleCritter,Double> generateDamageMap()
      Create a map containing each target and the number of hits it would likely take if all possible creatures attacked it.
    • getInitialSplitHint

      protected final List<CreatureType> getInitialSplitHint(MasterHex hex)
      Return which creature the variant suggest splitting at turn 1 when starting in a specific hex.
      Parameters:
      hex - The masterboard hex where the split occurs.
      Returns:
      The List of Creaturetype to split.
    • getKillValue

      public int getKillValue(BattleCritter battleCritter, MasterBoardTerrain terrain)
      Get the 'kill value' of a creature on a specific terrain.
      Parameters:
      battleCritter - The BattleCritter whose value is requested.
      terrain - The terrain on which the value is requested, or null.
      Returns:
      The 'kill value' value of the critter, on terrain if non-null
    • getKillValue

      protected int getKillValue(CreatureType creature)
      Get the 'kill value' of a creature on an unspecified terrain.
      Parameters:
      creature - The CreatureType whose value is requested.
      Returns:
      The 'kill value' value of creature.
    • getKillValue

      private int getKillValue(CreatureType creature, MasterBoardTerrain terrain)
      Get the 'kill value' of a creature on a specific terrain.
      Parameters:
      creature - The CreatureType whose value is requested.
      terrain - The terrain on which the value is requested, or null
      Returns:
      The 'kill value' value of chit, on terrain if non-null
    • getAcqStepValue

      protected int getAcqStepValue()
      Shortcut to ask for the acquirables basic value from the variant
    • couldRecruitUp

      protected final boolean couldRecruitUp(Legion legion, MasterHex hex, Legion enemy)
      Return true if the legion could recruit or acquire something better than its worst creature in hexLabel.
    • getHintedRecruitmentValueNonTitan

      public int getHintedRecruitmentValueNonTitan(CreatureType creature)
    • getHintedRecruitmentValueNonTitan

      public int getHintedRecruitmentValueNonTitan(CreatureType creature, List<IVariantHint.AIStyle> styles)
    • getHintedRecruitmentValue

      protected final int getHintedRecruitmentValue(CreatureType creature, Legion legion, List<IVariantHint.AIStyle> styles)
    • isHumanLegion

      protected final boolean isHumanLegion(Legion legion)
      Test whether a Legion belongs to a Human player
    • hasOpponentNativeCreature

      protected final boolean hasOpponentNativeCreature(HazardTerrain terrain)
    • rangeToClosestOpponent

      protected final int rangeToClosestOpponent(BattleHex hex)
    • generateLegionMoves

      protected final Collection<LegionMove> generateLegionMoves(List<List<CritterMove>> allCritterMoves, boolean forceAll)
      allCritterMoves is a List of sorted MoveLists. A MoveList is a sorted List of CritterMoves for one critter. Return a sorted List of LegionMoves. A LegionMove is a List of one CritterMove per mobile critter in the legion, where no two critters move to the same hex. This implementation try to build a near-exhaustive List of all possible moves. It will be fully exhaustive if forceAll is true. Otherwise, it will try to limit to a reasonable number (the exact algorithm is in nestForLoop)
    • nestForLoop

      private final void nestForLoop(int[] indexes, int level, List<List<CritterMove>> critterMoves, List<LegionMove> legionMoves, boolean forceAll)
      Private helper for generateLegionMoves If forceAll is true, generate all possible moves. Otherwise, this function tries to limit the number of moves. This function uses an intermediate array of indexes (called and this is not a surprise, 'indexes') using recursion. The minimum number of try should be the level (level one is the most important creature and should always get his own favorite spot, higher levels need to be able to fall back on a not-so-good choice).
    • makeLegionMove

      public static final LegionMove makeLegionMove(int[] indexes, List<List<CritterMove>> critterMoves)
      critterMoves is a List of sorted MoveLists. indexes is a list of indexes, one per MoveList. This return a LegionMove, made of one CritterMove per MoveList. The CritterMove is selected by the index.
    • trimCritterMoves

      private final boolean trimCritterMoves(List<List<CritterMove>> allCritterMoves)
      Modify allCritterMoves in place, and return true if it changed.
    • initBattle

      public void initBattle()
      Description copied from interface: AI
      a Battle start
      Specified by:
      initBattle in interface AI
    • cleanupBattle

      public void cleanupBattle()
      Description copied from interface: AI
      a Battle is finished
      Specified by:
      cleanupBattle in interface AI
    • getBattleUnit

      protected BattleUnit getBattleUnit(BattleHex hex)
    • getBattleStrike

      public BattleStrike getBattleStrike()
    • countCreatureAccrossAllLegionFromPlayer

      public final int countCreatureAccrossAllLegionFromPlayer(Creature creature)
    • getCaretaker

      public Caretaker getCaretaker()
      Specified by:
      getCaretaker in interface AI