2016-11-16 4 views
1

Я использую глобальные переменные для небольшой текстовой игры в python и столкнулся с множеством статей, в которых говорится, что глобальные переменные нет в python. Я пытаюсь понять, как получить то, что у меня есть (просто переменная работоспособности и возможность изменить ее и распечатать), работая с использованием классов, но я смущен тем, как я могу преобразовать что-то подобное в класс. Любая помощь, например, точка в правильном направлении была бы замечательной.Преобразование глобальных переменных в класс

Вот пример использования переменных.

import sys 
import time 

health = 100 
b = 1 

def intro(): 
    print("You will die after two moves") 


def exittro(): 
    time.sleep(1) 
    print("Thanks for playing!") 
    sys.exit() 


def move(): 
    global health 
    global b 
    health -= 50 

    if health <= 51 and b >0: 
     print("almost dead") 
     b = b - 1 


def death(): 
    if health == 0 or health <= 0: 
     print("...") 
     time.sleep(1) 
     print("You died\n") 
     time.sleep(2) 
     print("Dont worry, this game sucks anyway\n") 
     exittro() 

intro() 

a = 1 

while a == 1: 
    input("Press Enter to move") 
    move() 
    death() 

Спасибо

Edit: это такая вещь, я пытался сделать ...

class Test: 
def __init__(self): 
    number = 100 

def __call__(self): 
    return number 

def reduceNum(self): 
    number -=10 

def printNum(self): 
    print(number) 

a = 1 
while a == 1: 
    input("Enter") 
    Test.self.reduceNum() 
    Test.self.printNum() 
+0

Что вы пытались? Вы получаете сообщение об ошибке? Покажи нам, что у тебя есть. –

+0

Нечто подобное, многие адаптированные варианты него класс 'Тест: Защиту __init __ (Я): число = 100 Защиту __call __ (Я): возвращает количество Защиту reduceNum (Я): число - = 10 Защита printNum (Я): печати (номер) а = 1 а == 1: ввода ("Enter") Test.self.reduceNum() Test.self.printNum() ' – Anthony

+0

Энтони , добавьте код в исходный вопрос. –

ответ

3

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

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

import time 

def intro(): 
    print("You will die after two moves") 


def outro(): 
    time.sleep(1) 
    print("Thanks for playing!") 
    # sys.exit() # You can avoid this now by just stopping the program normally 


def move(health): 
    health -= 50 

    if health <= 51: 
     print("almost dead") 
    return health # Return the new health to be stored in a variable 


def death(health): 
    if health <= 0: 
     print("...") 
     time.sleep(1) 
     print("You died\n") 
     time.sleep(2) 
     print("Dont worry, this game sucks anyway\n") 
     return True # Died 
    return False # Didn't die 

def main(): 
    health = 100 # You start with 100 health 
    intro() 
    while not death(health): 
     # While the death function doesn't return `True` (i.e., you didn't die) ... 
     input("Press enter to move") 
     health = move(health) # `health` is the new health value 
    outro() 

Если вы хотите использовать классы, вам нужно на самом деле экземпляр класса (Создать новый объект из него), делая instance = Test(). Вам также нужно хранить переменные как атрибуты self (так self.number = number), так как любые локальные переменные отличаются друг от друга.

class Test: 
    def __init__(self): 
     self.number = 100 

    def __call__(self): 
     return self.number 

    def reduceNum(self): 
     self.number -= 10 

    def printNum(self): 
     print(self.number) 

a = 1 
game = Test() 
while a == 1: 
    input("Enter") 
    game.reduceNum() 
    game.printNum() 
    # Or: 
    print(game()) 
    # As you've changed `__call__` to return the number as well. 
+0

Большое спасибо, что есть что я был после, очень ценится – Anthony

+0

Почему классы в целом медленнее? – nycynik

+1

@nycynik Встроенные модули Python, такие как 'dict' и 'set', реализованы изначально (так что для обычного Python, который вы загружаете с python.org, в C), и у вас есть тонна оптимизаций. У классов не может быть почти столько оптимизаций, сколько они могут быть такими, что Python не может ускорить их – Artyer

Смежные вопросы