Skip to content

Instantly share code, notes, and snippets.

@lmoureaux
Last active October 23, 2019 23:43
Show Gist options
  • Save lmoureaux/b692a2655124d69933a2dc15ef77df63 to your computer and use it in GitHub Desktop.
Save lmoureaux/b692a2655124d69933a2dc15ef77df63 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import random as rnd\n",
"import scipy as sp\n",
"from scipy.special import binom"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Ruleset definitions"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"veteran_raise_chance = [50, 45, 40, 35, 30, 25, 20, 15, 10, 0]\n",
"veteran_power_factor = [100, 150, 175, 200, 225, 250, 275, 300, 325, 350]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Units"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {},
"outputs": [],
"source": [
"# strength (excl. level), hp, firepower, level\n",
"trireme = (1, 10, 1, 0)\n",
"\n",
"cannon = (8, 20, 2, 0)\n",
"vcannon = (8, 20, 2, 1)\n",
"vvcannon = (8, 20, 2, 2)\n",
"\n",
"vcavalery = (8, 20, 1, 1)\n",
"vvcavalery = (8, 20, 1, 2)\n",
"vvvcavalery = (8, 20, 1, 3)\n",
"\n",
"vfanatics = (18, 20, 1, 1)\n",
"vvfanatics = (18, 20, 1, 2)\n",
"vvvfanatics = (18, 20, 1, 3)\n",
"\n",
"riflemen = (2.5*4*1.25*1.25, 20, 1, 0)\n",
"vriflemen = (2.5*4*1.25*1.25, 20, 1, 1)\n",
"vvriflemen = (2.5*4*1.25*1.25, 20, 1, 2)\n",
"vvvriflemen = (2.5*4*1.25*1.25, 20, 1, 3)\n",
"\n",
"\n",
"vvriflemen = (3*4*1.25*1.25, 20, 1, 2)\n",
"\n",
"musketeer = (2.5*3*1.25*1.25, 20, 1, 0)\n",
"vmusketeer = (2.5*3*1.25*1.25, 20, 1, 1)\n",
"vvmusketeer = (2.5*3*1.25*1.25, 20, 1, 2)\n",
"\n",
"attackers = [ trireme ] \n",
"defenders = [ (2, 5, 1, 1), (2, 5, 1, 2), (2, 4, 1, 2) ]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Combat simulator"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"def unit_strength(unit):\n",
" return unit[0] * veteran_power_factor[unit[3]] / 100.\n",
"\n",
"def unit_eff_strength(unit):\n",
" return unit_strength(unit) * unit[1] * unit[2]\n",
"\n",
"def simulate_combat(attacker, defender):\n",
" astrength, alife, afp, alevel = attacker\n",
" dstrength, dlife, dfp, dlevel = defender\n",
" astrength = unit_strength(attacker)\n",
" dstrength = unit_strength(defender)\n",
" while alife > 0 and dlife > 0:\n",
" if rnd.uniform(0, astrength + dstrength) > astrength:\n",
" # Defender wins the round\n",
" alife -= dfp\n",
" else:\n",
" # Attacker wins\n",
" dlife -= afp\n",
" if alife <= 0:\n",
" # Defender wins\n",
" alife = 0\n",
" raise_chance = veteran_raise_chance[dlevel]\n",
" if rnd.uniform(0, 100) < raise_chance:\n",
" dlevel += 1\n",
" else:\n",
" # Attacker wins\n",
" dlife = 0\n",
" raise_chance = veteran_raise_chance[alevel]\n",
" if rnd.uniform(0, 100) <= raise_chance:\n",
" alevel += 1\n",
" return (attacker[0], alife, afp, alevel), (defender[0], dlife, dfp, dlevel)"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [],
"source": [
"combats_count = int(50000)\n",
"cities_emptied = 0\n",
"stacks_killed = 0\n",
"def_hp_left = np.zeros((len(defenders), defenders[0][1] + 1))\n",
"\n",
"for combat in range(combats_count):\n",
" dcopy = defenders[:]\n",
" for iatt in range(len(attackers)):\n",
" # Choose the best defender\n",
" defender = dcopy[0]\n",
" defender_strength = unit_eff_strength(defender)\n",
" idef = 0\n",
" for i in range(len(dcopy)):\n",
" if unit_eff_strength(dcopy[i]) > defender_strength:\n",
" defender = dcopy[i]\n",
" defender_strength = unit_eff_strength(dcopy[i])\n",
" idef = i\n",
" # Attack\n",
" attacker = attackers[iatt]\n",
" updated_attacker, updated_defender = simulate_combat(attacker, defender)\n",
" dcopy[idef] = updated_defender\n",
" # Harvest\n",
" all_def_dead = True\n",
" any_def_dead = False\n",
" for idef in range(len(dcopy)):\n",
" def_hp_left[idef][dcopy[idef][1]] += 1\n",
" if dcopy[idef][1] > 0:\n",
" all_def_dead = False\n",
" else:\n",
" any_def_dead = True\n",
" if all_def_dead:\n",
" cities_emptied += 1\n",
" if any_def_dead:\n",
" stacks_killed += 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Results"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"City emptying probability: 0.000000\n",
"Stack kill probability: 0.181520\n"
]
}
],
"source": [
"print(\"City emptying probability: %f\" % (cities_emptied / combats_count))\n",
"print(\"Stack kill probability: %f\" % (stacks_killed / combats_count))"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efbd7eec5c0>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc1132c9e8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efbd7c4f908>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"def_hp_left_err = np.sqrt(def_hp_left) / combats_count\n",
"\n",
"for idef in range(len(defenders)):\n",
" plt.bar(np.arange(len(def_hp_left[idef])),\n",
" def_hp_left[idef] / combats_count,\n",
" yerr=def_hp_left_err[idef], \n",
" align='center',\n",
" alpha=0.5)\n",
" plt.ylim(0, 1)\n",
" plt.xlim(-0.5, defenders[0][1] + 0.5)\n",
" plt.title(\"HP of defender #%d\" % idef)\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment