Skip to content

Instantly share code, notes, and snippets.

@horstjens
Last active August 3, 2023 07:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save horstjens/a8067d5ce04893fee9258c57fb0895f2 to your computer and use it in GitHub Desktop.
Save horstjens/a8067d5ce04893fee9258c57fb0895f2 to your computer and use it in GitHub Desktop.
import random
from dice2 import diceroll
class Monster:
def __init__(self, name):
self.name = name
self.hp = 10
self.attack = 0.7
self.defense = 0.5
self.armor = 2
self.damage = "1d3"
def __repr__(self):
text = f"{self.__class__.__name__} hp: {self.hp} attack: {self.attack}"
text += f"defense: {self.defense} armor: {self.armor} damage: {self.damage}"
return text
class Zombie(Monster):
def __init__(self, name):
super().__init__(name)
self.hp = 5
self.defense = 0.2
self.armor = 0
self.damage = "1D4"
class Mummy(Monster):
def __init__(self,name):
super().__init__(name)
self.hp = 7
self.defense = 0.44
self.attack = 0.60
self.armor = 1
self.damage = "1D6+1"
def attack(attacker, defender):
text = []
# attack
roll_a = random.random() # 0-1
if roll_a >= attacker.attack:
text.append(f"{attacker.name} fumbles his attack")
return text
text.append(f"{attacker.name} swings at {defender.name}")
# defense
roll_b = random.random() # 0-1
if roll_b < defender.defense:
text.append(f"but {defender.name} manages to avoid the blow")
return text
text.append("...and hits!")
# damage
roll_c, dicetext = diceroll(attacker.damage)
roll_d = random.randint(0, defender.armor)
damage = roll_c - roll_d
if damage <= 0:
text.append(f"the armor of {defender.name} is absorbs all damage")
return text
text.append(f"causing {damage} hp damage to {defender.name}. ({defender.hp - damage} hp left)")
defender.hp -= damage
if defender.hp <= 0:
text.append(f"{defender.name} dies! {attacker.name} wins the fight!")
return text
def fight(attacker, defender):
text = []
text.extend(attack(attacker, defender))
if defender.hp > 0:
text.append("counterstrike!")
text.extend(attack(defender, attacker))
return text
if __name__ == "__main__":
cyros = Mummy("Cyros the Mummy")
brainy = Zombie("Brain-eater the Zombie")
battle_round = 1
text = []
while (cyros.hp > 0) and (brainy.hp > 0):
text += [f"------------battle round {battle_round} ---------------"]
# who strikes first
if random.random() < 0.5:
text.append(f"Cyros ({cyros.hp} hp) strikes first vs. Brainy ({brainy.hp} hp)!")
text.extend(fight(cyros, brainy))
else:
text.append(f"Brainy ({brainy.hp} hp) strikes first vs. Cyros ({cyros.hp} hp)!")
text.extend(fight(brainy, cyros))
for line in text:
print(line)
input("press Enter...")
battle_round += 1
import random
from dice2 import diceroll
class Monster:
def __init__(self, name):
self.name = name
self.hp = 10
self.attack = 10 # +2D6
self.defense = 8 # +2D6
self.armor = 5
self.damage = 10 # +2D6
self.speed = 10 # +2D6
def __repr__(self):
text = f"{self.__class__.__name__} instance: "
for key, value in self.__dict__.items():
text += f"{key}: {value}"
text += ", "
return text[:-2] # remove the last 2 chars
class Zombie(Monster):
def __init__(self, name):
super().__init__(name)
self.hp = 5
self.attack = 5
self.defense = 4
self.armor = 0
self.damage = 4
self.speed = 4 # who strikes first
class Mummy(Monster):
def __init__(self,name):
super().__init__(name)
self.hp = 7
self.defense = 4
self.attack = 7
self.armor = 1
self.damage = 6
self.speed = 9
def attack(attacker, defender):
text = []
# attack vs. defense
roll_a, text_a = diceroll(f"2D6+{attacker.attack}") # 2D6 + 10
roll_b, text_b = diceroll(f"2D6+{defender.defense}") # 2D6 + 8
if roll_b >= roll_a:
text.append(f"{attacker.name} misses {defender.name} (attack {text_a} <= defense {text_b})")
return text
text.append(f"{attacker.name} strikes {defender.name} (attack {text_a} > defense {text_b})" )
# damage vs. armor
roll_c, text_c = diceroll(f"2D6+{attacker.damage}")
roll_d, text_d = diceroll(f"2D6+{defender.armor}")
if roll_d >= roll_c:
text.append(f"but can not penetrate {defender.name}'s armor (damage {text_c} <= armor {text_d})")
return text
text.append(f"and inflicts {roll_c-roll_d} damage! (damage {text_c} > armor {text_d})")
damage = roll_c - roll_d
defender.hp -= damage
if defender.hp <= 0:
text.append(f"{defender.name} dies! {attacker.name} wins the fight!")
else:
text.append(f"{defender.name} has {defender.hp} hp left")
return text
def fight(attacker, defender):
text = ["===---- strike! ----===="]
text.append(f"{attacker.name} ({attacker.hp} hp) strikes first vs. {defender.name} ({defender.hp} hp)")
text.extend(attack(attacker, defender))
if defender.hp > 0:
text.append("====---- counterstrike! ----====")
text.extend(attack(defender, attacker))
return text
if __name__ == "__main__":
alice = Monster("Alice")
bob = Monster("Bob")
battle_round = 1
text = []
text.append(f"{alice}")
text.append("---- versus ----")
text.append(f"{bob}")
while (alice.hp > 0) and (bob.hp > 0):
text.append(f"\n- - - - - - - - - battle round {battle_round} - - - - - - - - - \n")
# who strikes first
roll_a, text_a = diceroll(f"2D6+{alice.speed}")
roll_b, text_b = diceroll(f"2D6+{bob.speed}")
text.append(f"speed: {alice.name} {text_a} vs. {bob.name} {text_b}")
if roll_a > roll_b:
text.extend(fight(alice, bob))
elif roll_b < roll_a:
text.extend(fight(bob, alice))
else:
if random.random() < 0.5:
text.extend(fight(alice,bob))
else:
text.extend(fight(bob,alice))
for line in text:
print(line)
input("press Enter...")
battle_round += 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment