net.sf.colossus.ai
Class AbstractAI

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

public abstract class AbstractAI
extends java.lang.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

Nested Class Summary
protected  class AbstractAI.AbstractAIOracle
           
protected  class AbstractAI.CreatureValueConstants
          Various constants used by the AIs code for creature evaluation.
protected  class AbstractAI.MoveInfo
          little helper to store info about possible moves
 
Field Summary
 BattleEvalConstants bec
           
protected  Client client
          The Client we're working for.
protected  AbstractAI.CreatureValueConstants cvc
           
private  java.util.Set<BattleHex> duplicateHexChecker
          Set of hex name, to check for duplicates.
protected  java.util.List<IVariantHint.AIStyle> hintSectionUsed
          For the Oracle Hint stuff, the play style we use.
private static java.util.logging.Logger LOGGER
           
protected  java.util.Random random
          Our random source.
protected  Variant variant
           
 
Constructor Summary
protected AbstractAI(Client client)
           
 
Method Summary
protected  java.util.Map<MasterHex,java.util.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
 void cleanupBattle()
          a Battle is finished
protected  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.
 int countCreatureAccrossAllLegionFromPlayer(Creature creature)
           
private  boolean doesSetContainHexWithTerrain(java.util.Set<MasterHex> set, java.lang.String terrainTypeName)
           
 java.util.Map<BattleHex,java.lang.Integer> findStrikeMap()
          Return a map of target hex label to number of friendly creatures that can strike it
protected  java.util.Map<BattleCritter,java.lang.Double> generateDamageMap()
          Create a map containing each target and the number of hits it would likely take if all possible creatures attacked it.
protected  java.util.Collection<LegionMove> generateLegionMoves(java.util.List<java.util.List<CritterMove>> allCritterMoves, boolean forceAll)
          allCritterMoves is a List of sorted MoveLists.
protected  int getAcqStepValue()
          Shortcut to ask for the acquirables basic value from the variant
 BattleStrike getBattleStrike()
           
protected  BattleUnit getBattleUnit(BattleHex hex)
           
 Caretaker getCaretaker()
           
protected  int getHintedRecruitmentValue(CreatureType creature, Legion legion, java.util.List<IVariantHint.AIStyle> styles)
           
 int getHintedRecruitmentValueNonTitan(CreatureType creature)
           
 int getHintedRecruitmentValueNonTitan(CreatureType creature, java.util.List<IVariantHint.AIStyle> styles)
           
protected  java.util.List<CreatureType> getInitialSplitHint(MasterHex hex)
          Return which creature the variant suggest splitting at turn 1 when starting in a specific hex.
 int getKillValue(BattleCritter battleCritter, MasterBoardTerrain terrain)
          Get the 'kill value' of a creature on a specific terrain.
protected  int getKillValue(CreatureType creature)
          Get the 'kill value' of a creature on an unspecified terrain.
private  int getKillValue(CreatureType creature, MasterBoardTerrain terrain)
          Get the 'kill value' of a creature on a specific terrain.
protected  int getNumberOfWaysToTerrain(Legion legion, MasterHex hex, java.lang.String terrainTypeName)
           
 CreatureType getVariantRecruitHint(LegionClientSide legion, MasterHex hex, java.util.List<CreatureType> recruits)
           
protected  boolean hasOpponentNativeCreature(HazardTerrain terrain)
           
 void initBattle()
          a Battle start
protected  boolean isHumanLegion(Legion legion)
          Test whether a Legion belongs to a Human player
static LegionMove makeLegionMove(int[] indexes, java.util.List<java.util.List<CritterMove>> critterMoves)
          critterMoves is a List of sorted MoveLists.
private  void nestForLoop(int[] indexes, int level, java.util.List<java.util.List<CritterMove>> critterMoves, java.util.List<LegionMove> legionMoves, boolean forceAll)
          Private helper for generateLegionMoves If forceAll is true, generate all possible moves.
protected  int rangeToClosestOpponent(BattleHex hex)
           
 void setVariant(Variant v)
           
private  boolean trimCritterMoves(java.util.List<java.util.List<CritterMove>> allCritterMoves)
          Modify allCritterMoves in place, and return true if it changed.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface net.sf.colossus.ai.AI
acquireAngel, battleMove, concede, flee, handleCarries, masterMove, muster, pickColor, pickEngagement, pickEntrySide, pickMarker, pickStrikePenalty, reinforce, retryFailedBattleMoves, split, splitCallback, strike, summonAngel
 

Field Detail

LOGGER

private static final java.util.logging.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 java.util.Random random
Our random source.


hintSectionUsed

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


duplicateHexChecker

private final java.util.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 Detail

AbstractAI

protected AbstractAI(Client client)
Method Detail

setVariant

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

getVariantRecruitHint

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

buildEnemyAttackMap

protected final java.util.Map<MasterHex,java.util.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,
                                             java.lang.String terrainTypeName)

doesSetContainHexWithTerrain

private final boolean doesSetContainHexWithTerrain(java.util.Set<MasterHex> set,
                                                   java.lang.String terrainTypeName)

findStrikeMap

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


generateDamageMap

protected final java.util.Map<BattleCritter,java.lang.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 java.util.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

Returns:
The acquirableRecruitmentsValue

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,
                                             java.util.List<IVariantHint.AIStyle> styles)

getHintedRecruitmentValue

protected final int getHintedRecruitmentValue(CreatureType creature,
                                              Legion legion,
                                              java.util.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 java.util.Collection<LegionMove> generateLegionMoves(java.util.List<java.util.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,
                               java.util.List<java.util.List<CritterMove>> critterMoves,
                               java.util.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,
                                              java.util.List<java.util.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(java.util.List<java.util.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