Работаю над своей первой настоящей игрой на Python, но я столкнулся с несколькими проблемами - PullRequest
0 голосов
/ 26 сентября 2018

Кодируя мою игру, я столкнулся с проблемами при ее запуске.Например, атака зомби не проходит правильно, при использовании магазина значение золота и значение здоровья не обновляются.При выполнении боевой части зомби в первый раз получает меньше здоровья, затем больше здоровья и больше урона.Я не знаю, что я испортил.Любая помощь / советы?

import time

import sys

import random

cls = ("\n"*100)


class Mage:
    def __init__(self):
        self.maxhp = 50
        self.attack = 3.33
        self.name = "Mage"


class Warrior:
    def __init__(self):
        self.maxhp = 70
        self.attack = 2.5
        self.name = "Warrior"


class Thief:
    def __init__(self):
        self.maxhp = 35
        self.attack = 5
        self.name = "Thief"


class Zombie:
    def __init__(self):
        self.maxhp = 10
        self.attack = 1
        self.name = "Zombie"


def heal(character_health):

    if character_health < character_health:
        character_health += 5
        print("Healed. Health is now " + character_health + " +5.")
        time.sleep(2)
    else:
        print("No healing available.")
        time.sleep(2)


def battle(character_health, character_attack, monster_health, monster_attack, gold):
    while True:

        character_health_max = character_health

        monster_name = "Zombie"

        choice1 = input("\nPress 1 to Attack: ")

        if choice1 == "1":
            monster_health -= character_attack
            print("\n" + str(monster_name) + "'s health is now " + str(monster_health))
            time.sleep(1)
            character_health -= monster_attack
            print("\nThe hero's health is now " + str(character_health))
            time.sleep(1)

        if character_health <= 0:
            print("\nThe hero is dead.")
            sys.exit("\nThe End")

        if monster_health <= 0:
            print("\nThe monster is dead.")
            time.sleep(2)
            print("Your gold has increased by: 5")
            gold += 5
            monster_health = 10
            character_health = character_health_max
            time.sleep(2)
            menu_list(character_health, character_attack, monster_health, monster_attack, gold)


def store(gold, character_health):

        print("\nWelcome to my shop of wonders! My name is Hanz, what can I aid you with today? We have...\nPotions: [1.] EEK")
        buy = input("\nWhat will it be? ")

        if gold < 5:
            print("Sorry, you don't have any gold!")
            time.sleep(2)

        if buy == "1" and gold >= 5:
            print("\nYou now own the Potion EEK! Health increased by 5!")
            character_health += 5
            gold -= 5
            time.sleep(2)


def menu_list(character_health, character_attack, monster_health, monster_attack, gold):

    while True:
        print(cls)

        menu = input("---> Fight [1.] \n---> Heal [2.] \n---> Store [3.] \n---> Quit [4.] \n---> Gold: " + str(gold) + " \n---> ")

        if menu == "4":
            sys.exit()

        if menu == "2":
            heal(character_health)

        if menu == "1":
            battle(character_health, character_attack, monster_attack, monster_health, gold)

        if menu == "3":
            store(gold, character_attack)

        if menu == "Gold":
            print("\nNot valid hackerman.")
            time.sleep(1)


class Main:

    print(cls)

    name = input("What is your name: ")

    character = input("\nChoose your class: \n----------------- \nMage [1.] \nWarrior [2.] \nThief [3.] \n---> ")

    if character == "1":
        character_health = Mage().maxhp
        print("\nHealth " + str(character_health))
        character_attack = Mage().attack
        print("\nAttack " + str(character_attack))
        character_name = Mage().name
        print("\nClass " + str(character_name))
        time.sleep(3)
        monster_health = Zombie().maxhp
        monster_attack = Zombie().attack
        gold = 0
        menu_list(character_health, character_attack, monster_health, monster_attack, gold)

    if character == "2":
        character_health = Warrior().maxhp
        print("\nHealth " + str(character_health))
        character_attack = Warrior().attack
        print("\nAttack " + str(character_attack))
        character_name = Warrior().name
        print("\nClass " + str(character_name))
        time.sleep(3)
        monster_health = Zombie().maxhp
        monster_attack = Zombie().attack
        gold = 0
        menu_list(character_health, character_attack, monster_health, monster_attack, gold)

    if character == "3":
        character_health = Thief().maxhp
        print("\nHealth " + str(character_health))
        character_attack = Thief().attack
        print("\nAttack " + str(character_attack))
        character_name = Thief().name
        print("\nClass " + str(character_name))
        time.sleep(3)
        monster_health = Zombie().maxhp
        monster_attack = Zombie().attack
        gold = 0
        menu_list(character_health, character_attack, monster_health, monster_attack, gold)


if __name__ == '__main__':
    Main()

1 Ответ

0 голосов
/ 26 сентября 2018

Я думаю, что сейчас самое время разобраться, что происходит, когда вы передаете переменные в функции в Python.

Во-первых, все в Python является объектом !Примитивы тоже (числа заключены в Python как объект).Каждый класс объектов наследуется от класса object в Python.

Теперь, что происходит, когда вы передаете примитив функции и меняете значение?

Для иллюстрации:

def foo(a):
    a = 5
b = 1
foo(b)
print(b) # b is still 1! Some objects in Python are immutable including integers, strings, and booleans.

Теперь я подозреваю, что ваши значения золота и здоровья не меняются, потому что вы передаете неизменных объектов, которые нельзя изменить!

Как решить?Вы хотите передать в изменяемый объект!Вместо передачи целочисленного объекта (который является неизменным ) для здоровья персонажа, передайте объект символа (который является mutable ).Вы можете установить новое здоровье этого объекта персонажа.

Для иллюстрации:

class Warrior:
def __init__(self):
    self.maxhp = 70
    self.attack = 2.5
    self.name = "Warrior"
    self.currenthp = 55 # arbitrary number but you may want to have something like this

def heal(warrior):
    warrior.currenthp += 5

# somewhere in your Main function
warrior1 = Warrior()
heal(warrior1) # currenthp of this warrior should be 60!

Важно, чтобы вы правильно реализовывали ООП при создании игры.Аналогичным образом попробуйте отладить другие проблемы, обращая внимание на реализацию ООП.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...