Tendo a dire "se non riesci a trovare una soluzione esplicita, cercane una implicita". Potresti simulare la battaglia internamente fino a quando un esercito non viene spazzato via o si ritira (a seconda dei possibili risultati del tuo gioco).
Userei qualcosa del genere:
Per ogni iterazione della battaglia, tutte le unità sono opportunistiche, quindi cercano di fare il maggior danno possibile. Ogni unità seleziona un'unità nemica che sta per attaccare in questo round, in base ai vantaggi / svantaggi noti.
Quindi, vengono eseguiti tutti i combattimenti secondari. Un esempio:
Lascia che i lancieri siano efficaci contro il cavallario, cavalaray efficace contro gli arcieri e gli arcieri efficaci contro il lanciere.
In uno scontro tra due eserciti costituiti da entrambi i tipi di queste unità base, tutti i lancieri avrebbero attaccato la cavalleria, tutte le unità di cavalleria avrebbero attaccato gli arcieri e tutti gli arcieri avrebbero attaccato i lancieri. Se per esempio una parte non avesse arcieri, l'altra cavalleria selezionerebbe il prossimo miglior tipo di bersaglio (essendo le unità di cavalleria nemiche)
Ogni evento unità-attacco-unità viene risolto separatamente, con l'unità perdente danneggiata o contrassegnata come distrutta.
Dopo che tutti i combattimenti individuali sono stati risolti, rimuovi tutte le unità che sono state gravemente danneggiate o distrutte.
La prossima iterazione inizia a usare gli eserciti ora ridotti.