Ошибка с локальной переменной game, пожалуйста объясните в чем суть ошибки
Ошибка с локальной переменной game. Пожалуйста, объясните в чем суть ошибки.
class Players_team():
def __init__(self, name, team):
self.name = name
self.team = team
self.damage = 20
self.health = 100
def get_hit(self):
self.health -= self.damage
def Health(self):
return self.health
def dead_health(self):
if self.health == 0:
return f'{self.team} team {self.name} is dead!'
blue = Players_team('Rimuru', 'Blue')
red = Players_team('Hong', 'Red')
import random
game = True
def game_b():
while game:
for i in range(1, 11):
j = random.randint(1, 2)
if j == 1:
blue.get_hit()
print('Blue under attacked',blue.Health())
elif j == 2:
red.get_hit()
print('Red under attack',red.Health())
if blue.health == 0:
print('Blue team is dead')
game = False
break
elif red.health == 0:
print('Red team is dead')
game = False
break
def olimp_bet():
game_b()
make_deb = input('Chose team! Blue or Red')
if make_deb == 'Blue':
if blue.health == 0:
print('You lose')
else:
print('You win')
elif make_deb == 'Red':
if red.health == 0:
print('You lose')
else:
print('You win')
a = olimp_bet()
Ответы (2 шт):
Автор решения: S. Nick
→ Ссылка
В функции game_b() имеем локальную переменную game, зона видимости которой
будет только эта функция game_b().
Вы к ней обращаетесь, а она еще не объявлена.
Вы и получаете ошибку обращаетесь до присвоения.
import random
class Players_team():
def __init__(self, name, team):
self.name = name
self.team = team
self.damage = 20
self.health = 100
def get_hit(self):
self.health -= self.damage
def Health(self):
return self.health
def dead_health(self):
if self.health == 0:
return f'{self.team} team {self.name} is dead!'
blue = Players_team('Rimuru', 'Blue')
red = Players_team('Hong', 'Red')
#import random
#game = True
def game_b():
game = True # <---
while game:
for i in range(1, 11):
j = random.randint(1, 2)
if j == 1:
blue.get_hit()
print('Blue under attacked',blue.Health())
elif j == 2:
red.get_hit()
print('Red under attack',red.Health())
if blue.health == 0:
print('Blue team is dead')
game = False
break
elif red.health == 0:
print('Red team is dead')
game = False
break
def olimp_bet():
game_b()
make_deb = input('Chose team! Blue or Red')
if make_deb == 'Blue':
if blue.health == 0:
print('You lose')
else:
print('You win')
elif make_deb == 'Red':
if red.health == 0:
print('You lose')
else:
print('You win')
a = olimp_bet()
Автор решения: Zeka Farzali
→ Ссылка
Все переменные используемые внутри метода должны либо объявляться внутри метода, либо передаваться в нее как параметр. Говоря простым языком, метод game_b() не в курсе происходящего за его пределами. Метод срабатывает только тогда когда его вызывают, например game_b(). Передача параметра game решает проблему:
class Players_team():
def __init__(self, name, team):
self.name = name
self.team = team
self.damage = 20
self.health = 100
def get_hit(self):
self.health -= self.damage
def Health(self):
return self.health
def dead_health(self):
if self.health == 0:
return f'{self.team} team {self.name} is dead!'
blue = Players_team('Rimuru', 'Blue')
red = Players_team('Hong', 'Red')
import random
game = True
def game_b(game):
while game:
for i in range(1, 11):
j = random.randint(1, 2)
if j == 1:
blue.get_hit()
print('Blue under attacked',blue.Health())
elif j == 2:
red.get_hit()
print('Red under attack',red.Health())
if blue.health == 0:
print('Blue team is dead')
game = False
break
elif red.health == 0:
print('Red team is dead')
game = False
break
def olimp_bet(game):
game_b(game)
make_deb = input('Chose team! Blue or Red')
if make_deb == 'Blue':
if blue.health == 0:
print('You lose')
else:
print('You win')
elif make_deb == 'Red':
if red.health == 0:
print('You lose')
else:
print('You win')
a = olimp_bet(game)