Package net.sf.colossus.ai
Class RationalAI
- java.lang.Object
-
- net.sf.colossus.ai.AbstractAI
-
- net.sf.colossus.ai.SimpleAI
-
- net.sf.colossus.ai.RationalAI
-
- All Implemented Interfaces:
AI
- Direct Known Subclasses:
HumanHaterRationalAI
,MilvangAI
public class RationalAI extends SimpleAI
Simple implementation of a Titan AI- Author:
- Bruce Sherrod, David Ripton, Romain Dolbeau, Corwin Joy, extensively rewritten on 02-Oct-2003
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description (package private) static class
RationalAI.BattleResults
class
RationalAI.CompCreaturesByValueName
private class
RationalAI.LegionBoardMove
private class
RationalAI.MoveFinder
(package private) class
RationalAI.MusteredCreatures
-
Nested classes/interfaces inherited from class net.sf.colossus.ai.SimpleAI
SimpleAI.PowerSkill, SimpleAI.TriggerTimeIsUp
-
Nested classes/interfaces inherited from class net.sf.colossus.ai.AbstractAI
AbstractAI.AbstractAIOracle, AbstractAI.CreatureValueConstants, AbstractAI.MoveInfo
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.List<RationalAI.LegionBoardMove>
bestMoveList
private java.util.Iterator<RationalAI.LegionBoardMove>
bestMoveListIter
private java.util.Map<MasterHex,java.util.List<Legion>>[]
enemyAttackMap
private java.util.Map<java.lang.String,java.lang.Integer>
evaluateMoveMap
(package private) boolean
I_HATE_HUMANS
(package private) double
KILLPOINTS
private java.util.List<Legion>
legionsToSplit
private static java.util.logging.Logger
logger
(package private) static int
RECRUIT_AT_7
(package private) static int
RECRUIT_FALSE
(package private) static int
RECRUIT_TRUE
(package private) int
TITAN_SURVIVAL
-
Fields inherited from class net.sf.colossus.ai.SimpleAI
MIN_ITERATIONS, timeIsUp, timeLimit
-
Fields inherited from class net.sf.colossus.ai.AbstractAI
bec, client, cvc, hintSectionUsed, random, variant
-
-
Constructor Summary
Constructors Constructor Description RationalAI(Client client)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) RationalAI.MusteredCreatures
chooseCreaturesToSplitOut(Legion legion, boolean at_risk)
Decide how to split this legion, and return a list of Creatures to remove + status flag indicating if these creatures have mustered or notboolean
concede(Legion legion, Legion enemy)
choose whether legion should concede to enemy(package private) RationalAI.BattleResults
estimateBattleResults(Legion attacker, Legion defender, MasterHex hex)
private RationalAI.BattleResults
estimateBattleResults(Legion attacker, Legion defender, MasterHex hex, CreatureType callable)
private int
evaluateCombat(Legion attacker, Legion defender, MasterHex hex)
private int
evaluateHexAttack(Legion attacker, MasterHex hex, int canRecruitHere)
private int
evaluateMove(Legion legion, MasterHex hex, int canRecruitHere, int depth, boolean addHexRisk)
Memoizing wrapper for evaluateMoveInnerprivate int
evaluateMoveInner(Legion legion, MasterHex hex, int canRecruitHere, int depth, boolean normalHexRisk)
private double
expectedValueSplitLegion(LegionClientSide legion, LegionClientSide child_legion)
private boolean
findMoveList(java.util.List<? extends Legion> legions, java.util.List<java.util.List<RationalAI.LegionBoardMove>> all_legionMoves, MultiSet<MasterHex> occupiedHexes, boolean teleportsOnly)
private boolean
fireSplits()
Return true if done with all splits and callbacksboolean
flee(Legion legion, Legion enemy)
choose whether legion should flee from enemyjava.util.List<SimpleAI.PowerSkill>
getCombatList(Legion legion, MasterBoardTerrain terrain, boolean defender)
private boolean
handleForcedSingleMove(Player player)
private boolean
handleForcedSplitMoves(Player player)
private boolean
handleVoluntaryMoves(Player player)
Return true if we moved something and need to be called again.private double
hexRisk(Legion legion, MasterHex hex, boolean invert)
boolean
masterMove()
Return true if we need to run this method again after the server updates the client with the results of a move or mulligan.private static double
r3(double value)
private double
recruitValue(Legion legion, MasterHex hex, Legion enemy, MasterBoardTerrain terrain)
Find value of recruiting, including possibly attacking an enemy set enemy = null to indicate no enemyprivate java.util.List<CreatureType>
removeMustered(java.util.List<CreatureType> sortedCreatures)
private java.util.List<CreatureType>
sortCreaturesByValueName(Legion legion)
boolean
split()
make splits for current player.boolean
splitCallback(Legion parent, Legion child)
If parentId and childId are null, this is a callback to an undo split(package private) boolean
splitOneLegion(Player player, Legion legion)
Return true if done, false if waiting for callback.private boolean
splitOneLegionCallback(LegionClientSide parent, LegionClientSide child)
Return true if done, false if waiting for undo split-
Methods inherited from class net.sf.colossus.ai.SimpleAI
acquireAngel, battleMove, chooseRecruit, doInitialGameSplit, evaluateCritterMove_Defender, evaluateCritterMove_Rangestrike, evaluateCritterMove_Strike, evaluateCritterMove_Titan, evaluateLegionBattleMove, evaluateLegionBattleMoveAsAWhole, findBestLegionMove, findLegionMoves, findWeakestTwoCritters, getCreatureMoveLimit, getNativeValue, handleCarries, handleMulligans, muster, pickColor, pickEngagement, pickEntrySide, pickMarker, pickStrikePenalty, RATIO_DRAW, RATIO_LOSE_HEAVY_LOSS, RATIO_WIN_HEAVY_LOSS, RATIO_WIN_MINIMAL_LOSS, reinforce, retryFailedBattleMoves, setupTimer, strike, summonAngel
-
Methods inherited from class net.sf.colossus.ai.AbstractAI
buildEnemyAttackMap, cleanupBattle, couldRecruitUp, countCreatureAccrossAllLegionFromPlayer, findStrikeMap, generateDamageMap, generateLegionMoves, getAcqStepValue, getBattleStrike, getBattleUnit, getCaretaker, getHintedRecruitmentValue, getHintedRecruitmentValueNonTitan, getHintedRecruitmentValueNonTitan, getInitialSplitHint, getKillValue, getKillValue, getNumberOfWaysToTerrain, getVariantRecruitHint, hasOpponentNativeCreature, initBattle, isHumanLegion, makeLegionMove, rangeToClosestOpponent, setVariant
-
-
-
-
Field Detail
-
logger
private static final java.util.logging.Logger logger
-
I_HATE_HUMANS
boolean I_HATE_HUMANS
-
legionsToSplit
private final java.util.List<Legion> legionsToSplit
-
evaluateMoveMap
private final java.util.Map<java.lang.String,java.lang.Integer> evaluateMoveMap
-
bestMoveList
private java.util.List<RationalAI.LegionBoardMove> bestMoveList
-
bestMoveListIter
private java.util.Iterator<RationalAI.LegionBoardMove> bestMoveListIter
-
TITAN_SURVIVAL
final int TITAN_SURVIVAL
- See Also:
- Constant Field Values
-
RECRUIT_FALSE
static final int RECRUIT_FALSE
- See Also:
- Constant Field Values
-
RECRUIT_TRUE
static final int RECRUIT_TRUE
- See Also:
- Constant Field Values
-
RECRUIT_AT_7
static final int RECRUIT_AT_7
- See Also:
- Constant Field Values
-
KILLPOINTS
final double KILLPOINTS
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
RationalAI
public RationalAI(Client client)
-
-
Method Detail
-
r3
private static double r3(double value)
-
split
public boolean split()
Description copied from interface:AI
make splits for current player. Return true if done
-
fireSplits
private boolean fireSplits()
Return true if done with all splits and callbacks
-
splitCallback
public boolean splitCallback(Legion parent, Legion child)
If parentId and childId are null, this is a callback to an undo split- Specified by:
splitCallback
in interfaceAI
- Overrides:
splitCallback
in classSimpleAI
-
expectedValueSplitLegion
private double expectedValueSplitLegion(LegionClientSide legion, LegionClientSide child_legion)
-
splitOneLegion
boolean splitOneLegion(Player player, Legion legion)
Return true if done, false if waiting for callback.
-
splitOneLegionCallback
private boolean splitOneLegionCallback(LegionClientSide parent, LegionClientSide child)
Return true if done, false if waiting for undo split
-
recruitValue
private double recruitValue(Legion legion, MasterHex hex, Legion enemy, MasterBoardTerrain terrain)
Find value of recruiting, including possibly attacking an enemy set enemy = null to indicate no enemy
-
removeMustered
private java.util.List<CreatureType> removeMustered(java.util.List<CreatureType> sortedCreatures)
-
sortCreaturesByValueName
private java.util.List<CreatureType> sortCreaturesByValueName(Legion legion)
-
chooseCreaturesToSplitOut
RationalAI.MusteredCreatures chooseCreaturesToSplitOut(Legion legion, boolean at_risk)
Decide how to split this legion, and return a list of Creatures to remove + status flag indicating if these creatures have mustered or not
-
masterMove
public boolean masterMove()
Return true if we need to run this method again after the server updates the client with the results of a move or mulligan.- Specified by:
masterMove
in interfaceAI
- Overrides:
masterMove
in classSimpleAI
-
findMoveList
private boolean findMoveList(java.util.List<? extends Legion> legions, java.util.List<java.util.List<RationalAI.LegionBoardMove>> all_legionMoves, MultiSet<MasterHex> occupiedHexes, boolean teleportsOnly)
-
handleVoluntaryMoves
private boolean handleVoluntaryMoves(Player player)
Return true if we moved something and need to be called again.
-
handleForcedSplitMoves
private boolean handleForcedSplitMoves(Player player)
-
handleForcedSingleMove
private boolean handleForcedSingleMove(Player player)
-
evaluateHexAttack
private int evaluateHexAttack(Legion attacker, MasterHex hex, int canRecruitHere)
-
evaluateMove
private int evaluateMove(Legion legion, MasterHex hex, int canRecruitHere, int depth, boolean addHexRisk)
Memoizing wrapper for evaluateMoveInner
-
evaluateMoveInner
private int evaluateMoveInner(Legion legion, MasterHex hex, int canRecruitHere, int depth, boolean normalHexRisk)
-
estimateBattleResults
RationalAI.BattleResults estimateBattleResults(Legion attacker, Legion defender, MasterHex hex)
-
estimateBattleResults
private RationalAI.BattleResults estimateBattleResults(Legion attacker, Legion defender, MasterHex hex, CreatureType callable)
-
flee
public boolean flee(Legion legion, Legion enemy)
Description copied from interface:AI
choose whether legion should flee from enemy
-
concede
public boolean concede(Legion legion, Legion enemy)
Description copied from interface:AI
choose whether legion should concede to enemy
-
getCombatList
public java.util.List<SimpleAI.PowerSkill> getCombatList(Legion legion, MasterBoardTerrain terrain, boolean defender)
-
-