There’s an interesting thread over on BoardGameGeek where folks are discussing use of AI in wargaming, with some focus on spatial state.

Italy '43 map with some Python output Italy ‘43 map with some Python output

GenAI has become very good at helping with games rules interpretation. I lean on NotebookLM for this purpose, dumping PDF rules and playbooks and asking away. NotebookLM hallucinates less and does a better job of updating the model it uses if I keep the notebook around for a time. Custom GPTs that you create are bound to whatever model you create it with and won’t get upgraded (that’s true as of December 2025). NotebookLM hides the Gemini model being used but will switch between models and, presumably, upgrade when the platform gets improved.

This exercise for me wasn’t about rules interpretation: I wanted to see if Claude Code could be a reasonable Italy ‘43 opponent for me by examining the map state and being fed the rules and playbook. I dumped all the content into a directory and launched Claude Code. By “all the content” I mean the rules, Vassal module, and a campaign setup save file.

I also pointed Claude towards a useful Python library, pywargame, which can read Vassal files and extract potential interesting information about game state, such as where all the pieces are.

The Vassal module is just a zip file, so I extracted that so that Claude would have access to all the content: charts, a high resolution map, and the individual counters.

Sample Claude Code interaction Sample Claude Code interaction

I was encouraged at the start of my interaction with Claude, seeing the self-confidence that is common with GenAI: “I believe I can make reasonable decisions.” I grew concerned though when I saw this strategic analysis on what the Germans should do:

German Strategic Priorities I Would Consider:

  1. Immediate: Counterattack to contain/compress the beachhead before Allies consolidate
  2. Short-term: Delay Allied advance on Naples using terrain
  3. Mid-term: Establish defensive line using mountains and rivers
  4. Long-term: Trade space for time while reinforcements arrive

This is likely a case of the LLM using its textual knowledge of the Italy campaign, but not the actual game state. Problems with this list of priorities include: the Germans are in no position to counterattack at the start of the game, and Naples is already in Allied hands.

By including access to pywargame my hope was that Claude Code would be able to build some tools to make it easier to analyze the game situation and make decisions. The tools it wrote were handy! I had to teach it how to correlate the actual map hex designations with the internal hex grid identifiers, but that was easy.

On turn 1 there’s an initial phase where the Germans can flip a use artillery to “ready” state, and start to build their first fortification. The advice given by Simonitch to beginners is to start these fort builds up on the Gustav Line. This is a likely retreat holding area for the Germans, and the forts cannot be flipped to their completed side until 8 different forts have been started. Given that the Germans can start one per turn, you won’t see a completed fort until turn 9 at the earliest.

Claude tried to start a fort right next to the current Allied line at the bottom of the map. I give it some constructive feedback:

> I think you should reconsider your fort location (remember this going forward): look at “Play Notes”, “Where to Build Fortifications” for some tips. Forts can’t be completed until 8 have been started, so building them too close to the Allied front is likely a big mistake.

⏺ You’re absolutely right - that’s an important lesson. If forts can’t be completed until 8 are started, placing one at 2725 right next to the Allied beachhead would just be wasted effort since the Allies would likely push through before it’s ever finished.

I then had to teach it where the Gustav Line is:

> The Gustav line follows the Garigliano River on the west part of the map, heading diagonally up towards Alfedena and hex 3600. Here are some other hexes just north of the line: 1908, 2308, 2404, 2902. I suggest you start building the first fortification in hex 2504, Monte Cassino.

⏺ Monte Cassino - of course! Historically one of the most famous defensive positions of the entire war. That makes perfect sense. German Initial Phase Orders - Turn 1 (Revised)

  1. Flip ASU to Ready:
    • Spend 1 Supply Point to flip the 14Pz Corps ASU (hex 2620) to Ready
  2. Start Fortification:
    • Start fortification at hex 2504 (Monte Cassino)

Next up was to see if Claude Code could make some good initial moves for the Germans. Claude proposed a bunch of… illegal and unwise moves. Illegal because it had moves going through enemy zones of control (ZOCs) and even ZOC bonds. Unwise because the German player needs to be playing a measured retreat, consolidating lines and trying to impede the Allied advance by finding good terrain to hold while waiting for reinforcements. I tried to coach it a bit more:

> Review Turn1-situation.png. This will show you that there are British and American troops in many of the locations you plan to move to, and ZOCs are blocked. Example: there are two british units in 2526, facing off HG-I&II-Pz (armor). You should be able to see this in the inventory from the save file.

⏺ You’re right, I apologize. Let me look at the image and re-examine the save file data more carefully.

⏺ Now I can see the situation much better. Let me re-examine the positions:

Allied positions I can see:

  • 2225: BR 23rd Armoured (3 units)
  • 2526: BR 7A units (2 units) - directly facing HG-I&II-Pz at 2525 (and so on…)

My mistake: The HG armor at 2525 is already in ZOC of British units at 2526. Moving them would open a gap and they’d have to pay ZOC costs.

Let me reconsider. Units already in contact should probably stay in place to maintain the containment line. I should only move units that have freedom to maneuver.

It then proceeded to make a few moves that were more reasonable in the middle of the front line, but then a series of moves at the eastern flank that were illegal and again ignored the presence of Allied troops there.

At this point I aborted. At this stage it is asking too much for a general purpose LLM to track game state like this at such a fine grain. I would probably see better results having it write code for a move generator using the Vassal files and pywargame.

Updated: