/
pentomas
/
cha_redactor
Обзор
Документация
Войти
/
pentomas
/
cha_redactor
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
DragonKnight.py
444 строки
26 KB
pentomas
update DragonKnight.py
16 янв 2026, 00:05
Верифицирован
16 янв 2026, 00:05
66c678c
Код
Авторство
О чём код?
import random import time import os # ============= КЛАССЫ ============= class Character: def __init__(self, name, health, attack): self.name = name self.__health = health self.attack = attack def get_health(self): return self.__health def set_health(self, value): self.__health = max(0, value) def is_alive(self): return self.__health > 0 def take_damage(self, damage): self.set_health(self.get_health() - damage) def roll_d20(self): roll = random.randint(1, 20) print(f"{self.name} бросает D20... выпало: {roll}") if roll == 20: print(" КРИТИЧЕСКИЙ УСПЕХ!") elif roll == 1: print(" КРИТИЧЕСКИЙ ПРОВАЛ!") return roll def __str__(self): return f"{self.name} (Здоровье: {self.get_health()}, Атака: {self.attack})" class Player(Character): def __init__(self, name): super().__init__(name, 100, 15) self.inventory = ["Меч"] self.gold = 20 self.reputation = 0 self.quests = set() self.knows_lich_location = False def add_item(self, item): self.inventory.append(item) def remove_item(self, item): if item in self.inventory: self.inventory.remove(item) return True return False def pay(self, amount): if self.gold >= amount: self.gold -= amount return True return False def earn(self, amount): self.gold += amount def __str__(self): return f" {self.name} | Здоровье: {self.get_health()} | Золото: {self.gold} | Репутация: {self.reputation}" class NPC: def __init__(self, name, role, dialogue, shop_items=None): self.name = name self.role = role self.dialogue = dialogue self.shop_items = shop_items or {} def talk(self, player): print(f"\n{self.name} ({self.role}):") print(self.dialogue["greet"]) while True: print("\nДействия:") options = ["1. Спросить о Личе", "2. Спросить о деревне"] if self.shop_items: options.append("3. Торговать") options.append("4. Прощай") for opt in options: print(opt) choice = input("> ").strip() if choice == "1": if "about_lich" in self.dialogue: print(self.dialogue["about_lich"]) if "quest" in self.dialogue: player.quests.add(self.dialogue["quest"]) print("💡 Вы получили квест:", self.dialogue["quest"]) else: print("«Я... не помню...»") elif choice == "2": print(self.dialogue["about_village"]) elif choice == "3" and self.shop_items: self.trade(player) elif choice == "4": print(self.dialogue.get("farewell", "Береги себя...")) break else: print("Неизвестный выбор.") def trade(self, player): print(f"\n🛒 Торговля с {self.name}") print(f"Ваше золото: {player.gold}") print("Товары:") items = list(self.shop_items.items()) for i, (item, price) in enumerate(items, 1): print(f"{i}. {item} — {price} зм") print(f"{len(items)+1}. Назад") try: choice = int(input("> ")) - 1 if 0 <= choice < len(items): item, price = items[choice] if player.pay(price): player.add_item(item) print(f"Вы купили: {item}!") # После покупки можно дать репутацию (отслеживается в main) else: print("Недостаточно золота.") elif choice == len(items): return else: print("Неверный выбор.") except ValueError: print("Введите число.") class Lich(Character): def __init__(self): super().__init__("Часовой Лич Малакор", 120, 18) self.spell_power = 25 def __str__(self): return f"⏳ {super().__str__()} | Сила заклинаний: {self.spell_power}" # ============= ДЕРЕВНЯ ============= def create_village(): return { "Элдрина": NPC( "Элдрина", "Староста (92 года, но выглядит на 200)", { "greet": "А... ещё один, кто пришёл вспоминать. Я вижу твою боль в глазах — она такая же, как у всех нас.\n я забыла свое прошлое имя на этой неделе меня зовут Элдрина.", "about_lich": "Малакор... он не монстр. Он был часовщиком. Когда его дочь умерла от чумы, он поклялся: «Больше никто не будет страдать».\nНо его магия пошла не так. Он не исцелил боль — он начал стирать *причину* боли: память.", "about_village": "Раньше здесь пели птицы, дети играли в прятки, а по ночам — рассказывали сказки.\n Но сейчас жизнь в деревне и жизнью то не назвать, дети забывают ведущего в играх, взрослые зачем они вышли из дома", "farewell": "Его дом — там, На вершине холма \n помни: если ты забудешь, *зачем* пришёл... ты станешь частью этого места.", "quest": "Найдите убежище Малакора" } ), "Сильвия": NPC( "Сильвия", "Эльфийка-ткачиха (последняя из своего рода)", { "greet": "Приветствую тебя путник.\nТы выглядишь весьма героично, может быть вы сможете спасти нас от недуга потери памяти", "about_lich": "Малакор был моим учителем, он очень могущественный маг, учится у него юыло большой честью, вроде как...\n Однако он обезумел, а как конктретно, я признаться подзабыла", "about_village": "на своих полотнах я изображаю истории дабы они оставались в нашей памяти, например на этом свадьба, однако жених сейчас и невесту свою не помнит\nА это — смерть ребёнка, о которой мать не знает.", "farewell": "Возьми это. Амулет не спасёт тебя... но поможет *помнить, кем ты был*" }, {"Амулет Памяти": 15} ), "Гаррет": NPC( "Гаррет", "Кузнец (бывший воин)", { "greet": "Хм. Ты держишь меч, как новичок... или как тот, кто забыл, как им пользоваться.\nРасскажи, зачем ты здесь? Мечи не куются для тех, кто ищет смерть.", "about_lich": "Малакор когда-то чинил свои доспехи у меня. Потом он сказал: «Зачем платить, если можно забыть?»\nЯ ударил его молотом... но он лишь улыбнулся. С тех пор я начал забывать рецепты стараюсь чинить всё, что помню, как.", "about_village": "Раньше я ковал мечи для короля. Теперь — игрушки для детей, которые не запоминают их имена.\nРабота для меня способ сохранить рассудок", "farewell": "Возьми лучшее оружие. Но помни: меч не победит забвение." }, {"Щит": 10, "Улучшенный меч": 25} ), "Мира": NPC( "Мира", "Целительница (говорит странными повторами)", { "greet": "Ты ранен? .. Понимаешь?\nТвоё сердце бьётся слишком медленно... Понимаешь? ", "about_lich": "он заставляет забыть \nОн думает, что стирает боль... но стирает *любовь*, *надежду*, *смысл*... Понимаешь?", "about_village": "Зелье ясности помогает... но вызывает сны из прошлого. \nКаждую ночь.Понимаешь?", "farewell": "Береги память. Она — всё, что у нас осталось... Понимаешь?" }, {"Зелье ясности": 5, "Зелье лечения": 8} ) } # ============= БОЙ ============= def fight_lich(player): lich = Lich() base_difficulty = 15 persuasion_attempts = 0 print("\n" + "="*60) print("⏳ БИТВА С ЧАСОВЫМ ЛИЧЕМ МАЛАКОРОМ") print("="*60) print("Вы стоите в огромном зале, стены которого покрыты тысячами часов.") print("Все они остановились на одном времени: 3:07 — момент смерти дочери Малакора.") print() time.sleep(1) print("«Ты пришёл вспомнить... или забыть?» — звучит голос, от которого трещат стёкла часов.") print("«Я стираю боль. А ты... ты цепляешься за неё, как за соломинку. Глупец.»") print() while player.is_alive() and lich.is_alive(): current_difficulty = base_difficulty + persuasion_attempts # концовка: герой сдаётся при сложности 18 if current_difficulty >= 18: print("\n" + "🌑" * 40) print("Вы снова пытаетесь говорить... но слова не идут.") print("Ваш разум пуст.") print("«Зачем сопротивляться?» — шепчет голос в вашей голове. «Забудь. Отдайся времени.»") print() print("Вы опускаете меч. Ваши глаза теряют свет.") print("«Я... присягаю тебе, Малакор», — говорите вы без эмоций.") print() print("Лич улыбается. «Ещё одна душа свободна от боли.»") print("Вы становитесь Хранителем Песочных Часов — вечным слугой забвения.") print("\n🌑 Концовка: «Присягнувший Забвению»") print("Вы не победили. Вы не проиграли. Вы... перестали быть собой.") print("🌑" * 40) return print("\n--- ВАШ ХОД ---") print(player) print(f"⏳ {lich.name} (Здоровье: {lich.get_health()}, Заклинания: {lich.spell_power})") print(f"\n1. Атаковать (D20)\n2. Использовать предмет\n3. Убедить (D20) — Сложность: {current_difficulty}") choice = input("> ").strip() if choice == "1": roll = player.roll_d20() if roll == 1: print("Вы спотыкаетесь о разбитые часы и теряете 10 HP!") player.take_damage(10) elif roll == 20: damage = player.attack + random.randint(20, 30) lich.take_damage(damage) print(f"КРИТИЧЕСКИЙ УРОН! Нанесено {damage}!") print("«Ах... это чувство... боль...» — Лич дрожит.") elif roll >= 10: damage = player.attack + random.randint(5, 15) lich.take_damage(damage) print(f"Успешная атака! {damage} урона.") else: print("Ваш меч проходит сквозь иллюзию! Промах!") elif choice == "2": if not player.inventory: print("Инвентарь пуст!") continue print("Инвентарь:", player.inventory) item = input("Какой предмет использовать? ").strip() if item in player.inventory: player.remove_item(item) if item == "Зелье лечения": player.set_health(player.get_health() + 30) print("Вы восстановили 30 HP!") elif item == "Амулет Памяти": print("Амулет вспыхивает золотым светом!") print("«Нет... не надо вспоминать это...» — кричит Лич. Он теряет 20 HP!") lich.take_damage(20) elif "меч" in item.lower(): player.attack += 15 print("Меч Гаррета пылает яростью прошлого! Атака +15!") elif item == "Щит": print("Щит отражает магию! Следующая атака Лича будет слабее.") else: print("Ничего не произошло...") else: print("Нет такого предмета.") elif choice == "3": persuasion_attempts += 1 print(f"\nВы пытаетесь убедить Лича. Сложность: {current_difficulty}") roll = player.roll_d20() if roll == 1: print("Вы говорите что-то бессвязное. Лич смеётся. -15 HP.") player.take_damage(15) elif roll >= current_difficulty: print("\n" + "✨" * 40) if roll == 20: print("✨ КРИТИЧЕСКИЙ УСПЕХ УБЕЖДЕНИЯ!") print("«Ты... прав...» — шепчет Лич, и в его глазах вспыхивает воспоминание.") else: print("«Ты заставил меня вспомнить...» — говорит Лич, и слёзы песка катятся по его лицу.") print("«Моя дочь... её имя было Лира...»") print("Часы в зале начинают тикать. Сначала тихо, потом — громче и громче.") print("Песок в ваших часах перестаёт сыпаться. Вы вспоминаете всё: имя сестры, лицо матери.") print("\n🏆 Концовка: «Слово сильнее меча»") print("Вы не победили Лича — вы вернули ему человечность.") print("Малакор растворяется в свете, оставив после себя только старинные часы") print("✨" * 40) return else: print(f"Лич качает головой: «Ты не понимаешь...» — и продолжает бой.") # Ход Лича if lich.is_alive(): print("\n--- ХОД ЛИЧА ---") roll = lich.roll_d20() if roll == 1: print("Лич смотрит на старые часы и шепчет: «Прости меня, Лира...» — пропускает ход.") elif roll == 20: damage = lich.spell_power * 2 player.take_damage(damage) print(f"«ИСЧЕЗНИ ИЗ ВРЕМЕНИ!» — кричит он. КРИТИЧЕСКИЙ МАГИЧЕСКИЙ УРОН! {damage}!") elif roll >= 12: player.take_damage(lich.spell_power) print(f"«Песок забвения покрывает тебя...» — {lich.spell_power} урона.") else: print("Заклинание рассеялось в пыли воспоминаний.") # Концовки при смерти или победе print("\n" + "="*60) if player.is_alive(): if player.reputation >= 2: print("🏆 Концовка: «Хранитель Памяти»") print(f"Благодаря вашей репутации ({player.reputation}), деревня помнит вас как героя.") print("Часы снова тикают. Люди вспоминают друг друга. А вы — их спаситель.") else: print("🏆 Концовка: «Победа ценой всего»") print(f"Вы победили, но ваша репутация ({player.reputation}) была слишком низкой.") print("Деревня живёт... но не помнит, *кто вы*. Вы — легенда без имени.") else: print("💀 Концовка: «Забвение»") print("Ваше тело исчезает. Ваше имя стирается. Вы становитесь ещё одной пустой фигурой") print("в коллекции Малакора — тенью без прошлого, без будущего, без боли... и без любви.") print("="*60) # ============= ОСНОВНАЯ ИГРА ============= def main(): while True: os.system('cls' if os.name == 'nt' else 'clear') print("="*60) print("⚔️ ПЕСОЧНЫЕ ЧАСЫ ЗАБВЕНИЯ") print("="*60) print("\n Месяц назад вы нашли у себя под подушкой старинные часы.") print("С тех пор ваша память начала подводить вас все чаще и чаще.") print("Имя сестры... лицо матери... даже своё имя начинает забываться.") print("\nВы узнали из древнего свитка: что есть деревня в которой живет могущественный лич Малакор знающий все о времени.") print("И вы решили отправиться туда, дабы избавится от своего недуга.") print("\n💡 Подсказка: помогайте жителям — за это вы получите «репутацию».") print("Чем выше репутация, тем ярче будет ваша победа.") print("\nСегодня вы достигли Верескового оврага.") print("="*60) name = input("Ваше имя (пока вы его помните): ").strip() if not name: name = "Забытый" print("Вы не вспомнили... но ничего страшного скоро вы получите новое.") player = Player(name) village = create_village() print(f"\n Вы входите в Вересков овраг...") time.sleep(1) print("Вересков овраг вытянут вдоль реки серебрянки. Который выходит из Северных гор и спускается в южные болота.") print("на улицах вы видите резвящихся детей, убегающих то от одного мальчика то от другого.") print("Взрослых, которые почему то выходя из дома буквально секунд через 30 возврающихся обратно, будто они что то забыли") print("воздух пропитан влагой, свежестью, чувствуется запах мха и гниющих листьев") print("Всюду вы видите множество часов, на каждом столбе, доме, однако их тиканье не может заглушить нагнетающий тик издающийся с домика на краю деревни") print("Вы чувствуете, как ваше собственное имя начинает стираться из памяти...") print(f"\nДобро пожаловать, {player.name}") print("\nВы можете поговорить с жителями. Возможно, они помогут вам... или напомнят, зачем вы здесь.") # Исследование деревни while True: print("\n" + "–" * 40) print(f"Текущая репутация: {player.reputation}") print("Кого вы хотите найти?") print("1. Элдрина (староста)") print("2. Сильвия (ткачиха-эльфийка)") print("3. Гаррет (кузнец)") print("4. Мира (целительница)") print("5. Идти к дому Лича") choice = input("> ").strip() if choice == "1": if "talked_eldrina" not in player.quests: village["Элдрина"].talk(player) player.reputation += 1 player.quests.add("talked_eldrina") player.knows_lich_location = True print("✅ Вы помогли старосте — репутация +1!") else: print("Элдрина кивает вам молча. Больше сказать нечего.") elif choice == "2": village["Сильвия"].talk(player) if "Амулет Памяти" not in player.inventory and random.random() < 0.3 and "got_amulet" not in player.quests: print("\n🌿 Сильвия тихо кладёт в вашу руку тёплый амулет.") print("«Он не вернёт всё... но поможет удержать то, что ещё важно».") player.add_item("Амулет Памяти") player.quests.add("got_amulet") elif choice == "3": village["Гаррет"].talk(player) if "bought_from_garret" not in player.quests and ("Щит" in player.inventory or "Улучшенный меч" in player.inventory): player.reputation += 1 player.quests.add("bought_from_garret") print("✅ Гаррет одобрительно кивает — репутация +1!") elif choice == "4": village["Мира"].talk(player) if "bought_from_mira" not in player.quests and ("Зелье ясности" in player.inventory or "Зелье лечения" in player.inventory): player.reputation += 1 player.quests.add("bought_from_mira") print("✅ Мира благодарит вас — репутация +1!") elif choice == "5": if player.knows_lich_location: print("\nВы направляетесь к старому часовому дому на холме...") time.sleep(1) print("Ветер шепчет: *«Он ждёт тебя... или ты ждёшь себя?»*") break else: print("Вы не знаете, где его дом... Спросите у жителей деревни.") else: print("Вы молчите. Деревня молчит в ответ.") # Битва начинается ТОЛЬКО здесь fight_lich(player) # Перезапуск print("\n" + "—" * 50) again = input("Хочешь начать заново? (да/нет): ").strip().lower() if again not in ("да", "д", "y", "yes"): print("\nСпасибо за игру. Пусть твои воспоминания останутся целыми...") break # ============= ЗАПУСК ============= if __name__ == "__main__": main()