Ik itereer over alle zichtbare regio's die niet van mij zijn, en bepaal vanaf welke door mij bezette buur/buren ik die regio zou willen aanvallen, met hoeveel legers en waarom (enum). Het aantal legers voor de gewenste aanval hangt af van de kleur van het doel (neutraal / vijandelijk) en de kleur van en (laatst geziene) legers op erachter gelegen regio's en of deze regio's vanaf andere door mij bezette regio's bereikbaar zijn.
Dit gebeurt vóór de place_armies-move al, zodat ik weet welke regio het meest in paniek is, want deze komt het meeste legers tekort om alle gewenste aanvallen uit te voeren.
Daarna itereer ik over alle gewenste aanvallen per superregio die niet in mijn bezit zijn, aflopend op verhouding van mijn bezit, oplopend op aantal regio's binnen de superregio (superregio waarvan 2/4 van de regio's van jou zijn proberen over te nemen is doorgaans makkelijker dan een met 3/6), om te kijken of de aanvallen mogelijk zijn, en zo ja, dan worden die gequeued.
Ik probeer daarna legers te plaatsen per superregio, en plaatsen gebeurt in de verhouding (gevraagde legers / totaal gevraagde legers * plaatsbare legers), behalve wanneer een regio onder zware belegering ligt; dan krijgt 'ie ze gewoon allemaal. Dit laatste zie je helaas bij veel bots, waardoor je 100 beurten lang legers tegenover elkaar aan het stacken bent terwijl de rest van de kaart neutraal blijft.
Uiteindelijk hou ik per regio bij hoeveel legers er nog beschikbaar zijn voor de betreffende beurt, en indien > 0, verplaats ik deze via breadth-first pathfinding richting de dichtstbijzijnde frontlinie (= een van mijn regio's met neutrale of vijandelijke buren). Wanneer voor een gewenste aanval een significant deel van de legers bij de buren niets staat te doen, worden deze richting de aanvallende regio getrokken, hetzij ter verdediging, hetzij om de aanval in de volgende beurt te versterken.
Het geheel werkt met een stel lijsten met in deze beurt mogelijke en gewenste aanvallen, en een lijst met "gewenste aanvallen in de volgende beurt". Indien een aanval vanuit een bepaalde regio in laatstgenoemde lijst staat, laat de logica de legers op die regio met rust.
Verder werkt het een en ander met diverse wegingen, zoals het aantal buren van een land (een neutral met de meeste neighbors heeft de eerste voorkeur om aangevallen te worden), het percentage van de superregio dat in mijn bezit is, het aantal legers dat benodigd is, enzovoorts.
Fixes die ik nog wil toepassen:
• Nóg sterkere focus op superregio's. Ik zie zo nu en dan nog steeds aanvallen naar nieuwe superregio's gedaan worden, terwijl de superregio vanwaar de aanval komt nog niet eens geheel in mijn bezit is.
• Opgeven. Als ik links een superregio dreig te verliezen maar rechts enorm aan het oprukken ben, blijft mijn bot toch aan de linkerkant (bijna) alle legers bijplaatsen, zelfs al zit ik nog maar met 1 leger op 1 region in een verder volledig door de tegenstander bezette superregion.
• Een beter verdeelde frontlinie. De legers concentreren zich nu erg op één regio, zeker wanneer de tegenstander ook op één regio veel legers heeft staan, waardoor ik via mijn buren van die regio (met ieder 1 leger...) nogal gemakkelijk onder de voet gelopen kan worden.
• Terugtrekken. In de top-10 zit een aantal bots dat een aanval uitlokt door al zijn legers terug te trekken van de frontlinie, waardoor jouw bot enkel regio's ziet met 1-3 legers en dus aanvalt. Ik weet niet of dat bewust is gedaan, maar het lijkt regelmatig te werken.
• Neutrals aanvallen vanaf een regio die belegerd wordt indien er dan genoeg legers overblijven om te verdedigen.
• Meerdere "onmogelijke" aanvallen doen vanaf regio's die één of slechts enkele vijandelijke (of neutrale) regio's omringen. Als je 150-200-150 staat, kun je proberen met tweemaal 149 die 200 aan te vallen.
• Inschatten wat de andere bot heeft, krijgt, kan en wil. Hier doe ik nu nog zeer weinig mee. Je weet hoe groot de map is, dus je kunt schatten hoeveel (super)regio's de tegenstander kan hebben en hoeveel legers hij per beurt kan plaatsen. Met de output van opponent_moves kun je verplaatsingen van en aanvallen naar regio's zien die buiten jouw viewrange liggen. Daarnaast kun je met (ver)plaatsingen van legers ongeveer zien waar de aandacht van de tegenstander in ieder geval de vorige ronde naar uitging.
• Bottlenecks (Zuid-Amerika <-> Zuid-Afrika, Nieuw-Zeeland <-> Azië, Groenland <-> IJsland, ...) herkennen en verdedigen, en doodlopende wegen (Zuid-Amerika, Zuid-Afrika, Australië) herkennen en fanatieker de legers laten laten verplaatsen.
Maar ik voorzie nogal wat problemen om deze logica in mijn "lijstensysteem" te integreren, dus dat gaat voor de volgende versie weer op de schop.
Ik heb de Java-starterbot omgebouwd naar C# en er steeds meer uitgesloopt. Het enige dat nog bestaat is de parser, de gamestate en de models ((Super)Region, Map).
Ik heb een server die twee bots tegen elkaar laat spelen in code (er komt geen consoleverkeer aan te pas, enkel voor server- en bot-debug-output):
Deze server draait op textfiles, één voor de map (ik gebruik nu nog enkel de standaardmap, maar bij het ontwikkelen was een kleinere map wel prettig) en één voor de eventuele gamestate. Een state bestaat uit de update_map en opponent_moves voorafgaand aan een bepaalde ronde, waardoor ik rare situaties uit replays snel kan nabootsen.
Indien geen state wordt geladen, worden ook de startregio's bemiddeld met de bots.
Stond de map al ergens? Zo nee, bij dezen:
Ik vraag me overigens wel af of we voor de finals nog op dezelfde map spelen, of dat er een of enkele nieuwe maps worden geïntroduceerd. Veel grotere of kleinere maps lijken me wel interessant.
[
Voor 9% gewijzigd door
CodeCaster op 22-03-2014 14:01
]