├── __init__.py ├── CityContestor.py ├── base ├── __init__.py ├── client │ └── __init__.py └── Colors.py ├── Benchmarks └── __init__.py ├── Utils ├── __init__.py └── ScaleUtils.py ├── img.png ├── .idea ├── .gitignore ├── codeStyles │ └── codeStyleConfig.xml ├── vcs.xml ├── inspectionProfiles │ ├── profiles_settings.xml │ └── Project_Default.xml ├── modules.xml ├── misc.xml └── generals-bot.iml ├── sample.gif ├── Tests ├── Defense │ ├── tiny_empty_test_map.txtmap │ ├── FogArmyDefenseDeath │ │ ├── 75.png │ │ ├── 76.png │ │ ├── 75.txtmap │ │ └── 76.txtmap │ ├── FailedToExecuteValidDefenseGather_Turn291 │ │ ├── 291.png │ │ ├── 292.png │ │ ├── 293.png │ │ ├── 294.png │ │ ├── 290.txtmap │ │ ├── 291.txtmap │ │ ├── 292.txtmap │ │ └── 293.txtmap │ ├── FailedToFindPlannedDefensePathForNoReason_Turn243 │ │ ├── 242.png │ │ ├── 243.png │ │ ├── 242.txtmap │ │ └── 243.txtmap │ └── GatherScenarios │ │ ├── ExplodesNextToGeneral.txtmap │ │ ├── ManySingleMovesToPath.txtmap │ │ ├── ManySingleMovesToPath__KnapsackGatherBreaks.txtmap │ │ ├── ManySingleMovesToPath__Smaller_final_move.txtmap │ │ ├── ManySingleMovesToPath__KnapsackGatherBreaks_Simpler.txtmap │ │ ├── ManySingleMovesToPath__KnapsackGatherBreaks_Simpler_WithEnemy.txtmap │ │ ├── ManySingleMovesToPath_WithLongerStart.txtmap │ │ ├── ManySingleMovesToPath_WithLongerStart_no_20.txtmap │ │ └── ManySingleMovesToPath_WithLongerStart_MultiKnapsackFailed.txtmap ├── EarlyExpandUtilsTestMaps │ ├── forced_corner_combo.giomap │ ├── corner.txtmap │ ├── forced_corner_combo.txtmap │ ├── cramped_from_St418__1.txtmap │ ├── forced_corner_combo__7.txtmap │ ├── cramped_from_St418__2.txtmap │ ├── SampleTurn25MapsToTryToBeat │ │ ├── ethryn_hack_6_15__rx07Ek732.txtmap │ │ ├── ethryn_hack_4_10__rx07Ek732.txtmap │ │ ├── SgK4X1Xh3.txtmap │ │ ├── SexDZkX3n.txtmap │ │ ├── reDFESS23.txtmap │ │ ├── rlo0eJXnh.txtmap │ │ ├── rxrfCyQhn.txtmap │ │ ├── He1G1kX33.txtmap │ │ ├── SlmUVUSh2.txtmap │ │ ├── Hg4b0SBnn.txtmap │ │ ├── HlfOpuNhn.txtmap │ │ ├── SlIacHHnh.txtmap │ │ ├── rePkW8Sn3.txtmap │ │ ├── SxlKfy72h.txtmap │ │ ├── HxBwTGBhh.txtmap │ │ ├── BgFvXQBhh-2.txtmap │ │ ├── SgqGZBS22.txtmap │ │ ├── He2s-k7hn.txtmap │ │ ├── HxMIUIr22.txtmap │ │ ├── HgwhkJ7n3.txtmap │ │ ├── HlETnAGnh.txtmap │ │ ├── Se0L3QB2h.txtmap │ │ ├── SeD8j0G2n.txtmap │ │ ├── Sg4vSXS22.txtmap │ │ ├── BgFvXQBhh.txtmap │ │ ├── HgD_-ON23.txtmap │ │ ├── HlP2aMB22.txtmap │ │ ├── Sgx9eiuE3n.txtmap │ │ ├── rgdB4LH33.txtmap │ │ ├── HlIwySr23.txtmap │ │ ├── HlzMJrSn2.txtmap │ │ ├── SlptbLrn2.txtmap │ │ ├── SgRvX_Vh2.txtmap │ │ ├── rxG_xQr2n.txtmap │ │ ├── rlPnL_V3h.txtmap │ │ ├── HeoR4BH32.txtmap │ │ ├── BgSJZd4hh.txtmap │ │ ├── Bl-KgQH3n.txtmap │ │ ├── BlumhyQ22.txtmap │ │ ├── redaEIShh.txtmap │ │ ├── rgf5JVr23.txtmap │ │ ├── BxLPSUB33.txtmap │ │ ├── SeirZLS33.txtmap │ │ ├── Bg3razBn3.txtmap │ │ ├── Hxw4hwNn3.txtmap │ │ ├── Hlel5QBn2.txtmap │ │ ├── rgHFQ8Bhh.txtmap │ │ ├── Bly3eEH3h.txtmap │ │ ├── HegGvmHhn.txtmap │ │ ├── rgFOnJX32.txtmap │ │ ├── HljfIQB33.txtmap │ │ ├── SlHhaQSh3.txtmap │ │ ├── HeHkLSS2h.txtmap │ │ ├── rg80UIr22.txtmap │ │ ├── BezNrON2n.txtmap │ │ ├── BgJTiGrhh.txtmap │ │ ├── Hej7Uy7hh.txtmap │ │ ├── SgUaZNrhn.txtmap │ │ ├── reWN0_N3n.txtmap │ │ ├── SggmLNS23.txtmap │ │ ├── BlTlBXHhh.txtmap │ │ ├── HxHtxSH33.txtmap │ │ ├── SgHhXISh3.txtmap │ │ ├── Hx93YGrhh.txtmap │ │ ├── SexP7Xrnh.txtmap │ │ ├── Sx5edQSh3.txtmap │ │ ├── rxH5fSrnn.txtmap │ │ ├── rxndAk7nh.txtmap │ │ ├── HeSDjQS3h.txtmap │ │ ├── rgvtA4Bh2.txtmap │ │ ├── BxfoIQB3h.txtmap │ │ ├── SxfUErHn2.txtmap │ │ ├── rxqO5BHn3.txtmap │ │ ├── BxWpRtqa3.txtmap │ │ ├── SgnskXHn2.txtmap │ │ ├── HxpebyX32.txtmap │ │ ├── rgK-zXr3h.txtmap │ │ ├── refiPJQ2n.txtmap │ │ ├── Hga27Jmnh.txtmap │ │ ├── HlGJ04Bh3.txtmap │ │ ├── SlcYAHr33.txtmap │ │ ├── SxLhzIS3n.txtmap │ │ ├── rgMWP8Hhn.txtmap │ │ └── BeaCFkX3h.txtmap │ ├── only_got_24_when_seems_easy_25__V1__turn50.txtmap │ ├── suboptimal_cramped_spawn.txtmap │ └── produced_invalid_plan_01.txtmap ├── SymmetricTestMaps │ ├── even_playground_map_small__left_right.txtmap │ ├── even_playground_map_small__top_right_bot_left.txtmap │ ├── even_playground_map_small__top_left_bot_right.txtmap │ └── even_playground_map_small_short_spawns__top_left_bot_right.txtmap └── ExpandUtilsTestMaps │ └── did_not_find_2_move_cap__turn34.txtmap ├── Images └── MaxFlowMinCost_PreCompute.png ├── StrategyModels ├── __init__.py └── ExpansionPotential.py ├── Interfaces └── __init__.py ├── BenchmarkTools └── __init__.py ├── DebugHelper.py ├── Strategy └── __init__.py ├── Communication ├── CommunicationConstants.py ├── __init__.py ├── TeammateCommunication.py └── TileCompressor.py ├── Debug_BotHost.py ├── Dockerfile ├── Algorithms └── __init__.py ├── Models ├── __init__.py └── Move.py ├── requirements.txt ├── GeneralPredictor.py ├── Gather ├── GatherDebug.py └── KruskalsSpanningGather.py ├── linecounter.ps1 ├── generals-bot.sln ├── License.txt ├── setup.py ├── MainTodo2.txt ├── UnitTests └── test_MapMatrix.py ├── GatherAnalyzer.py └── .gitignore /__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CityContestor.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /base/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Benchmarks/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /base/client/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Utils/__init__.py: -------------------------------------------------------------------------------- 1 | from .ScaleUtils import * -------------------------------------------------------------------------------- /img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/img.png -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /sample.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/sample.gif -------------------------------------------------------------------------------- /Tests/Defense/tiny_empty_test_map.txtmap: -------------------------------------------------------------------------------- 1 | | | | | 2 | aG1 3 | 4 | 5 | bG1 6 | | | | | -------------------------------------------------------------------------------- /Images/MaxFlowMinCost_PreCompute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Images/MaxFlowMinCost_PreCompute.png -------------------------------------------------------------------------------- /StrategyModels/__init__.py: -------------------------------------------------------------------------------- 1 | from .OpponentTrackerModels import CycleStatsData, PlayerMoveCategory 2 | from .ExpansionPotential import * 3 | -------------------------------------------------------------------------------- /Tests/Defense/FogArmyDefenseDeath/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FogArmyDefenseDeath/75.png -------------------------------------------------------------------------------- /Tests/Defense/FogArmyDefenseDeath/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FogArmyDefenseDeath/76.png -------------------------------------------------------------------------------- /Interfaces/__init__.py: -------------------------------------------------------------------------------- 1 | from .TilePlanInterface import TilePlanInterface 2 | from .MapMatrixInterface import MapMatrixInterface, TileSet, MetaTileSet 3 | -------------------------------------------------------------------------------- /BenchmarkTools/__init__.py: -------------------------------------------------------------------------------- 1 | from .GatherBenchmarker import GatherBenchmarkResult, GatherSort, GatherAggregateResults, GatherBenchmarker, GatherBenchScope 2 | -------------------------------------------------------------------------------- /DebugHelper.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | IS_DEBUGGING: bool = sys.gettrace() is not None 4 | """This will be true when a debugger is attached, false otherwise.""" -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/291.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/291.png -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/292.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/292.png -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/293.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/293.png -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/294.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/294.png -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/forced_corner_combo.giomap: -------------------------------------------------------------------------------- 1 | U2FsdGVkX19R14BKLbZd6VNaGgY8sueJC6UzNqrN4MP54YhIUpd1nxGQs8i29WeDyF8bciqxe5qg33BGDkswYA77W3lsRRXKDxbzEaHAUnkDvAhlbZD6rEBQ7VO+3RtA -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/242.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/242.png -------------------------------------------------------------------------------- /Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/243.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EklipZgit/generals-bot/HEAD/Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/243.png -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/corner.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | 2 | aG1 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | | | | | | | | -------------------------------------------------------------------------------- /Strategy/__init__.py: -------------------------------------------------------------------------------- 1 | from .OpponentTracker import OpponentTracker, TeamAttackData 2 | from .WinConditionAnalyzer import WinConditionAnalyzer 3 | from .CaptureLineTracker import CaptureLineOption, CaptureLineTracker 4 | -------------------------------------------------------------------------------- /Communication/CommunicationConstants.py: -------------------------------------------------------------------------------- 1 | TEAM_CHAT_CHARACTER_LIMIT = 251 # might include stuff like [team] or the username, though, so maybe cut earlier...? 2 | CHAT_MESSAGES_PER_TURN_LIMIT = 2 # pretty sure it's actually 1...? 3 | -------------------------------------------------------------------------------- /Debug_BotHost.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | if __name__ == '__main__': 4 | import BotHost 5 | 6 | BotHost.run_bothost('EklipZ_ai', 'private', roomId='testing', userId='efgEklipZ_ai', isPublic=False, noUi=False, alignBottom=True, alignRight=True, noLog=False) -------------------------------------------------------------------------------- /Communication/__init__.py: -------------------------------------------------------------------------------- 1 | from .TileCompressor import TileCompressor, ServerTileCompressor 2 | from .TeammateCommunication import TeammateCommunication 3 | from .CoordinatedDefense import DefensePlan, CoordinatedDefense 4 | from .TeammateCommunicator import TeammateCommunicator 5 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.6.1 2 | 3 | WORKDIR /usr/src/app 4 | ADD requirements.txt /usr/src/app/requirements.txt 5 | RUN pip install -U websocket-client 6 | 7 | ADD base/ /usr/src/app/base/ 8 | ADD *.py /usr/src/app/ 9 | 10 | CMD ["python", "bot_blob.py", "--no-ui"] 11 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /Algorithms/__init__.py: -------------------------------------------------------------------------------- 1 | from .TileIslandBuilder import TileIslandBuilder, TileIsland 2 | from .MapSpanningUtils import TileGraph, TileNode # , get_map_as_graph_from_tiles, get_map_as_graph 3 | from .FastDisjointSet import FastDisjointSet 4 | # from .KruskalsSpanningGather import gath_set_quick 5 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/forced_corner_combo.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | 2 | aG1 3 | M M M M M M M 4 | M M M M M M M 5 | M M M M M M M M 6 | M M M M M M M M M 7 | M M M M M M M M M M 8 | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/cramped_from_St418__1.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | 4 | M M M 5 | aG1 M M M 6 | M M M 7 | M M 8 | 9 | 10 | 11 | | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ExplodesNextToGeneral.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b2 b1 M 3 | b1 b5 M 4 | bG7 M 5 | M a7 M M M M M 6 | M a1 b1 b1 b1 b20 b1 7 | b1 a1 M M M M M 8 | M a1 b1 M M M M 9 | b1 a1 M M M M M 10 | M a1 b9 b1 b1 b1 b1 11 | M a1 a1 a1 a1 a1 aG42 12 | | | | | | | | 13 | player_index=1 14 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b5 b1 M 3 | b5 b5 M 4 | bG5 M 5 | M b1 M M M M M 6 | M b1 b10 b1 b1 b20 b1 7 | b10 b1 M M M M M 8 | M b1 b10 M M M M 9 | b10 b1 M M M M M 10 | M b1 b10 b1 b1 b1 b1 11 | M a69 a1 a1 a1 a1 aG40 12 | | | | | | | | 13 | player_index=1 14 | loadAsIs=True -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 10 | -------------------------------------------------------------------------------- /Models/__init__.py: -------------------------------------------------------------------------------- 1 | from .GatherTreeNode import * 2 | from .Move import * 3 | 4 | 5 | class ContestData(object): 6 | def __init__(self, tile: Tile): 7 | self.tile: Tile = tile 8 | self.last_attacked_turn: int = 0 9 | self.attacked_count: int = 0 10 | 11 | def __str__(self) -> str: 12 | return f'Contested {str(self.tile)}: last{self.last_attacked_turn} atk#{self.attacked_count}' 13 | 14 | def __repr__(self) -> str: 15 | return str(self) -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath__KnapsackGatherBreaks.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b5 b1 M 3 | b5 b5 M 4 | bG7 M 5 | M b1 M M M M M 6 | M b1 b10 b1 b1 b20 b1 7 | b1 a25 M M M M M 8 | M a1 b1 M M M M 9 | b1 a1 M M M M M 10 | M a1 b9 b1 b1 b1 b1 11 | M a1 a1 a1 a1 a1 aG42 12 | | | | | | | | 13 | player_index=1 14 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath__Smaller_final_move.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b5 b1 M 3 | b5 b5 M 4 | bG5 M 5 | M b1 M M M M M 6 | M b1 b10 b1 b1 b20 b1 7 | b10 b1 M M M M M 8 | M b1 b10 M M M M 9 | b10 b1 M M M M M 10 | M b1 b10 b1 b1 b1 b1 11 | M a69 a1 a1 a1 a1 aG40 12 | | | | | | | | 13 | player_index=1 14 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath__KnapsackGatherBreaks_Simpler.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b5 b1 M 3 | b5 b5 M 4 | bG1 M 5 | M b1 M M M M M 6 | M b1 b10 b1 b1 b20 b1 7 | b1 a18 M M M M M 8 | M a1 b1 M M M M 9 | b1 a1 M M M M M 10 | M a1 b9 b1 b1 b1 b1 11 | M a1 a1 a1 a1 a1 aG42 12 | | | | | | | | 13 | player_index=1 14 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath__KnapsackGatherBreaks_Simpler_WithEnemy.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b2 b1 M 3 | b1 b5 M 4 | bG1 M 5 | M b1 M M M M M 6 | M b1 a2 b12 b1 b20 b1 7 | b1 a1 M M M M M 8 | M a18 b1 M M M M 9 | b1 a1 M M M M M 10 | M a1 b9 b1 b1 b1 b1 11 | M a1 a1 a1 a1 a1 aG42 12 | | | | | | | | 13 | player_index=1 14 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath_WithLongerStart.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b7 b1 M 3 | b5 b3 M 4 | bG5 M 5 | M b1 b10 b1 b1 b20 b1 6 | b10 b1 M M M M M 7 | M b1 b10 M M M M 8 | b10 b1 M M M M M 9 | M b1 b10 M M M M 10 | M b1 b1 b10 M M M 11 | M b1 b1 b1 b1 b1 b1 12 | M a77 a1 a1 a1 a1 aG40 13 | | | | | | | | 14 | player_index=1 15 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath_WithLongerStart_no_20.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b7 b1 M 3 | b5 b3 M 4 | bG5 M 5 | M b1 b10 b1 b1 b10 b1 6 | b10 b1 M M M M M 7 | M b1 b10 M M M M 8 | b10 b1 M M M M M 9 | M b1 b10 M M M M 10 | M b1 b1 b10 M M M 11 | M b1 b1 b1 b1 b1 b1 12 | M a77 a1 a1 a1 a1 aG40 13 | | | | | | | | 14 | player_index=1 15 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/Defense/GatherScenarios/ManySingleMovesToPath_WithLongerStart_MultiKnapsackFailed.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | 2 | b7 b1 M 3 | b5 b3 M 4 | bG7 M 5 | M b1 b10 b1 b1 b20 b1 6 | b1 b10 M M M M M 7 | M b10 b1 M M M M 8 | b1 b10 M M M M M 9 | M a71 b10 M M M M 10 | M a1 b1 b10 M M M 11 | M a1 b1 b1 b1 b1 b1 12 | M a1 a1 a1 a1 a1 aG42 13 | | | | | | | | 14 | player_index=1 15 | loadAsIs=True -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/forced_corner_combo__7.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | 2 | M M M M M M M M M 3 | M aG1 M 4 | M M M 5 | M M M 6 | M M M M 7 | M M M M M 8 | M M M M M M 9 | M M M M M M M 10 | M M M M M M M M 11 | | | | | | | | | | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | websocket-client 2 | pygame 3 | certifi 4 | requests 5 | nashpy 6 | numpy==1.24.0 # after numba update let this upgrade? Numba being stupid. 7 | numba 8 | scipy 9 | Logbook 10 | pyzmq 11 | pcst_fast 12 | networkx 13 | matplotlib 14 | heapq_max 15 | # heap-class this performed poorly 16 | # dill 17 | # if ever need fast dict for int:int or str:str or int:str -> https://github.com/touqir14/Microdict?tab=readme-ov-file 18 | 19 | disjoint-set 20 | unionfind 21 | logbook 22 | certifi 23 | 24 | cppimport 25 | cython 26 | pandas 27 | tqdm 28 | setuptools 29 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/cramped_from_St418__2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | | 2 | M 3 | 4 | M M M 5 | M M 6 | M M M 7 | M M M 8 | M M 9 | M M 10 | aG1 M 11 | M M M M M 12 | M M 13 | 14 | M M 15 | 16 | | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /.idea/generals-bot.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 15 | -------------------------------------------------------------------------------- /Communication/TeammateCommunication.py: -------------------------------------------------------------------------------- 1 | from base.client.tile import Tile 2 | 3 | 4 | class TeammateCommunication(object): 5 | def __init__(self, message: str, pingTile: Tile | None = None, cooldown: int = 10, detectOnMessageAlone: bool = False, cooldownDetectionKey: str | None = None): 6 | self.message: str = message 7 | 8 | self.ping_tile: Tile | None = pingTile 9 | 10 | self.cooldown: int = cooldown 11 | 12 | self.cooldown_detection_on_message_alone: bool = detectOnMessageAlone 13 | """If true, the pinged tile will not be used as part of duplicate message cooldown determination.""" 14 | 15 | self.cooldown_key: str | None = cooldownDetectionKey 16 | 17 | -------------------------------------------------------------------------------- /GeneralPredictor.py: -------------------------------------------------------------------------------- 1 | """ 2 | @ Travis Drake (EklipZ) eklipz.io - tdrake0x45 at gmail) 3 | April 2017 4 | Generals.io Automated Client - https://github.com/harrischristiansen/generals-bot 5 | EklipZ bot - Tries to play generals lol 6 | """ 7 | 8 | from SearchUtils import * 9 | from Models import * 10 | from enum import Enum 11 | 12 | 13 | class ThreatType(Enum): 14 | Kill = 1 15 | Vision = 2 16 | 17 | 18 | class GeneralPredictor(object): 19 | def __init__(self, map: MapBase): 20 | self.is_2v2 = map.is_2v2 21 | self.map: MapBase = map 22 | self.eliminated_by_player: typing.List[MapMatrixInterface[bool]] = [MapMatrix(map, False) for player in map.players] 23 | self.teams: typing.List[int] = MapBase.get_teams_array(map) 24 | 25 | -------------------------------------------------------------------------------- /Gather/GatherDebug.py: -------------------------------------------------------------------------------- 1 | import typing 2 | from collections import deque 3 | 4 | import logbook 5 | 6 | from base.client.tile import Tile 7 | 8 | USE_DEBUG_ASSERTS = False 9 | USE_DEBUG_LOGGING = False 10 | 11 | 12 | def assertConnected(tiles: typing.Set[Tile]): 13 | seedTile = next(iter(tiles)) 14 | 15 | visited = set() 16 | 17 | q = deque() 18 | q.append(seedTile) 19 | 20 | while q: 21 | tile = q.pop() 22 | if tile in visited: 23 | continue 24 | 25 | visited.add(tile) 26 | 27 | for mv in tile.movable: 28 | if mv in tiles: 29 | q.append(mv) 30 | 31 | if len(visited) != len(tiles): 32 | raise Exception(f'tiles were not connected to seed tile {seedTile}. Disconnected tiles:\r\n {" | ".join([str(t) for t in tiles.difference(visited)])}') -------------------------------------------------------------------------------- /linecounter.ps1: -------------------------------------------------------------------------------- 1 | push-location 2 | $testFiles = foreach ($folder in "Tests", "UnitTests") { 3 | cd $psscriptroot/$folder 4 | gci *.py 5 | } 6 | 7 | $files = foreach ($folder in "Sim", "Engine", "base", "base/client", "Algorithms", "Behavior", "BehaviorAlgorithms", "Benchmarks", "BenchmarkTools", "Communication", "Gather", "Interfaces", "Models", "Strategy", "StrategyModels", "Viewer", "Utils") { 8 | cd $psscriptroot/$folder 9 | gci -recurse *.py 10 | } 11 | 12 | cd $psscriptroot 13 | $files += gci *.py 14 | $lines = $files | get-content 15 | $realLines = @($lines |?{$_.trim() -and -not $_.trim().startswith("#") }) 16 | 17 | $testLines = $testFiles | get-content 18 | $testLines = @($testLines |?{$_.trim() -and -not $_.trim().startswith("#") }) 19 | 20 | $files 21 | "main lines: $($realLines.count)" 22 | "test lines: $($testLines.count)" 23 | pop-location -------------------------------------------------------------------------------- /generals-bot.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.25123.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "generals-bot", "generals-bot.pyproj", "{085C9085-D9F9-4851-9787-FD22BFC57947}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {085C9085-D9F9-4851-9787-FD22BFC57947}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {085C9085-D9F9-4851-9787-FD22BFC57947}.Release|Any CPU.ActiveCfg = Release|Any CPU 16 | EndGlobalSection 17 | GlobalSection(SolutionProperties) = preSolution 18 | HideSolutionNode = FALSE 19 | EndGlobalSection 20 | EndGlobal 21 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/ethryn_hack_6_15__rx07Ek732.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | b2 b2 14 | b2 b2 15 | b2 b2 16 | b2 b2 17 | b2 b2 18 | b2 b2 b2 b2 b2 b2 b2 b2 b2 b2 bG3 b2 b2 b2 19 | b2 20 | 21 | 22 | 23 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 22 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/ethryn_hack_4_10__rx07Ek732.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | b2 15 | b2 16 | b2 17 | b2 18 | b2 b2 b2 b2 b2 b2 b2 b2 bG3 b2 19 | b2 b2 b2 20 | b2 b2 b2 21 | b2 b2 b2 22 | b2 b2 23 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Gather/KruskalsSpanningGather.py: -------------------------------------------------------------------------------- 1 | import time 2 | import typing 3 | from collections import deque 4 | 5 | import logbook 6 | 7 | import DebugHelper 8 | import Gather 9 | # from Algorithms import MapSpanningUtils, FastDisjointSet 10 | from Interfaces import TileSet, MapMatrixInterface 11 | from MapMatrix import MapMatrix, MapMatrixSet 12 | from ViewInfo import ViewInfo 13 | from base.client.map import MapBase 14 | from base.client.tile import Tile 15 | import heapq 16 | 17 | 18 | # def kruskals_gather(map: MapBase, targetTurns: int, rootTiles: typing.List[Tile], tilesToIncludeIfPossible: typing.Iterable[Tile], negativeTiles: TileSet, gatherRewardMatrix: MapMatrixInterface[float] | None = None): 19 | # connectedTiles, missing = MapSpanningUtils.get_spanning_tree_from_tile_lists(map, rootTiles, negativeTiles) 20 | # 21 | # q = [] 22 | # for tile in map.reachable_tiles: 23 | # down = map.GetTile(tile.x, tile.y + 1) 24 | # right = map.GetTile(tile.x + 1, tile.y) 25 | # 26 | # if down in map.reachable_tiles: 27 | # heapq.heappush() 28 | 29 | -------------------------------------------------------------------------------- /License.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Harris Christiansen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Tests/SymmetricTestMaps/even_playground_map_small__left_right.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | 2 | M M 3 | M C39 C39 M 4 | M M M 5 | aG1 M M M M bG1 6 | M 7 | C43 M M C43 8 | M M 9 | M M 10 | M M 11 | C41 C41 12 | C45 C45 13 | | | | | | | | | | | | | | | | 14 | turn=383 15 | player_index=1 16 | aTiles=55 17 | aScore=148 18 | aStandingArmy=93 19 | aStars=55 20 | aCityCount=1 21 | aGeneral=13,1 22 | aKnowsKingLocation=True 23 | aDead=False 24 | aLeftGame=False 25 | aLeftGameTurn=-1 26 | bTiles=71 27 | bScore=159 28 | bStandingArmy=88 29 | bStars=57 30 | bCityCount=1 31 | bGeneral=6,13 32 | bKnowsKingLocation=False 33 | bDead=False 34 | bLeftGame=False 35 | bLeftGameTurn=-1 36 | bot_target_player=0 -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # Available at setup time due to pyproject.toml 2 | from pybind11.setup_helpers import Pybind11Extension, build_ext 3 | from Cython.Build import cythonize 4 | from setuptools import setup, Extension 5 | import pathlib 6 | 7 | __version__ = "0.0.1" 8 | 9 | 10 | # ext_modules = [ 11 | # Pybind11Extension( 12 | # "Knap", 13 | # ["cpp/KnapsackUtilsCpp.cpp"], 14 | # # Example: passing in the version to the compiled code 15 | # define_macros=[("VERSION_INFO", __version__)], 16 | # ), 17 | # ] 18 | 19 | 20 | cython_extensions = [ 21 | Extension(str(file).removesuffix(".pyx"), [file], 22 | extra_compile_args=["-ggdb3"] 23 | ) 24 | for file in pathlib.Path('.').glob('*pyx') 25 | ] 26 | 27 | setup( 28 | name="CythonModules", 29 | ext_modules=cythonize(cython_extensions, compiler_directives={'language_level': 3}, 30 | language="c++"), 31 | ) 32 | 33 | pybind11_extensions = [ 34 | Pybind11Extension(str(file).removesuffix(".cpp"), [file], 35 | extra_compile_args=["-ggdb3"] 36 | ) 37 | for file in pathlib.Path('.').glob('*.cpp') 38 | if '.rendered' not in str(file) 39 | ] 40 | 41 | setup( 42 | name="PyBind11Modules", 43 | ext_modules=pybind11_extensions, 44 | ) -------------------------------------------------------------------------------- /Utils/ScaleUtils.py: -------------------------------------------------------------------------------- 1 | import typing 2 | 3 | 4 | def rescale_color( 5 | valToScale: float, 6 | valueMin: float, 7 | valueMax: float, 8 | colorMin: typing.Tuple[int, int, int], 9 | colorMax: typing.Tuple[int, int, int] 10 | ) -> typing.Tuple[int, int, int]: 11 | rMin, gMin, bMin = colorMin 12 | rMax, gMax, bMax = colorMax 13 | 14 | r = min(255, int(rescale_value(valToScale, valueMin, valueMax, rMin, rMax))) 15 | g = min(255, int(rescale_value(valToScale, valueMin, valueMax, gMin, gMax))) 16 | b = min(255, int(rescale_value(valToScale, valueMin, valueMax, bMin, bMax))) 17 | 18 | return r, g, b 19 | 20 | 21 | def rescale_value( 22 | valToScale: float, 23 | valueMin: float, 24 | valueMax: float, 25 | newScaleMin: float, 26 | newScaleMax: float, 27 | ) -> float: 28 | # Figure out how 'wide' each range is 29 | leftSpan = valueMax - valueMin 30 | rightSpan = newScaleMax - newScaleMin 31 | 32 | if leftSpan == 0: 33 | leftSpan = 1 34 | 35 | # Convert the left range into a 0-1 range (float) 36 | valueScaled = float(valToScale - valueMin) / float(leftSpan) 37 | 38 | # Convert the 0-1 range into a value in the right range. 39 | return newScaleMin + (valueScaled * rightSpan) 40 | -------------------------------------------------------------------------------- /MainTodo2.txt: -------------------------------------------------------------------------------- 1 | MAIN TODO: 2 | Fix MST gather, either stop gathering shit leaves somehow or just prune all shit leaves and then path-gather back up to desired. 3 | 4 | Expansion continuation. (Leftover army gets re-expanded.) 5 | general / city gets re-added back in with smaller army. 6 | Splitting army as option? 7 | Expansion should switch search order from largest tiles first to closest tiles to enemy territory first. 8 | - If not for full expansion, then at least for last 10-15 turns of it or so... 9 | Expansion should prioritize enemy tiles further from enemy army sources first (general cities), as they are least likely to be retaken. Balance this with defense. (Same with enemy tiles on quickexpand) 10 | 11 | Switch path targeting from breadth_first_kill to dynamic_bfs_max (like greedy gather). Stop using tiny armies instead of large armies 1 or 2 moves longer to kill these.... 12 | stop attacking running away armies before army bonus. Kill stuff instead and let them run. 13 | 14 | 15 | 16 | Combine gather + expansion at the same time (so that we don't gather already good expansion tiles away from good spots etc) 17 | interlace expansion with gather at some points, particularly where it reveals fog and doesn't use cities? 18 | 19 | When winning on army but not economy, use move-halfs to leave some army behind while continuing to take tiles and attack 20 | 21 | -------------------------------------------------------------------------------- /StrategyModels/ExpansionPotential.py: -------------------------------------------------------------------------------- 1 | import typing 2 | 3 | from Behavior.ArmyInterceptor import InterceptionOptionInfo 4 | from Interfaces import TilePlanInterface 5 | from base.client.tile import Tile 6 | 7 | 8 | class ExpansionPotential(object): 9 | def __init__( 10 | self, 11 | turnsUsed: int, 12 | enTilesCaptured: int, 13 | neutTilesCaptured: int, 14 | selectedOption: TilePlanInterface | None, 15 | allOptions: typing.List[TilePlanInterface], 16 | cumulativeEconVal: float 17 | ): 18 | self.turns_used: int = turnsUsed 19 | self.en_tiles_captured: int = enTilesCaptured 20 | self.neut_tiles_captured: int = neutTilesCaptured 21 | self.selected_option: TilePlanInterface = selectedOption 22 | self.all_paths: typing.List[TilePlanInterface] = allOptions 23 | self.plan_tiles: typing.Set[Tile] = set() 24 | self.preferred_tiles: typing.Set[Tile] = set() 25 | self.blocking_tiles: typing.Set[Tile] = set() 26 | self.intercept_waiting: typing.List[InterceptionOptionInfo] = [] 27 | """Tiles who are part of the required plan, but which have a required delay on them.""" 28 | 29 | self.includes_intercept: bool = False 30 | for selectedOption in allOptions: 31 | self.plan_tiles.update(selectedOption.tileSet) 32 | 33 | self.cumulative_econ_value: float = cumulativeEconVal 34 | -------------------------------------------------------------------------------- /UnitTests/test_MapMatrix.py: -------------------------------------------------------------------------------- 1 | from MapMatrix import MapMatrixSet 2 | from Sim.GameSimulator import GameSimulatorHost 3 | from TestBase import TestBase 4 | from base.client.map import MapBase 5 | from bot_ek0x45 import EklipZBot 6 | 7 | 8 | class MapMatrixUnitTests(TestBase): 9 | def __init__(self, methodName: str = ...): 10 | super().__init__(methodName) 11 | 12 | def get_debug_render_bot(self, simHost: GameSimulatorHost, player: int = -2) -> EklipZBot: 13 | bot = super().get_debug_render_bot(simHost, player) 14 | 15 | # bot.info_render_tile_deltas = True 16 | # bot.info_render_army_emergence_values = True 17 | # bot.info_render_general_undiscovered_prediction_values = True 18 | 19 | return bot 20 | 21 | def test_map_matrix_set_iterator(self): 22 | mapFile = 'GameContinuationEntries/should_recognize_army_collision_from_fog___BlpaDuBT2---b--136.txtmap' 23 | 24 | map, general, enemyGeneral = self.load_map_and_generals(mapFile, 136) 25 | 26 | matrix = MapMatrixSet(map) 27 | tileIn1 = map.GetTile(1, 3) 28 | tileIn2 = map.GetTile(6, 9) 29 | 30 | matrix.add(tileIn1) 31 | matrix.add(tileIn2) 32 | 33 | self.assertIn(tileIn1, matrix) 34 | self.assertIn(tileIn2, matrix) 35 | 36 | tilesIn = [t for t in matrix] 37 | self.assertEqual(2, len(tilesIn)) 38 | for t in tilesIn: 39 | self.assertTrue(t == tileIn1 or t == tileIn2) -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgK4X1Xh3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M 4 | M M 5 | M M M M 6 | M b2 b2 b2 b2 b2 b2 C48 M M M 7 | M b2 M C47 M M M M 8 | bG4 b2 M C44 C43 M 9 | b2 b2 b2 b2 b2 b2 M M M M M M 10 | b2 M M b2 M M M M M 11 | b2 b2 M b2 M M 12 | b2 M 13 | M b2 b2 M M 14 | M M C47 b2 M 15 | M M M 16 | M M M M 17 | M M M M M M 18 | M M M M M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/Defense/FogArmyDefenseDeath/75.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M 4 | M M M M M M M M M 5 | M M M M M M 6 | M M M M M M 7 | b1 b1 8 | b1 bG2 b1 M a27 M M 9 | b1 b1 b27 b2 b2 b2 a1 a1 M 10 | b1 b1 M C43 a2 b1 a1 M 11 | M b1 b1 b1 b1 b1 b2 b1 M M 12 | M b1 b1 b1 M 13 | M M M b1 b1 b1 M M M 14 | M M M M C48 M 15 | M M M M M M 16 | M M M M M 17 | M M M M 18 | M M M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/Defense/FogArmyDefenseDeath/76.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M 4 | M M M M M M M M M 5 | M M M M M M 6 | M M M M M M 7 | b1 a25 8 | b1 bG3 b1 M a1 M M 9 | b1 b1 b1 b28 b2 b2 a1 a1 M 10 | b1 b1 M C43 a2 b1 a1 M 11 | M b1 b1 b1 b1 b1 b2 b1 M M 12 | M b1 b1 b1 M 13 | M M M b1 b1 b1 M M M 14 | M M M M C48 M 15 | M M M M M M 16 | M M M M M 17 | M M M M 18 | M M M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SexDZkX3n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M 3 | M M M M M 4 | M b2 b2 M M C46 M 5 | M b2 bG3 b2 b2 b2 b2 b2 b2 b2 b2 M 6 | M b2 M b2 b2 b2 b2 b2 M 7 | b2 b2 M M b2 b2 M 8 | M M b2 b2 M M 9 | M b2 10 | M M M M M 11 | M M M M 12 | M 13 | M M M M M 14 | M M M 15 | M M M M M 16 | M M M M M M M 17 | M M M M M M M M 18 | M M M 19 | M M M M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/reDFESS23.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M M 4 | M M M 5 | M M M M 6 | M C48 b2 b2 M M M 7 | b2 bG3 b2 b2 b2 b2 M M M 8 | b2 b2 b2 b2 C50 b2 b2 b2 b2 M M 9 | M M b2 b2 M b2 M M 10 | M M M b2 b2 b2 b2 b2 b2 M 11 | M M M C42 M M M 12 | M M M M 13 | M M M 14 | M M M M M M 15 | M M M M 16 | M M M M M M M 17 | M M M 18 | M M M M M 19 | M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rlo0eJXnh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M 4 | M M M 5 | M M M M M M 6 | M M M M 7 | M M M M 8 | M M M 9 | M M M M 10 | M M M b2 M M M 11 | M M b2 b2 b2 M M M M 12 | b2 M 13 | M b2 M M 14 | M b2 b2 b2 M M M 15 | M M b2 M b2 M 16 | M b2 b2 C47 M 17 | M M M M b2 M b2 M M 18 | M M b2 b2 b2 b2 b2 M M 19 | M bG5 M b2 b2 M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxrfCyQhn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M 3 | M M M M M 4 | M 5 | M M M M 6 | M M 7 | M C43 M b2 b2 M M 8 | b2 b2 b2 M M M 9 | b2 M M M M b2 M M M M 10 | b2 M M b2 M M M M M 11 | bG3 b2 b2 b2 b2 b2 b2 b2 M M M 12 | b2 b2 b2 b2 b2 M M 13 | M M b2 b2 b2 M 14 | M M 15 | M M M M M M 16 | M M M 17 | M M M M M M M 18 | M M M M M M 19 | M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/He1G1kX33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M b2 b2 b2 bG4 M 3 | M M b2 b2 b2 b2 b2 b2 M b2 M M M 4 | C41 b2 M b2 M b2 M M 5 | M M M M b2 b2 b2 M b2 b3 6 | b2 b2 b2 b2 M M M M 7 | M M M 8 | M M M M M M 9 | M M M M M M M 10 | M M M M M M M M 11 | M M M M M M 12 | M M M M M 13 | M M M 14 | M M M M M M 15 | M M M M M M 16 | M M M M 17 | M M M M 18 | M M 19 | M M 20 | M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlmUVUSh2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M 4 | a2 a2 a2 a2 M M a2 M M M M 5 | C45 M aG4 a2 a2 a2 M M M M M 6 | M a2 M M M M 7 | M a2 a2 a2 a2 a2 a2 8 | M C45 a2 a2 C45 M a2 M M 9 | C42 a2 M M a2 10 | M a2 M M M 11 | a2 a2 M M 12 | M M M M M 13 | M M M M M 14 | M M M M M 15 | M M M M M M 16 | M M M M M M 17 | M M M M M M 18 | M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /GatherAnalyzer.py: -------------------------------------------------------------------------------- 1 | import SearchUtils 2 | from Interfaces import MapMatrixInterface 3 | from base.client.map import MapBase, Tile 4 | from MapMatrix import MapMatrix 5 | 6 | 7 | class GatherAnalyzer(object): 8 | def __init__(self, map: MapBase): 9 | self.gather_locality_map: MapMatrixInterface[int] = MapMatrix(map, 0) 10 | self.map = map 11 | 12 | def __getstate__(self): 13 | state = self.__dict__.copy() 14 | if "map" in state: 15 | del state["map"] 16 | return state 17 | 18 | def __setstate__(self, state): 19 | self.__dict__.update(state) 20 | self.map = None 21 | 22 | def scan(self): 23 | """ 24 | Look for pockets of far away army and put weights on them 25 | 26 | @return: 27 | """ 28 | 29 | self.gather_locality_map: MapMatrixInterface[int] = MapMatrix(self.map, 0) 30 | for tile in self.map.pathable_tiles: 31 | if tile.player != self.map.player_index: 32 | continue 33 | 34 | def counter(nearbyTile: Tile): 35 | if nearbyTile.isObstacle: 36 | return True 37 | if nearbyTile.isCity or nearbyTile.isGeneral: 38 | # Skip cities because we want to gather TILES not CITIES :| 39 | return 40 | if nearbyTile.player == self.map.player_index: 41 | self.gather_locality_map[tile] += nearbyTile.army - 1 42 | 43 | SearchUtils.breadth_first_foreach(self.map, [tile], maxDepth=4, foreachFunc=counter, noLog=True) 44 | 45 | 46 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hg4b0SBnn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M M M M M M M M 4 | M M M 5 | M M M M M M 6 | M M M M M M M 7 | M M M M 8 | M M M M 9 | M M M b2 M M 10 | M M M b2 b2 M M M M 11 | M b3 M C47 b2 M 12 | bG3 b2 b2 b2 b2 b2 b2 b2 b2 M M M 13 | b2 b2 b2 M M M 14 | b2 b2 M M M M 15 | b2 b2 M M M 16 | b2 M M M 17 | M b2 C49 M M M M M M M 18 | b2 C47 M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlfOpuNhn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M 4 | M 5 | M M M M M M 6 | M M M M M M M 7 | M M 8 | M M 9 | M M M M M 10 | M M M M M 11 | M M M 12 | M M C50 b2 b2 b2 b2 M M 13 | M b2 b2 b2 M M M 14 | b2 b2 M M M M M 15 | C48 b2 b2 b2 M M 16 | b2 b2 b2 M b2 M M M M M 17 | b2 bG3 b2 b2 b2 b2 M M 18 | b2 b2 b2 M M 19 | M C48 M M M M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Communication/TileCompressor.py: -------------------------------------------------------------------------------- 1 | import typing 2 | 3 | from base.client.map import MapBase, Tile 4 | 5 | 6 | class TileCompressor(object): 7 | def __init__(self, map: MapBase): 8 | self.map: MapBase = map 9 | 10 | def compress_tile(self, tile: Tile) -> str: 11 | return str(tile) 12 | 13 | def compress_tile_list(self, tiles: typing.List[Tile], charsLeft: int) -> str: 14 | compressed = [] 15 | for tile in tiles: 16 | if charsLeft < 5: 17 | break 18 | 19 | charsLeft -= 1 # separator 20 | c = self.compress_tile(tile) 21 | compressed.append(c) 22 | charsLeft -= len(c) 23 | 24 | return '|'.join(compressed) 25 | 26 | def decompress_tile(self, tileStr: str) -> Tile | None: 27 | try: 28 | xStr, yStr = tileStr.split(',') 29 | return self.map.GetTile(int(xStr), int(yStr)) 30 | except: 31 | return None 32 | 33 | def decompress_tile_list(self, tiles_str) -> typing.List[Tile]: 34 | individual = tiles_str.split('|') 35 | return [self.decompress_tile(s) for s in individual if self.decompress_tile(s) is not None] 36 | 37 | 38 | class ServerTileCompressor(TileCompressor): 39 | def __init__(self, map: MapBase): 40 | super().__init__(map) 41 | 42 | def compress_tile(self, tile: Tile) -> str: 43 | return str(tile.tile_index) 44 | 45 | def decompress_tile(self, tileStr: str) -> Tile | None: 46 | try: 47 | return self.map.get_tile_by_tile_index(int(tileStr)) 48 | except: 49 | return None 50 | 51 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlIacHHnh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M bG5 b2 M M M 3 | M b2 b2 b2 b2 b2 M M 4 | M b2 b2 M M b2 M M 5 | b2 b2 b2 b2 b2 b2 M M M M 6 | C43 b3 M M b2 b2 M M M M 7 | M b2 8 | M b2 M 9 | M M b2 M M M M M 10 | M M M M M 11 | M M M M M M M 12 | M M M M 13 | M M M M M M 14 | M M 15 | M M M M M M M 16 | M M 17 | M M M M M M 18 | M M M M 19 | M M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rePkW8Sn3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M M M M M M M 4 | M M M 5 | a2 a2 a2 M M M M 6 | M C44 aG3 a2 a2 M 7 | M a2 a2 M a2 M M 8 | a2 a2 a2 M M M M 9 | M M a2 a2 a2 a2 M M M 10 | C47 a2 a2 M 11 | M M a2 M M M M 12 | M M M a2 M M M M 13 | M M a2 a2 a2 M M 14 | M M a2 M M M M M 15 | M M a2 M M 16 | M M M 17 | M M M M M 18 | M M M M M M M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SxlKfy72h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M M 4 | M M M M M M 5 | M M M M M M M 6 | M M M 7 | M M M M 8 | M M M M M M M 9 | M 10 | M 11 | a2 a2 M M M M 12 | a2 M M M M 13 | M M a2 a2 a2 a2 a2 M M a2 M M M 14 | M C46 M M a2 a2 a2 M 15 | M M a2 C46 a2 M M 16 | M M a2 a2 a2 aG3 a2 a2 M 17 | M M M a2 M M M M 18 | M M M M a2 M M M M M M 19 | M M M a2 a2 a2 M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxBwTGBhh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M b2 b2 bG7 M 3 | M M b2 b2 b2 M M 4 | M b2 b2 M M 5 | M M M b2 b2 M 6 | M M M b2 b2 M 7 | M M M M M b2 b2 C48 M 8 | M M M M M b2 b2 b2 M 9 | M M M M M M M b2 M M M 10 | M M C46 b2 b2 M 11 | M M M M M b2 12 | M M M M 13 | M M M M M 14 | M M M M M M 15 | M M M M 16 | M M M M M 17 | M M M M 18 | M M M 19 | M M 20 | M M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgFvXQBhh-2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M b2 b2 M M M M M 3 | b2 b2 bG4 M M M M M M 4 | b2 M b2 b2 b2 b2 M M 5 | b2 b2 b2 M M 6 | b2 b2 M M M 7 | M b2 M M M M M M M 8 | b2 b2 b2 M 9 | M b2 M M M 10 | b2 b2 b2 b2 M M M M 11 | M M M M 12 | M M M M M 13 | M M M M M 14 | M M M M 15 | M M M M M M 16 | M M M M 17 | M M M M M 18 | M M M M M 19 | M M M M 20 | M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgqGZBS22.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M 3 | M M M M 4 | M M M M 5 | M M M 6 | M M M M M M M 7 | M M M M M M 8 | M M 9 | M M M M 10 | b2 b2 b2 b2 M 11 | b2 bG3 M M M 12 | b2 b2 b2 M M M M M M M 13 | b2 b2 b2 M M M M 14 | M b2 b2 b2 b2 M M C42 M M M 15 | b2 b2 b2 b2 b2 b2 b2 b2 b2 16 | M M M M M M 17 | M M M M 18 | M M M M 19 | M M M 20 | M M M M 21 | M M M M M 22 | M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/He2s-k7hn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M M b2 b2 b2 b2 4 | M M M b2 M bG3 b2 5 | M M b2 6 | M M b2 b2 b2 b2 b2 b2 b2 b2 b2 7 | M M M b2 M M b2 C44 8 | M b2 M M b2 b2 b2 b2 9 | M M M b2 10 | M M M 11 | M M M M M M 12 | M M M M M M 13 | M M M M 14 | M M M M M M 15 | M M M M 16 | M M M M 17 | M M M 18 | M M M M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxMIUIr22.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M C43 M M 3 | M M M b2 b2 bG3 b2 M 4 | M M C43 b2 b2 b2 b2 b2 b2 5 | M b2 b2 b2 b2 M b2 M 6 | M M M M M M M b2 M 7 | M M b2 8 | M M C43 M b2 M 9 | M M b2 b2 b2 b2 b2 b2 10 | b2 M 11 | M M M 12 | M M M M M M 13 | M M M M M M M M 14 | M M M M 15 | M M M M 16 | M M M M M M M 17 | M M M M 18 | M M 19 | M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HgwhkJ7n3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M 4 | M M M M 5 | M M M M M 6 | M M M M M M M 7 | M M M M M M M 8 | M M M M M M 9 | M M M M M M M 10 | M M a2 M M M M 11 | M M M a2 M M 12 | a2 M M M 13 | M M a2 M M M M M M 14 | M M a2 M M M 15 | a2 a2 a2 a2 a2 M M M 16 | a2 M a2 a2 a2 17 | M a2 a2 a2 a2 M M M M 18 | aG3 a2 a2 a2 a2 M 19 | M a2 M M M M M M M 20 | a2 21 | C42 M M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlETnAGnh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M 4 | M a2 M M 5 | a2 aG3 a2 M M M 6 | a2 a2 M M M M M M 7 | a2 a2 a2 a2 a2 a2 a2 a2 a2 M M M 8 | a2 a2 M M M M a2 M M M M M M 9 | a2 a2 a2 M a2 M M 10 | C40 a2 a2 M a2 11 | M M C40 M M 12 | M M 13 | M M 14 | M M M M 15 | M M M M M M M 16 | M M M M 17 | M M M M M 18 | M M M M M 19 | M M M M M 20 | M M M M 21 | M M M M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Se0L3QB2h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M 3 | M M M M M 4 | M M M M M 5 | M M M M M M 6 | M M 7 | M M M M M M M M 8 | a2 a2 a2 M M M M M 9 | a2 a2 C41 M M M M M 10 | a2 C42 a2 a2 a2 a2 M M M 11 | a2 a2 a2 a2 a2 a2 a2 M M 12 | a2 a2 M M M M M M M 13 | M aG3 a2 M M M M M 14 | a2 a2 M M M M 15 | M M a2 a2 16 | M M M M M M M 17 | M M 18 | M M M M M 19 | M M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/only_got_24_when_seems_easy_25__V1__turn50.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M 4 | 5 | M M M M M 6 | M M M M M 7 | M C41 M a2 M 8 | C45 a2 a2 a2 M M M 9 | M M a2 a2 M M 10 | M M M a2 M M M M M 11 | a2 M a2 M M M M M M M 12 | a2 M M a2 M M M M M M M M M 13 | a2 a2 aG4 a2 a2 a2 M M M 14 | M a2 M M M M M 15 | M a2 M M M M M 16 | a2 a2 a2 a2 a2 M M 17 | M M C42 18 | M M 19 | M M M M M 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SeD8j0G2n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M M 3 | M M M M M M 4 | M M M 5 | M M M M M M 6 | M M M 7 | M M M M M 8 | M M M M 9 | M M M 10 | M M M M M M b2 11 | M M M M M M M b2 12 | M M M b2 b2 b2 13 | M M M M M C46 b2 b2 b2 14 | M M M M b2 b2 b2 M 15 | M M M b2 b2 M M 16 | M M M M b2 b2 b2 M 17 | M M b2 b2 b2 b2 b2 18 | M M b2 bG3 b2 b2 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Sg4vSXS22.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M M 4 | M b2 M 5 | M M M b2 bG3 b2 6 | M b2 b2 b2 b2 b2 M 7 | M M M M b2 b2 b2 b2 8 | M M M b2 b2 b2 M M 9 | M M M b2 M b2 M M M 10 | M M M b2 M 11 | M M M M b2 12 | M M M C47 b2 13 | M M M M M b2 b2 M M 14 | M M M M M M b2 M M M 15 | M M M b2 16 | M M 17 | M M M 18 | M 19 | M M M M M M M 20 | M M M 21 | M M M 22 | M M M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgFvXQBhh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M M M M M M 4 | M M M 5 | M M 6 | M M M b2 7 | M M M M M M b2 M M 8 | M b2 b2 b2 b2 b2 b2 b2 b2 b2 9 | M M M bG4 b2 M 10 | M M b2 M M 11 | M b2 b2 b2 b2 b2 M M M 12 | M M M b2 b2 b2 M M 13 | M M b2 b2 M M M 14 | M M M M 15 | M M M M M M 16 | M M M M 17 | M M M M M 18 | M M M M M 19 | M M M M 20 | M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HgD_-ON23.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M 4 | M M M 5 | M M M M 6 | M M M M M M 7 | M M M M 8 | M M M 9 | M 10 | M M M M M M M 11 | M M M M M M 12 | M M M b2 M M 13 | b2 M b2 b2 b2 b2 M M 14 | b2 b2 b2 b2 b2 b2 b2 b2 b2 M 15 | M M b2 bG3 b2 b2 M b2 b2 M M M 16 | M M b2 b2 b2 b2 M M 17 | M M M M M M 18 | M M 19 | M M M M M M M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlP2aMB22.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M a2 aG4 a2 a2 a2 a2 M M 3 | M M M a2 a2 M M a2 C49 4 | a2 a2 a2 a2 M M M 5 | M M a2 a2 M M 6 | M a2 a2 a2 M 7 | M a2 M M 8 | M a2 a2 M M M 9 | M M M M a2 M M 10 | M a2 M M M M M 11 | M M a2 M 12 | M M M M M M M M 13 | M M M M M M 14 | M M M M M M M 15 | M M M M M M 16 | M M M 17 | M M M 18 | M M M M M M M 19 | M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Sgx9eiuE3n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | C48 bG4 b2 b2 M M M M 3 | M b2 b2 M M M 4 | b2 b4 M M M M M 5 | M M M M b2 b2 b2 b2 b2 M 6 | M M b2 M b2 b2 M 7 | M b2 M M M M M M M 8 | M b2 b2 M 9 | C45 M b2 b2 M 10 | M b2 M M M 11 | M b2 M 12 | C41 M 13 | M M M M 14 | M M M M M M M M 15 | M M M M M M 16 | M M M M M 17 | M M M M 18 | M M 19 | M M M M M M M 20 | M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgdB4LH33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M M M 4 | M M M M 5 | M M M M M 6 | M M M M M M 7 | M M M M M 8 | M M M M M M 9 | M M M M M 10 | M M M M M 11 | M b2 M M 12 | M M M b2 M 13 | M b2 b2 b2 M 14 | M C43 b2 M M 15 | M M M M b2 b2 M 16 | M M M b2 b2 M 17 | M b2 b2 b2 b2 18 | M M b2 b2 b2 b2 M 19 | M M b2 b2 b2 M 20 | M C44 b2 b2 bG3 b2 21 | M M M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/SymmetricTestMaps/even_playground_map_small__top_right_bot_left.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | 2 | M C45 M 3 | M C41 M 4 | M M 5 | M M M bG1 M 6 | M M M 7 | M M M M 8 | M C43 9 | M C47 M C39 10 | 11 | C39 M C47 M 12 | C43 M 13 | M M M M 14 | M M M 15 | M aG1 M M M 16 | M M 17 | M C41 M 18 | M C45 M 19 | | | | | | | | | | | | | | | | 20 | turn=383 21 | player_index=1 22 | aTiles=55 23 | aScore=148 24 | aStandingArmy=93 25 | aStars=55 26 | aCityCount=1 27 | aGeneral=13,1 28 | aKnowsKingLocation=True 29 | aDead=False 30 | aLeftGame=False 31 | aLeftGameTurn=-1 32 | bTiles=71 33 | bScore=159 34 | bStandingArmy=88 35 | bStars=57 36 | bCityCount=1 37 | bGeneral=6,13 38 | bKnowsKingLocation=False 39 | bDead=False 40 | bLeftGame=False 41 | bLeftGameTurn=-1 42 | bot_target_player=0 -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlIwySr23.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M a2 a2 3 | M a2 a2 a2 a2 aG3 a2 a2 a2 a2 M 4 | M a2 a2 M M 5 | M M M M a2 a2 M M M 6 | M M a2 M a2 a2 C45 M 7 | M M a2 a2 M a2 M M M 8 | M a2 a2 M 9 | M M M M a2 M 10 | M M a2 M M 11 | M M M M M 12 | M M 13 | M M M 14 | M M M M M M 15 | M M M 16 | M M M M M M 17 | M M M M M 18 | M M M M M 19 | M M M M M 20 | M M 21 | M 22 | M M M M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlzMJrSn2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | M M M M 4 | M M M M 5 | M M M 6 | M M M M M M M 7 | M M M M M M 8 | M M M M C40 b2 9 | M M M M M M M b2 M M 10 | M M M M M M b2 11 | M M M C48 b2 b2 b2 b2 12 | M M M M M b2 M b2 M 13 | M M M M M b2 M b2 14 | M M b2 M b2 15 | M M b2 b2 M M b2 b2 b2 b2 16 | M M b2 b2 bG3 b2 M M M 17 | M M b2 b2 M M 18 | M M M M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlptbLrn2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M 4 | M M M M b2 b2 b2 5 | C50 b2 b2 bG4 b2 b2 b2 M 6 | b2 b2 b2 M C47 C42 b2 M 7 | M M M M b2 M b2 b2 8 | M M b2 b2 b2 M M M 9 | M M M M M b2 M M 10 | M M b2 M 11 | M M b2 M M 12 | M M M M M b2 M 13 | M b2 M 14 | M M M 15 | M M M 16 | M M M M 17 | M M 18 | M M M M M 19 | M M M M M 20 | M M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/ExpandUtilsTestMaps/did_not_find_2_move_cap__turn34.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M 4 | M M M M 5 | M M M M M 6 | M M M M M M M M 7 | 8 | M M 9 | M M M M M M 10 | C49 b1 M M M M 11 | M C40 a2 b1 M M 12 | a1 M M M M M 13 | a1 a1 a1 M M M 14 | M a1 a1 M M M 15 | a1 C44 M M M M 16 | aG6 a1 a1 M M M M 17 | M M M 18 | M M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | 21 | targetPlayerExpectedGeneralLocation=9,6 22 | player_index=0 23 | bot_target_player=1 24 | aScore=17 25 | aTiles=11 26 | bScore=17 27 | bTiles=10 -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgRvX_Vh2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M 4 | M M M M M M M 5 | M M M M M 6 | M M M M M M 7 | M M M M M M 8 | M M 9 | M M M 10 | M M 11 | M M M M M M M M M 12 | M 13 | M M M M M M M 14 | M M M M M 15 | a2 M M M a2 a2 M a2 16 | a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 a2 17 | M M M M M M a2 aG4 M 18 | M M M M a2 M a2 19 | M M M M a2 a2 a2 20 | M M M M M C45 21 | M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxG_xQr2n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M 4 | M M M M 5 | M M M b2 M M 6 | M M b2 M M 7 | M M M b2 b2 M 8 | M M M M b2 9 | M M M b2 M M M M 10 | M M M M b2 M b2 11 | M M M M M M b2 M b2 M 12 | M M M b2 M b2 b2 13 | M M M M M b2 b2 b2 bG3 M 14 | M M M b2 b2 b2 15 | M M M M M b2 b2 M 16 | M M b2 b2 b2 M M 17 | M M M M 18 | M M M M M 19 | M 20 | M M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rlPnL_V3h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M 4 | M M M M 5 | M M M M 6 | M 7 | M M M M 8 | M M M M M 9 | M M M M 10 | M M M M M 11 | M C49 M 12 | M b2 b2 M 13 | M M b2 M C41 b2 M 14 | M M b2 M b2 M M 15 | b2 M b2 M b2 16 | b2 M b2 M M b2 17 | b2 b2 b2 b2 M M 18 | b2 b2 bG3 b2 b2 b2 b2 b2 b2 M 19 | M M C43 C50 20 | M M M M M M M M M M 21 | M M M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HeoR4BH32.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M a2 a2 M M 3 | M M M a2 a2 a2 a2 a2 a2 4 | M M M M M M a2 a2 aG3 C42 5 | M M M a2 a2 a2 M a2 6 | M M a2 M a2 a2 a2 M M M 7 | a2 C41 8 | M M M a2 M M 9 | M M M a2 M M 10 | a2 C45 M M 11 | M C42 a2 M M 12 | a2 M M 13 | M M 14 | M M M M M M 15 | M M M M M M M 16 | M M M 17 | M M 18 | M M M M 19 | M M M M 20 | M M M M M M 21 | M M M M 22 | M M M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgSJZd4hh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M 4 | M M M M 5 | M 6 | M M M 7 | M M M M 8 | M M M M M 9 | M M 10 | M M b2 b2 b2 b2 M 11 | M M b2 b2 b2 M b2 b2 12 | b2 M b2 b2 M M 13 | M C41 b2 b2 M M 14 | M M M M b2 15 | M M M M b2 b2 b2 bG4 M 16 | M M M b2 M b2 M M M 17 | M M M M b2 b2 18 | M M M M b2 M 19 | M M M M 20 | M M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Bl-KgQH3n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M M M 4 | M M M M M M 5 | M M M M M 6 | M M M M M 7 | M M 8 | M M M M M 9 | M M M M M M 10 | M M M M 11 | M M 12 | M M M 13 | M M M C43 b2 M M M M 14 | M M M b2 M M 15 | b2 M M M b2 16 | b2 M M M M C45 M b2 M M 17 | M b2 b2 bG3 b2 b2 M b2 b2 M M M 18 | M b2 b2 b2 b2 b2 b2 M M 19 | b2 b2 M M M M M 20 | b2 b2 b2 b2 M M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BlumhyQ22.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | 3 | M M M M M 4 | C41 a2 a2 M 5 | M a2 aG3 a2 a2 a2 6 | a2 a2 a2 a2 M a2 C41 M M M M 7 | M M a2 a2 M a2 a2 M M 8 | M a2 M a2 a2 M 9 | M a2 M M a2 M M 10 | M M M a2 M 11 | M M M M M M M a2 M M M M 12 | M M a2 M 13 | M a2 M M M 14 | M M M M M 15 | M M M 16 | M M M M M M M 17 | M M 18 | M M M M M 19 | M M M M M 20 | M M M M 21 | M M M M 22 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/redaEIShh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M a2 a2 M 4 | M M a2 a2 M 5 | M M a2 a2 M M M 6 | M a2 M M M M 7 | a2 aG4 a2 M M M M M M 8 | a2 C43 a2 a2 a2 a2 a2 M M M 9 | M a2 a2 M a2 M M 10 | M M a2 a2 M M 11 | M M M M a2 M M 12 | M M M a2 M M M 13 | M M M a2 M M M 14 | M M M M M M 15 | M M M M M M M 16 | M M M M 17 | M M M M M 18 | M M M M 19 | M M 20 | M 21 | M M M M M 22 | M M M M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgf5JVr23.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M 4 | M M 5 | M M 6 | M M M M M 7 | M 8 | M M M 9 | M M M 10 | M M M M M 11 | M M M M M 12 | M M 13 | M M M M M 14 | b2 b2 M M M M 15 | M M b2 M M M M M 16 | M b2 b2 b2 M 17 | M M b2 M M M M M M 18 | M b2 b2 M M M 19 | b2 M M b2 b2 M M M 20 | b2 b2 M M b2 M M M 21 | M b2 b2 b2 b2 M M M M 22 | M M bG4 b2 b2 b3 M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BxLPSUB33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M C45 b2 b2 M 3 | M M M M M b2 b2 b2 b2 bG3 M 4 | M M M b2 b2 M b2 M 5 | M b2 b2 b2 M b2 M 6 | M C43 b2 b2 M b2 b2 b2 7 | M b2 b2 b2 b2 b2 C44 8 | M b2 M M M M 9 | M M M 10 | M M M M 11 | M M M M 12 | M M M 13 | M M M M 14 | M M M M M 15 | M M M M M M 16 | M M 17 | M M M 18 | M M M M M M 19 | M M M M M M 20 | M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Models/Move.py: -------------------------------------------------------------------------------- 1 | from base.client.tile import Tile 2 | 3 | 4 | class MoveBase(object): 5 | def __init__(self, source: Tile, dest: Tile, move_half=False): 6 | self.source: Tile = source 7 | self.dest: Tile = dest 8 | self.move_half = move_half 9 | 10 | def __gt__(self, other): 11 | if other is None: 12 | return True 13 | return self.source.army - self.dest.army > other.source.army - other.dest.army 14 | 15 | def __lt__(self, other): 16 | if other is None: 17 | return False 18 | return self.source.army - self.dest.army < other.source.army - other.dest.army 19 | 20 | def __str__(self): 21 | moveHalfString = "" 22 | if self.move_half: 23 | moveHalfString = 'z' 24 | return f"{self.source.x},{self.source.y} -{moveHalfString}> {self.dest.x},{self.dest.y}" 25 | 26 | def __repr__(self): 27 | return str(self) 28 | 29 | def __hash__(self): 30 | return self.source.tile_index ^ (self.dest.tile_index << (2 if self.move_half else 5)) 31 | 32 | def __eq__(self, other): 33 | if isinstance(other, MoveBase): 34 | return self.source.tile_index == other.source.tile_index and self.dest.tile_index == other.dest.tile_index and self.move_half == other.move_half 35 | 36 | return False 37 | 38 | def toString(self) -> str: 39 | return str(self) 40 | 41 | 42 | class Move(MoveBase): 43 | def __init__(self, source: Tile, dest: Tile, move_half=False): 44 | super().__init__(source, dest, move_half) 45 | self.army_moved: int = source.army - 1 46 | if self.move_half: 47 | self.army_moved = (source.army - 1) // 2 48 | self.non_friendly = self.source.player != self.dest.player 49 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SeirZLS33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M M 4 | M M M M 5 | M M M M M M M M 6 | M M M M M M M M 7 | M M M M M M M 8 | M M M M M 9 | M M M M 10 | M b2 b2 M M M M 11 | M b2 b2 b2 b2 b2 b2 b2 b2 b2 M M 12 | b2 bG3 b2 b2 b2 M b2 b2 b2 13 | b2 b2 b2 b2 b2 b2 M C44 M 14 | M C44 M M M 15 | M M M M M M M M M M M M 16 | M M M 17 | M M 18 | M M M M M 19 | M M M 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # cppimport temp files 2 | 3 | .rendered.*.cpp 4 | *.pyd 5 | 6 | 7 | # Mac DS Store 8 | .DS_Store 9 | 10 | # Byte-compiled / optimized / DLL files 11 | __pycache__/ 12 | *.py[cod] 13 | *$py.class 14 | 15 | # C extensions 16 | *.so 17 | 18 | # Stupid vs stuff 19 | *.suo 20 | 21 | # Distribution / packaging 22 | .Python 23 | env/ 24 | build/ 25 | develop-eggs/ 26 | dist/ 27 | downloads/ 28 | eggs/ 29 | .eggs/ 30 | lib/ 31 | lib64/ 32 | parts/ 33 | sdist/ 34 | var/ 35 | *.egg-info/ 36 | .installed.cfg 37 | *.egg 38 | 39 | # PyInstaller 40 | # Usually these files are written by a python script from a template 41 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 42 | *.manifest 43 | *.spec 44 | 45 | # Installer logs 46 | pip-log.txt 47 | pip-delete-this-directory.txt 48 | 49 | # Unit test / coverage reports 50 | htmlcov/ 51 | .tox/ 52 | .coverage 53 | .coverage.* 54 | .cache 55 | nosetests.xml 56 | coverage.xml 57 | *,cover 58 | .hypothesis/ 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | target/ 80 | 81 | # IPython Notebook 82 | .ipynb_checkpoints 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # celery beat schedule file 88 | celerybeat-schedule 89 | 90 | # dotenv 91 | .env 92 | 93 | # virtualenv 94 | venv/ 95 | ENV/ 96 | 97 | # Spyder project settings 98 | .spyderproject 99 | 100 | # Rope project settings 101 | .ropeproject 102 | 103 | # Wildcard Ignore 104 | *_ignore.* 105 | 106 | # VsCode 107 | .vscode/ 108 | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Bg3razBn3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M b2 b2 M M M 4 | M M bG3 b2 b2 b2 b2 M 5 | b2 b2 b2 M b2 M M 6 | b2 b2 b2 b2 b2 b2 M 7 | b2 C44 b2 b2 M M M M M 8 | M M M b2 b2 M M M M M 9 | M M b2 b2 10 | M M M C47 b2 M M M M M 11 | M M M 12 | M M 13 | M M M M M M M 14 | M M M M M M 15 | M M M M 16 | M M M M M M 17 | M M M 18 | M M M M 19 | M M M M M 20 | M M M M M 21 | M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hxw4hwNn3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M 3 | M M b2 bG3 b2 b2 M M 4 | M M b2 b2 M b2 M M 5 | M M M b2 b2 M b2 M 6 | M b2 b2 b2 b2 b2 M 7 | M M b2 M M b2 M M M 8 | M M b2 M M M 9 | M M b2 M 10 | M M b2 b2 M M 11 | M M b2 M M 12 | M b2 M M M 13 | M M b2 C43 M 14 | M M b2 M 15 | M M M M 16 | M M M M M 17 | M M M M 18 | M M M 19 | M M M 20 | M M M 21 | M M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hlel5QBn2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M 4 | M M M M 5 | M M M 6 | M M M b2 7 | M M M b2 b2 bG3 b2 8 | M M M b2 M b2 b2 9 | M M M b2 b2 b2 b2 b2 M M 10 | M M M M M M M b2 b2 b2 M 11 | M M b2 M b2 M 12 | M M C41 b2 M M 13 | M M b2 b2 b2 b2 b2 b2 14 | M M M M M 15 | M M M M M M 16 | M M M M 17 | M M M M M 18 | M M M M 19 | M M M M M 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgHFQ8Bhh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M C45 a2 a2 M 3 | M M M M M M aG3 a2 4 | M M a2 a2 a2 a2 a2 a2 a2 a2 a2 5 | M M M a2 a2 a2 M a2 a2 a2 a2 M 6 | M M M M a2 M a2 a2 M M M 7 | M a2 a2 M 8 | M M M 9 | M M M M M M M 10 | M M M M M M 11 | M M M M M M 12 | M M M M M M M M 13 | M M M M 14 | M 15 | M M M M M 16 | M 17 | M M M 18 | M M M M M M 19 | M M M M 20 | M M M 21 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/suboptimal_cramped_spawn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M 4 | M M M M M M 5 | M M M M 6 | M M M M 7 | M M M M M 8 | M M M 9 | M 10 | M M M M M 11 | M M M M M M M 12 | M M M M 13 | M M M M 14 | M M 15 | M M M M M aG1 16 | M M 17 | M M M M 18 | M M M M 19 | M M M M M 20 | M M M 21 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Bly3eEH3h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M b2 b2 b2 b2 4 | M M M bG4 b2 b2 5 | M M M b2 b2 6 | M b2 b2 C49 7 | M M M M M b2 b2 b2 8 | M M M M b2 b2 9 | M M M M M M b2 b2 b2 C47 b2 10 | M M M b2 M 11 | M M M M M b2 M M 12 | M M b2 M M 13 | M M M M b2 14 | M M M 15 | M M M M M 16 | M M M M M M 17 | M M 18 | M M M M M 19 | M M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HegGvmHhn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M 4 | M M M M 5 | M M C43 6 | M M M M a2 7 | M M M a2 M 8 | M M a2 a2 9 | M M M M M M M M M a3 aG3 10 | M a2 a2 M M M a2 11 | M M M M M a2 a2 a2 a2 M a2 a2 12 | M M M a2 a2 a2 a2 13 | M M M M M M M a2 M 14 | M M M M a2 a2 a2 15 | M M a2 M 16 | M M M 17 | M M M M M M 18 | M M M M M 19 | M M M 20 | M M M M M M M 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /base/Colors.py: -------------------------------------------------------------------------------- 1 | BLACK = (0, 0, 0) 2 | GRAY_DARK = (52, 52, 52) 3 | UNDISCOVERED_GRAY = (110, 110, 110) 4 | NEUT_CITY_GRAY = (90, 90, 90) 5 | GRAY = (160, 160, 160) 6 | LIGHT_GRAY = (200, 195, 190) 7 | WHITE = (255, 255, 255) 8 | RED = (200, 40, 40) 9 | ORANGE = (220, 150, 40) 10 | LIGHT_BLUE = (4, 160, 200) 11 | LIGHT_PINK = (170, 138, 141) 12 | PURPLE = (190, 30, 210) 13 | DARK_PURPLE = (140, 0, 180) 14 | CHOKE_PURPLE = (93, 0, 111) 15 | GOLD = (218, 165, 32) 16 | 17 | DARK_GREEN = (5, 75, 45) 18 | DARK_RED = (100, 5, 35) 19 | 20 | OFF_BLACK = (40, 40, 40) 21 | WHITE_PURPLE = (255, 230, 240) 22 | 23 | P_RED = (255, 0, 0) 24 | P_LIGHTBLUE = (39, 146, 255) 25 | P_GREEN = (0, 128, 0) 26 | P_TEAL = (0, 128, 128) 27 | P_ORANGE = (255, 117, 21) 28 | P_PINK = (240, 50, 230) 29 | P_PURPLE = (128, 0, 128) 30 | P_MAROON = (155, 1, 1) 31 | P_YELLOW = (179, 172, 50) 32 | P_BROWN = (154, 94, 36) 33 | P_BLUE = (16, 49, 255) 34 | P_PURPLEBLUE = (89, 76, 165) 35 | P_YELLOWGREEN = (133, 169, 28) 36 | P_LIGHTRED = (248, 115, 117) 37 | P_LIGHTPURPLE = (180, 127, 202) 38 | P_LIGHTBROWN = (180, 153, 113) 39 | 40 | # P_BRIGHT_GREEN = (10,225,90) 41 | PLAYER_COLORS = [ 42 | P_RED, 43 | P_LIGHTBLUE, 44 | P_GREEN, 45 | P_TEAL, 46 | P_ORANGE, 47 | P_PINK, 48 | P_PURPLE, 49 | P_MAROON, 50 | P_YELLOW, 51 | P_BROWN, 52 | P_BLUE, 53 | P_PURPLEBLUE, 54 | P_YELLOWGREEN, 55 | P_LIGHTRED, 56 | P_LIGHTPURPLE, 57 | P_LIGHTBROWN, 58 | ] 59 | 60 | TWO_VS_TWO_PLAYER_COLORS = [ 61 | P_RED, 62 | P_PURPLE, 63 | P_LIGHTBLUE, 64 | P_GREEN, 65 | P_TEAL, 66 | P_ORANGE, 67 | P_PINK, 68 | P_MAROON, 69 | P_YELLOW, 70 | P_BROWN, 71 | P_BLUE, 72 | P_PURPLEBLUE, 73 | P_YELLOWGREEN, 74 | P_LIGHTRED, 75 | P_LIGHTPURPLE, 76 | P_LIGHTBROWN, 77 | ] -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgFOnJX32.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M 3 | M M M b2 b2 b2 b2 M 4 | M M M b2 b2 bG3 5 | M M M M b2 b2 b2 6 | M M M M b2 M b2 7 | M M M b2 b2 b2 b2 b2 b2 8 | M M M M b2 M C41 9 | M M M b2 M M 10 | b2 b2 b2 b2 b2 M 11 | M C49 C42 M 12 | M M M M 13 | M M M M 14 | M M M 15 | M M M M M M 16 | M M M M M 17 | M M M M M M M M M M 18 | M M M M M M M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/SymmetricTestMaps/even_playground_map_small__top_left_bot_right.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | 2 | M C45 M 3 | M C29 4 | M M 5 | M aG1 M C41 M 6 | M M M M 7 | M M M 8 | M M M M 9 | C39 M M M 10 | C43 M M M C43 11 | M M M C39 12 | M M M M 13 | M M M 14 | M M M M 15 | M C41 M bG1 M 16 | M M 17 | C29 M 18 | M C45 M 19 | | | | | | | | | | | | | | | | 20 | turn=383 21 | player_index=1 22 | aTiles=55 23 | aScore=148 24 | aStandingArmy=93 25 | aStars=55 26 | aCityCount=1 27 | aGeneral=13,1 28 | aKnowsKingLocation=True 29 | aDead=False 30 | aLeftGame=False 31 | aLeftGameTurn=-1 32 | bTiles=71 33 | bScore=159 34 | bStandingArmy=88 35 | bStars=57 36 | bCityCount=1 37 | bGeneral=6,13 38 | bKnowsKingLocation=False 39 | bDead=False 40 | bLeftGame=False 41 | bLeftGameTurn=-1 42 | bot_target_player=0 -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/290.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | b2 b2 b2 b2 b1 b1 b1 b1 M M 3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M 4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M 5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M 6 | M M M b1 b1 M b1 b5 a1 M M 7 | M b1 M M b3 M a1 M M 8 | M C48 b1 b1 b1 b1 b30 a2 M M 9 | M M b3 b3 b2 b2 b6 M a2 M 10 | M M a1 a1 a1 b3 a1 M 11 | M M a1 a1 a1 b3 a1 M 12 | M M M a2 a1 a1 M a4 a3 C48 13 | M M M a2 a2 C45 M M a4 a4 14 | M M b4 M M a2 a4 a3 15 | M b1 b1 M M M b1 a2 M a4 16 | M C42 b1 b2 b1 b1 b1 M M M 17 | M b1 b1 b1 b1 b1 b2 M C48 M 18 | M M b3 b2 b2 b1 b6 b2 b2 bG28 b1 19 | M M b3 b2 b2 M b2 b2 M b2 20 | M M M b3 b2 b3 b3 b2 b2 C50 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/291.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | b2 b2 b2 b2 b1 b1 b1 b1 M M 3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M 4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M 5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M 6 | M M M b1 b1 M b1 b5 a1 M M 7 | M b1 M M b3 M a1 M M 8 | M C48 b1 b1 b1 b1 b1 b27 a2 M M 9 | M M b3 b3 b2 b2 b6 M a2 M 10 | M M a1 a1 a1 b3 a1 M 11 | M M a1 a1 a1 b3 a1 M 12 | M M M a2 a1 a1 M a1 a1 C48 13 | M M M a2 a2 C45 M M a1 a4 14 | M M b4 M M a62 a1 a1 15 | M b1 b1 M M M b1 a2 M a4 16 | M C42 b1 b2 b1 b1 b1 M M M 17 | M b1 b1 b1 b1 b1 b2 M C48 M 18 | M M b3 b2 b2 b1 b6 b2 b2 bG28 b1 19 | M M b3 b2 b2 M b2 b2 M b2 20 | M M M b3 b2 b3 b3 b2 b2 C50 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HljfIQB33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M 4 | M M M M M M M 5 | M M M 6 | M M M M M 7 | M M M M M 8 | M M M M 9 | M M M 10 | M M M M M M M 11 | M M M M M M 12 | M M M M 13 | M 14 | a2 a2 M M M M 15 | a2 M M M M M 16 | M a2 M M M 17 | C47 a2 a2 M M M M M 18 | a2 M a2 M M M M 19 | a2 a2 a2 M M 20 | a2 a2 a2 a2 a2 a2 M M M M M 21 | M M a2 aG3 a2 M M 22 | M M M a2 a2 a4 M M M M 23 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/SymmetricTestMaps/even_playground_map_small_short_spawns__top_left_bot_right.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | 2 | M C45 M 3 | M C29 4 | M M 5 | M M C41 M 6 | aG1 M M M 7 | M M M 8 | M M M M 9 | C39 M M M 10 | C43 M M M C43 11 | M M M C39 12 | M M M M 13 | M M M 14 | M M M bG1 15 | M C41 M M 16 | M M 17 | C29 M 18 | M C45 M 19 | | | | | | | | | | | | | | | | 20 | turn=383 21 | player_index=1 22 | aTiles=55 23 | aScore=148 24 | aStandingArmy=93 25 | aStars=55 26 | aCityCount=1 27 | aGeneral=13,1 28 | aKnowsKingLocation=True 29 | aDead=False 30 | aLeftGame=False 31 | aLeftGameTurn=-1 32 | bTiles=71 33 | bScore=159 34 | bStandingArmy=88 35 | bStars=57 36 | bCityCount=1 37 | bGeneral=6,13 38 | bKnowsKingLocation=False 39 | bDead=False 40 | bLeftGame=False 41 | bLeftGameTurn=-1 42 | bot_target_player=0 -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/292.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | b2 b2 b2 b2 b1 b1 b1 b1 M M 3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M 4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M 5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M 6 | M M M b1 b1 M b1 b5 a1 M M 7 | M b1 M M b3 M a1 M a1 M 8 | M C48 b1 b1 b1 b1 b1 b1 b24 a1 M M 9 | M M b3 b3 b2 b2 b6 M a2 M a1 10 | M M a1 a1 a1 b3 a1 M 11 | M M a1 a1 a1 b3 a1 M 12 | M M M a2 a1 a1 M a1 a1 C48 13 | M M M a2 a2 C45 M M a1 a4 14 | M M b4 M M a1 a1 a1 15 | M b1 b1 M M M b1 a63 M a4 16 | M C42 b1 b2 b1 b1 b1 M M M 17 | M b1 b1 b1 b1 b1 b2 M C48 M 18 | M M b3 b2 b2 b1 b6 b2 b2 bG29 b1 19 | M M b3 b2 b2 M b2 b2 M b2 20 | M M M b3 b2 b3 b3 b2 b2 C50 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/Defense/FailedToExecuteValidDefenseGather_Turn291/293.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | b2 b2 b2 b2 b1 b1 b1 b1 M M 3 | b2 b2 b2 M b2 b2 b1 b1 b1 M M M 4 | b2 b2 b2 b1 M b2 b2 b2 b3 b1 a2 M 5 | b1 b1 b1 b1 b1 b3 b1 b1 b1 a1 M 6 | M M M b1 b1 M b1 b5 a1 M M 7 | M b1 M M b3 M a1 M a1 M 8 | M C48 b1 b1 b1 b1 b1 b1 b24 a1 M M 9 | M M b3 b3 b2 b2 b6 M a2 M a1 10 | M M a1 a1 a1 b3 a1 M 11 | M M a1 a1 a1 b3 a1 M 12 | M M M a2 a1 a1 M a1 a1 C48 13 | M M M a2 a2 C45 M M a1 a4 14 | M M b4 M M a1 a1 a1 15 | M b1 b1 M M M a61 a1 M a4 16 | M C42 b1 b2 b1 b1 b1 M M M 17 | M b1 b1 b1 b1 b1 b2 M C48 M 18 | M M b3 b2 b2 b1 b6 b2 b2 bG29 b1 19 | M M b3 b2 b2 M b2 b2 M b2 20 | M M M b1 b4 b3 b3 b2 b2 C50 21 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlHhaQSh3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M b2 bG3 b2 b2 b2 b2 M M 3 | M M b2 b2 M M M M 4 | C42 b2 b2 b2 M 5 | M M b2 b2 b2 b2 M M M 6 | M b2 C40 M b2 b2 b2 M M 7 | b2 b2 M M b2 b2 M M M M 8 | b2 M b2 9 | M M M M M M M 10 | M M M M M M 11 | M M 12 | M M M M M M 13 | M M M 14 | M M M M M M M 15 | M M M M M M 16 | M M M M M M 17 | M M M M M M 18 | M 19 | M M 20 | M M M M 21 | M M M M M M 22 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HeHkLSS2h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M M 4 | M M 5 | M M M M M M M M 6 | M 7 | M M M M M M M 8 | M M M M M M 9 | M M M M M 10 | M M M M M M 11 | M M M M M M 12 | M M b2 M M M M M M 13 | M M b2 b2 M M M M b2 M 14 | b2 b2 b2 M b2 15 | M M b2 b2 M b2 M 16 | M M M M M b2 b2 b2 M 17 | M M M M b2 b2 b2 b2 b2 M M M 18 | M M M M b2 b2 b2 M M 19 | M M M b2 bG3 b2 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rg80UIr22.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | C50 aG5 M M M M 3 | M a2 M M M 4 | M M a2 a2 a2 M M 5 | M a2 a2 a2 a2 M M M M M 6 | M a2 a2 a2 a2 a2 M M 7 | M a2 M a2 M M M M 8 | a2 M M M 9 | M M M a2 M M M 10 | M M a2 M M M M M 11 | a2 M M M M M 12 | M M a2 M M M M M M 13 | a2 a2 M M M M M 14 | M M M M M M 15 | M M M 16 | M M M M M M 17 | M M M M 18 | M M M M M M M M 19 | M M M M M M M M 20 | M M 21 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BezNrON2n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M 4 | M 5 | M M M 6 | M M M M M M 7 | M M M M M M 8 | M M M M M M 9 | M M M M M 10 | M M M M M 11 | M M M 12 | M M M M M M 13 | M M M M M M M 14 | M M M M M 15 | M M M M 16 | M M M b2 17 | M C49 b2 M M 18 | b2 b2 M M M M b2 M M 19 | b2 b2 M M b2 b2 M M M M M 20 | b2 b2 M b2 b2 b2 b2 M M M M 21 | b2 M b4 b2 b2 M M M M M 22 | b2 b2 bG3 b2 C40 M M M M 23 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BgJTiGrhh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | C45 M M M M 3 | M M a2 a2 aG3 a2 a2 a2 M 4 | M M a2 a2 a2 a2 a2 M M 5 | M M M a2 M a2 M M 6 | M M a2 a2 M M 7 | M a2 a2 M M 8 | M M M a2 a2 M M 9 | M M M M M a2 M M M M 10 | M a2 a2 M M M M 11 | M M a2 M M 12 | M a2 M M 13 | M M M M a2 M M 14 | M M M M M 15 | M M M M 16 | M 17 | M M M M M 18 | M M M 19 | M M M 20 | M M M 21 | M M M M M M 22 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hej7Uy7hh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M M 4 | M M 5 | M 6 | M M M M 7 | M 8 | M M M M 9 | M M M M 10 | M M M M 11 | M M M M M 12 | M M M M M M 13 | M b2 M M 14 | M b2 M b2 b2 15 | M M b2 b2 b2 b2 b2 b2 b2 b2 M M 16 | b2 b2 b2 b2 C41 b2 b2 M M M M 17 | M b2 bG3 b2 b2 b2 b2 M M M M 18 | M b2 M M 19 | M M 20 | M M M M M 21 | M M M M M M 22 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgUaZNrhn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M 4 | M M M M M M M 5 | M M M M M 6 | M M M M 7 | M M M M 8 | M M M M M M 9 | M M M M M 10 | M M M 11 | M M M M M M M 12 | M M M M M M M 13 | M 14 | M M M C48 M 15 | M a2 a2 M 16 | M M M a2 a2 M 17 | M M a2 M M M M M 18 | M a2 M a2 a2 M M 19 | M M M a2 a2 M a2 a2 a2 M M M 20 | M M a2 a2 a2 a2 a2 M M M 21 | M M M a2 a2 a2 a2 M 22 | M M M aG3 a2 a2 M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/reWN0_N3n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M 4 | M M M M M M 5 | M M M M M M 6 | M M M M 7 | M M C46 a2 a2 a2 a2 a2 8 | M a2 M M M M 9 | a2 M M M M 10 | M a2 M M M 11 | M a2 M M 12 | a2 a2 M M 13 | M M a2 a2 M M M 14 | M M M a2 a2 M M 15 | a2 aG3 M M 16 | M a2 a2 M M M M M 17 | a2 a2 C50 a2 M M M 18 | M M a2 a2 a2 M M 19 | M M M M M M M M M M 20 | M M M M M 21 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SggmLNS23.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M 4 | M M M M C44 b2 b2 M 5 | M M M M M b2 b2 b2 b2 b2 b2 b2 bG3 b2 6 | M M b2 C50 b2 M M b2 b2 7 | b2 M M M b2 M M b2 M 8 | M M b2 b2 b2 b2 b2 b2 9 | M M M b2 M M M 10 | M M M M 11 | M M M M M 12 | M M M 13 | M M M M M M 14 | M M M 15 | M M M M M M M 16 | M M M M M M M 17 | M M M M M 18 | M M M M 19 | M M 20 | M M M 21 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BlTlBXHhh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | a2 a2 a2 aG3 M M M M 4 | a2 a2 a2 a2 a3 M M M M M M M 5 | M a2 a2 M M M M M M 6 | a2 a2 a2 a2 M M M 7 | a2 a2 M M M M 8 | M a2 M M a2 M M M 9 | M a2 a2 a2 M M M M M M 10 | a2 a2 M 11 | M M M M M M M 12 | M 13 | M M M M M M M M 14 | M M M M 15 | M 16 | M M M M 17 | M M M M M M M M M 18 | M M M M M 19 | M M M M M 20 | M M M M 21 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxHtxSH33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M M 4 | M M M 5 | M M 6 | M M M M M M 7 | M M M M 8 | M M M M M M M 9 | M M M M M 10 | M M M M M M M M 11 | M M M M M 12 | M M M c2 c2 c2 c2 c2 c2 M 13 | M M c2 c2 c2 M c2 c2 c2 c2 c2 c2 cG3 c2 14 | M M M c2 c2 c2 c2 c2 c2 c2 c2 15 | M M M M M M M 16 | M M M 17 | M M M M 18 | M M M M 19 | M M M M M M 20 | M M M 21 | | | | | | | | | | | | | | | | | | | | 22 | gTiles=13 -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgHhXISh3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M M M M M M M M M M 4 | M M M M 5 | M M M M M M M 6 | M M M M M M 7 | M 8 | M M M 9 | C49 M M 10 | a2 a2 a2 a2 M M M M M 11 | a2 a2 a2 a2 M M C46 M M M M M 12 | a2 M a2 a2 a2 a2 a2 a2 a2 13 | a2 a2 a2 a2 a2 a2 M M M M M 14 | aG5 M M M M M 15 | M M M M M 16 | M M 17 | M M M M M M 18 | M M M M M 19 | M M M M M 20 | M M 21 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hx93YGrhh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M M M M M M 4 | M M 5 | M M M M M M 6 | M M M 7 | M M M M M 8 | M M M M M M 9 | M M M M 10 | M M M M M M M 11 | M b2 M M 12 | b2 b2 M M M M M M 13 | M M b2 b2 M M M M 14 | M b2 M M M b2 b2 M M 15 | M M b2 b2 b2 M M M b2 M M M M 16 | M M M M b2 M b4 M b2 M M 17 | M M M b2 b2 b2 b2 b2 M 18 | M M M M bG3 b2 M 19 | M M b2 M 20 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SexP7Xrnh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M a2 a2 a2 M 3 | M a2 a2 a2 a2 a2 M M M M 4 | M aG3 a2 a2 a2 a2 M M M M 5 | M M a2 C46 a2 M M 6 | M M M M a2 a2 a2 M a2 M 7 | M M M C48 M M a2 M M 8 | M M M a2 a2 a2 a2 M M 9 | M M a2 M M 10 | M M M M 11 | M M M M M 12 | M M M M M M 13 | M M M M M 14 | M M M M 15 | M M M 16 | M M M 17 | M M 18 | M M M M M M M 19 | M M M M M M 20 | M M M 21 | M M 22 | M M M M 23 | M M M M M 24 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Sx5edQSh3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M 4 | M M M M M M 5 | M 6 | M M M M 7 | M M M M M M 8 | M M M M 9 | M M b2 M M M 10 | M M b2 b2 M 11 | M M M M M b2 M M 12 | M M M M M M b2 M M 13 | M M M b2 14 | M b2 M M M M M 15 | M M M b2 M M 16 | M M b2 M M 17 | M M M C44 b2 C43 b2 b2 b2 b2 M 18 | M M M M b2 M b2 b2 b2 M 19 | M M C42 b2 M b2 b2 20 | M M b2 b2 bG3 b2 M M 21 | M M M 22 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxH5fSrnn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M 3 | M M M 4 | M M M M M M 5 | M M 6 | M M M M 7 | M M M M 8 | M M M M M 9 | M M M M 10 | M M M M 11 | M M M M M M 12 | M M M M M M a2 M 13 | M M M M M a2 M 14 | M M M a2 a2 M 15 | M M M a2 a2 a2 16 | M M M M a2 a2 a2 17 | M M C45 a2 a2 a2 M aG4 C49 18 | M a2 M a2 M M M a2 M 19 | M M M a2 a2 a2 a2 M a2 20 | M M M M M M a2 21 | M a2 22 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxndAk7nh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | M M M M M M 4 | M M M M 5 | M M M M 6 | M M M M M 7 | M M M 8 | M M M 9 | M M M M M M 10 | M M M M M M 11 | M M M M 12 | M M M M M M 13 | M M M 14 | M M M M M M M 15 | b2 b2 b2 b2 b2 M M M 16 | b2 b2 M M b2 b2 M M M M 17 | b2 M M M M M M M M 18 | M b2 b2 b2 C47 M M 19 | M b2 M b2 b2 M 20 | b2 bG5 M M M M 21 | b2 C48 b2 M M M 22 | b2 b2 b2 M M M M M M 23 | M M M M M M M 24 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HeSDjQS3h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M 4 | M M M M M 5 | M M M M 6 | M M M M M M M M 7 | M M M M M 8 | M M M 9 | M M M 10 | M M M 11 | M M M M b2 M M 12 | M M b2 C41 M 13 | M M b2 M M M M M 14 | M b2 b2 M M M M M M 15 | M M M b2 M M C44 M M M 16 | b2 M M b2 M M M M M 17 | b2 b2 b2 b2 b2 M M 18 | M M b2 b2 M 19 | M M b2 b2 b2 M M 20 | M b2 bG3 b2 b2 M M 21 | M b3 b2 M M M M 22 | M M M M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgvtA4Bh2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M 4 | M M M 5 | M M b2 b2 6 | M M M M b2 bG3 b2 7 | M M M b2 b2 b2 8 | M M b2 b2 b2 9 | b2 b2 M M 10 | M M M M b2 b2 M M M 11 | M M M b2 b2 M 12 | M M M M b2 b2 b2 M 13 | M M M C48 b2 M 14 | M M M M b2 M 15 | M M M b2 M 16 | M M M M M b2 17 | M b2 18 | M M M M C48 19 | M M M 20 | M M M 21 | M M M 22 | M M M M 23 | M M M M M 24 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/produced_invalid_plan_01.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M 4 | M 5 | M M M M M M M 6 | M M M M M M 7 | M M M 8 | M M 9 | M M M M M 10 | M M M M 11 | M M M M 12 | M M M M M M M 13 | M M M M M M 14 | M M M M M 15 | M 16 | M M M M M M M 17 | M M M M M M 18 | M M M M M 19 | M M M 20 | M aG1 21 | M M M 22 | M M M M M M M M M M M 23 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BxfoIQB3h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M 4 | M M M M M 5 | M M M 6 | M M M M M 7 | M M M M M M M M M 8 | M M M M M M 9 | M M b2 10 | M M M b2 b2 b2 b2 b2 b2 b2 b2 11 | b2 b2 b2 M 12 | M b2 b2 b2 b2 b2 b2 b2 M M 13 | M M M M C43 b2 C48 M M 14 | M M b2 b2 b2 bG3 b2 M 15 | M M M M M 16 | M M M M M 17 | M M M M M 18 | M M M M 19 | M M M M M M M 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SxfUErHn2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M M M M M 4 | M M M M M b2 M M 5 | M M M M b2 bG3 M 6 | M M M b2 b2 b2 b2 M 7 | M M C48 b2 b2 b2 b2 8 | M M b2 b2 b2 9 | M M M M M M b2 b2 b2 b2 10 | M M M M M M M b2 b2 M 11 | M M M M M M b2 12 | M M M b2 13 | M M M b2 b2 M 14 | M M M M b2 M 15 | M M M M 16 | M M M M M 17 | M M M 18 | M M M M 19 | M M 20 | M M M M 21 | M M M M 22 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rxqO5BHn3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M 3 | M M M M M M M 4 | M M M M C48 b2 b2 5 | M M C49 M b2 b2 b2 b2 b2 bG3 M 6 | M M b2 b2 b2 b2 b2 b2 b2 M b2 b2 b2 7 | M M C41 M M b2 M M b2 8 | M M M M M M b2 b2 b2 9 | M M M b2 b2 M 10 | M M M M M M M 11 | M M M M M 12 | M M M M M M 13 | M M M M M M M 14 | M 15 | M M M M 16 | M M M M M 17 | M M M M 18 | M M M M M M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BxWpRtqa3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M M 3 | M M M M 4 | M M M M M M M M M 5 | M M M M 6 | M M M M C43 M M M 7 | M M M M a2 8 | C50 a2 M a2 a2 a2 a2 9 | a2 a2 a2 M M a2 M M 10 | M a2 a2 M C41 a2 11 | M a2 a2 M M a2 C46 M M M M M 12 | M a2 a2 a2 a2 a2 a2 13 | M M aG5 C48 M M M 14 | M M M M M M 15 | M M 16 | M M M 17 | M M M M 18 | M M 19 | M M M 20 | | | | | | | | | | | | | | | | | | | 21 | targetPlayerExpectedGeneralLocation=14,5 22 | turn=50 23 | player_index=0 24 | aTiles=23 25 | aScore=49 26 | aStandingArmy=26 27 | aStars=54 28 | aCityCount=1 29 | aGeneral=4,11 30 | aKnowsKingLocation=False 31 | aDead=False 32 | aLeftGame=False 33 | aLeftGameTurn=-1 34 | bTiles=22 35 | bScore=48 36 | bStandingArmy=26 37 | bStars=51 38 | bCityCount=1 39 | bKnowsKingLocation=False 40 | bDead=False 41 | bLeftGame=False 42 | bLeftGameTurn=-1 43 | bot_target_player=-1 -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SgnskXHn2.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | M M M M 4 | M M M M M M 5 | M M M M M M 6 | M M M M M 7 | M M M M M 8 | b2 M M 9 | b2 M b2 b2 b2 M M 10 | b2 M b2 b2 b2 M C40 M M M 11 | M M b2 b2 b2 M b2 b2 b2 M 12 | M M C41 b2 bG3 b2 M b2 b2 b2 M M 13 | M M C48 b2 b2 M C43 b2 b2 M M M 14 | M M M M 15 | M M M M 16 | M M M M 17 | M M M M 18 | M M M M 19 | M M M M M M M 20 | M M M M M M 21 | M 22 | M M M M 23 | M 24 | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/242.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M 3 | M M M b1 b1 M M 4 | M M b1 M M M M M 5 | b1 b2 M b1 M 6 | C48 M b1 b1 b1 b1 M 7 | b1 b1 b1 b2 b2 b3 b1 b3 b1 M M M 8 | b1 b1 b1 M b2 b2 b4 b2 b1 b2 M M 9 | C42 M M b1 b2 b1 b2 C41 M M 10 | M C48 M b10 b1 b1 bG15 b1 b2 b2 b2 M M 11 | M b1 b1 b1 b2 b1 b1 M b1 b1 b2 b2 12 | M M M b1 a33 b2 b1 b1 M b2 M 13 | M M b3 b1 a1 b5 b1 b1 M M M 14 | a1 a1 C41 C45 a1 M a1 b2 M M 15 | M a1 b2 a2 a1 a1 a1 a1 b1 b1 M M M 16 | a1 M b2 a0 b2 C43 M a2 a1 17 | M a1 a2 a1 M a1 N3 M M M 18 | a2 a3 a1 a1 a1 M M M M 19 | a2 a3 a3 a3 a3 M M M 20 | C41 a3 a3 a3 M 21 | M 22 | | | | | | | | | | | | | | | | | | | 23 | targetPlayerExpectedGeneralLocation=3,18 24 | bScore=123 25 | aScore=116 26 | bTiles=66 27 | aTiles=61 28 | bCityCount=1 29 | aCityCount=1 30 | bot_target_player=0 31 | player_index=1 -------------------------------------------------------------------------------- /Tests/Defense/FailedToFindPlannedDefensePathForNoReason_Turn243/243.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | M M 3 | M M M b1 b1 M M 4 | M M b1 M M M M M 5 | b1 b2 M b1 M 6 | C48 M b1 b1 b1 b1 M 7 | b1 b1 b1 b2 b2 b3 b1 b3 b1 M M M 8 | b1 b1 b1 M b2 b2 b4 b2 b1 b2 M M 9 | C42 M M b1 b2 b1 b2 C41 M M 10 | M C48 M b11 b1 b1 bG15 b1 b2 b2 b2 M M 11 | M b1 b1 b1 b1 a31 b1 M b1 b1 b2 b2 12 | M M M b1 a1 b2 b1 b1 M b2 M 13 | M M b3 b1 a1 b5 b1 b1 M M M 14 | a1 a1 C41 C45 a1 M a1 b2 M M 15 | M a1 b2 a2 a1 a1 a1 a1 b1 b1 M M M 16 | a1 M b2 a0 b2 C43 M a2 a1 17 | M a1 a2 a1 M a1 N3 M M M 18 | a2 a3 a1 a1 a1 M M M M 19 | aG1 a2 a3 a3 a3 a3 M M M 20 | M a3 a3 a3 M 21 | M 22 | | | | | | | | | | | | | | | | | | | 23 | targetPlayerExpectedGeneralLocation=3,18 24 | bScore=123 25 | aScore=116 26 | bTiles=66 27 | aTiles=61 28 | bCityCount=1 29 | aCityCount=1 30 | bot_target_player=0 31 | player_index=1 -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HxpebyX32.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | M M M M 4 | M M M M M 5 | M M M M M M 6 | M M M 7 | M M M M 8 | M M M M M M M 9 | M M M M M M 10 | M M M M M M M C45 11 | M M M M a2 a2 a2 a2 a2 M a2 a2 a2 a2 12 | M M a2 M M a2 a2 a2 a2 a2 aG3 13 | M C43 a2 M M a2 a2 a2 14 | M a2 a2 a2 a2 C40 M M 15 | M M M M a2 M 16 | M M M M M M M M 17 | M M M M M 18 | M M M M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgK-zXr3h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M M 3 | M M M M 4 | M M M M M 5 | M M M 6 | M M M M 7 | M M M M b2 b2 M 8 | M M M M b2 b2 b2 M 9 | M M M M M M b2 b2 b2 b2 bG4 10 | M M M C46 b2 b2 b2 b2 M b2 11 | b2 b2 b2 b2 M b2 b2 b2 b2 b2 12 | M M M M C49 M C43 13 | M M M M M 14 | M M 15 | M M M M M M M 16 | M M M M M M M 17 | M M M M M M 18 | M M M 19 | M M M M M 20 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/refiPJQ2n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | M M M M 4 | M M M M M 5 | M M M M M 6 | M M M M M 7 | M M M M M M b2 b2 M 8 | M M M M M M b2 b2 M 9 | M M b2 M 10 | M M M M M b2 11 | M bG5 b2 M 12 | M M M M M b2 b2 13 | M M b2 b2 b2 b2 b2 b2 b2 M 14 | M b2 b2 b2 b2 M M b2 M 15 | M M M b2 16 | M M M M 17 | M 18 | M M M M M M M M M 19 | M M M M 20 | M M 21 | M M M 22 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/Hga27Jmnh.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M 4 | M M M 5 | M M M M 6 | M M M M M M M 7 | M M M M M M M 8 | M M M M M 9 | M M M M M M 10 | M M M M M M 11 | M M M M 12 | M b2 b2 b2 M 13 | M M b2 b2 b2 b2 M M M 14 | M b2 M 15 | M M M M M M b2 16 | M M M M b2 b2 M M 17 | M M b2 b2 b2 b2 C46 M 18 | M M M M b2 b2 b2 b2 b2 M M 19 | M M b2 b2 b2 bG4 M M M 20 | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/HlGJ04Bh3.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | | 2 | M M a2 a2 M M M 3 | M a2 aG3 M M M 4 | M M M a2 a2 a2 a2 a2 M M 5 | M M a2 a2 M M M M M 6 | M M M M a2 a2 a2 a2 a2 a2 a2 M 7 | M M a2 a2 M M a2 8 | M a2 M M M a2 a2 M M 9 | M M a2 M 10 | M M M M M M M M M 11 | M M M M M 12 | M M M M M M M M 13 | M M 14 | M M M M M M 15 | M M M M M 16 | M M M 17 | M M M M M M M M M 18 | M M M M 19 | M M M M 20 | | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SlcYAHr33.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | 2 | M M M M M 3 | M M M M 4 | M M M 5 | M M M 6 | M M M M M 7 | M M M M 8 | M M M M M M M M M 9 | M b2 b2 b2 b2 M M 10 | M b2 b2 b2 M M 11 | M M M M b2 b2 b2 b2 M b2 12 | M M M b2 b2 b2 b2 13 | M M M b2 bG4 b2 14 | M M M M M b2 15 | M M C49 b2 16 | M M M M M b2 b2 17 | M M M M b2 18 | M M M 19 | M M M M M M M 20 | M M M M M 21 | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/SxLhzIS3n.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | 2 | M M M M M M 3 | M M M M M M 4 | M M M M M M 5 | M M M 6 | M b2 M M 7 | M M b2 M M M M 8 | M b2 b2 M M M M b2 b2 9 | M M M M M b2 M b2 b2 M b2 M M 10 | M b2 b2 b2 b2 b2 b2 b2 M 11 | M M b2 b2 b2 b2 b2 b2 bG4 M M 12 | C44 M M 13 | M M M M M M 14 | M M M M M M M M M 15 | M M M 16 | M M M M M M M M M M 17 | M M M M M 18 | M M M M M M 19 | M M M M 20 | M M M 21 | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/rgMWP8Hhn.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | | | | | 2 | M M M 3 | M M M M M M M 4 | M M M M M M M M M 5 | M M M M 6 | M M M M M M 7 | M M M M M 8 | M M M M M 9 | M M M M M M M 10 | M M M M M 11 | M M M M M 12 | M M M M M M M M M 13 | M M M M M M M M 14 | M M M M b2 C49 M 15 | M M M M b2 b2 C44 M b2 16 | M M b2 b2 M M b2 C44 b2 b2 17 | M M b2 b3 C47 M b2 b2 b2 M 18 | M b2 bG3 b2 b2 b2 b2 b2 b2 b2 b2 M M 19 | M M M M M M 20 | | | | | | | | | | | | | | | | | | | | | | | -------------------------------------------------------------------------------- /Tests/EarlyExpandUtilsTestMaps/SampleTurn25MapsToTryToBeat/BeaCFkX3h.txtmap: -------------------------------------------------------------------------------- 1 | | | | | | | | | | | | | | | | | | | 2 | a2 a2 a2 M a2 M 3 | M M M a2 a2 a2 a2 a2 a2 C43 M 4 | M M M M a2 a2 a2 a2 aG3 M M 5 | M M a2 a2 a2 a2 M a2 C48 M M 6 | M a2 M a2 a2 M 7 | M a2 M a2 M 8 | M M C42 M M M 9 | M M M 10 | M M 11 | M M M M 12 | M M 13 | M M M 14 | M M M M M 15 | M M M M M M 16 | M M M 17 | M M M M M 18 | M M M 19 | M M M M M 20 | M M M M 21 | M M M 22 | M 23 | M M M M 24 | | | | | | | | | | | | | | | | | | | --------------------------------------------------------------------------------