Created
April 9, 2014 14:35
-
-
Save zelark/10277586 to your computer and use it in GitHub Desktop.
Пишем простую RPG на Clojure (https://www.youtube.com/watch?v=r0TWL5L7RE0)
This file contains hidden or 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
from random import randint | |
def kill_negative(n): | |
if n < 0: | |
n = 0 | |
return n | |
def calc_attack(level): | |
return level*6 | |
def calc_defence(level): | |
return int(level*1.4) | |
def calc_hitpoints(level): | |
return level*20 | |
def calc_base_damage(attack, defence): | |
return kill_negative(attack - defence) | |
def roll_dice(slides): | |
return randint(1, slides) | |
def calc_sides(level): | |
if level > 5: | |
return 100 | |
else: | |
return 3 | |
def create_character(name, lvl): | |
character = { | |
'name': name, | |
'level': lvl, | |
'attack': calc_attack(lvl), | |
'defence': calc_defence(lvl), | |
'hp': calc_hitpoints(lvl) | |
} | |
return character | |
def real_demage(base, sides): | |
rd = roll_dice(sides) | |
s = sides // 2 | |
if rd <= s: | |
return int(base / 2) | |
elif rd == sides: | |
return base * 2 | |
else: | |
return base | |
# from(character) + to(character) | |
# [damage(int), character] | |
def take_damage(from_char, to_char): | |
bd = calc_base_damage(from_char['attack'], to_char['defence']) | |
s = calc_sides(from_char['level']) | |
rd = real_demage(bd, s) | |
to_char['hp'] -= rd | |
return (rd, to_char) | |
log_tamplate = "Character %s received %d damage.\nHis new life is %d" | |
def print_battle_log(damage, character): | |
name = character['name'] | |
newhp = character['hp'] | |
print(log_tamplate % (name, damage, newhp)) | |
def print_winner(p_hp, e_hp): | |
if p_hp <= 0: | |
print("Enemy won.") | |
else: | |
print("Player won.") | |
def game_logic(config): | |
player = config['player'] | |
enemy = config['enemy'] | |
battle_round = 1 | |
while(True): | |
if player['hp'] <= 0 or enemy['hp'] <= 0: | |
print_winner(player['hp'], enemy['hp']) | |
break | |
print("Round: %d" % battle_round) | |
pl2en = take_damage(player, enemy) | |
en2pl = take_damage(enemy, player) | |
print_battle_log(pl2en[0], pl2en[1]) | |
print_battle_log(en2pl[0], en2pl[1]) | |
player = en2pl[1] | |
enemy = pl2en[1] | |
battle_round += 1 | |
player = create_character('Robert', 6) | |
troll = create_character('Troll', 2) | |
big_troll = create_character('Big Troll', 4) | |
config = { | |
'player': player, | |
'enemy': big_troll | |
} | |
print(player) | |
print(big_troll) | |
game_logic(config) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment