Last active
August 3, 2023 07:05
-
-
Save horstjens/a8067d5ce04893fee9258c57fb0895f2 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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