D & D Simulation
I've also been playing around with something for D&D, but it's more for an ease of access thing for myself, like allowing me to roll for stats by typing "Roll Stats" instead of having to roll 4 dice and take away the lowest, etc. Anyways, when you roll for stats, it should be 4d6 and taking away the lowest number, and you have to do it that way instead of random.randint(3,18) because rolling 4d6 and subtracting the lowest promotes a higher number by removing the lowest number, the way I did this was like this:
stats = [random.randint(1, 6), random.randint(1, 6), random.randint(1, 6), random.randint(1,6)]
statsmath = stats + stats + stats + stats - min(stats)
stats = statsmath
Anyways I just wanted to make that note since I saw that you were making the stats random.randint(8, 18), and wanted to do 2 things. 1. Tell you that that's how I used to play D&D before I knew how to roll for stats correctly, just roll a d20 until I roll between whatever the DM set the minimum stat and maximum stat, and 2. Tell you how you could roll properly in python. Or at least how I did it, though I am still learning, and I could be over complicating things or there could be a better way of doing it.