Я пытаюсь работать над текстовым приключением, чтобы сохранить мой интерес, пытаясь изучить концепции и нюансы Python. Первоначально я следил за учебником YouTube (серия из 6 частей, ссылка на часть 1 предоставлена: https://www.youtube.com/watch?v=MFW8DJ6qsak).
Я создал класс игрока, как показано ниже:
class Player:
def __init__(self):
self.name = ''
self.jobclass = ''
self.currenthp = 0
self.totalhp = 0
self.currentmp = 0
self.totalmp = 0
self.physical_damage = 0
self.physical_defense = 0
self.magic_attack = 0
self.magic_defense = 0
self.speed = 0
self.luck = 0
self.status_effect = []
self.location ='b2'
self.game_over = False
myPlayer = Player()
Моя текущая проблема заключается в попытке назначить игроку определенные характеристики на основе выбранной им работы персонажа, то есть:
def setup_game():
...
player_jobclass = input("> ")
myPlayer.jobclass = player_jobclass
valid_jobs = ['warrior', 'mage', 'thief', 'cleric']
while player_jobclass.lower() not in valid_jobs:
print("Please choose a valid class")
player_jobclass = input("> ")
if player_jobclass.lower() in valid_jobs:
myPlayer.jobclass = player_jobclass
print("Ah, the " +player_jobclass.lower()+ ". Fine choice!\n")
#Class Starting Stats
if myPlayer.jobclass is 'warrior':
self.currenthp = 20
self.totalhp = 20
self.currentmp = 10
self.totalmp = 10
self.physical_damage = 10
self.physical_defense = 10
self.magic_attack = 2
self.magic_defense = 3
self.speed = 4
self.luck = 4
self.location = 'd1'
elif myPlayer.jobclass is 'mage':
self.currenthp = 10
self.totalhp = 10
self.currentmp = 20
self.totalmp = 20
self.physical_damage = 2
self.physical_defense = 3
self.magic_attack = 10
self.magic_defense = 7
self.speed = 7
self.luck = 3
self.location = 'a1'
...
main_game_loop()
Потому что после того, как все это запускается, я нормально захожу в игру, и все мои движения и небольшие действия работают нормально, однако, если я попытаюсь распечатать «статистику» игрока с помощью чего-то вроде:
def show_stats():
hpmpadarmPrint = ("" + str(myPlayer.currenthp) + "/" + str(myPlayer.totalhp) + " hp " + str(myPlayer.currentmp) + "/" + str(myPlayer.totalmp) + " mp " + str(myPlayer.physical_damage) + " ATK " + str(myPlayer.physical_defense) + " ARM \n")
mgclckspdPrint = ("" + str(myPlayer.magic_attack) + " AP " + str(myPlayer.magic_defense) + " MR " + str(myPlayer.speed) + " SPD " + str(myPlayer.luck) + " LCK \n")
Напечатает только:0/0 hp 0/0 mp 0 ATK 0 ARM
0 AP 0 MR 0 SPD 0 LCK
Я могу сказать, что есть какая-то более крупная концепция, которая ускользает от меня в том, что касается присвоения значений, поскольку даже self.location = 'b2'
ДОЛЖЕН быть там, иначе игра не запустится, поскольку myPlayer на самом деле не присваиваются значения, которые, как я считаю, должны. Это также мешает моей функции change_text_speed()
работать, а также ... вы поняли.
Угадайте, что главный вопрос будет заключаться в следующем: как сохранить новые значения после присвоения?
__init__
. - person Brian   schedule 29.07.2018is
. Используйте==
. - person Aran-Fey   schedule 29.07.2018setup_game
. Откудаself
? В любом случае ваша непосредственная проблема, вероятно, связана со сравнением строк сis
вместо==
. Не делай этого.is
для идентичности,==
для равенства. Вы не можете гарантировать, что равные строки будут идентичными строками, т. е. одним и тем же строковым объектом. - person juanpa.arrivillaga   schedule 29.07.2018is
и==
.self
- это то, как (теперь я думаю, не так хорошо, как я когда-то думал) руководство было основано на первоначальном__init__(self)
- person Chris   schedule 29.07.2018self
— это (условное) имя экземпляра класса, который используется внутри методов класса. Но это не имеет никакого значения вне определения класса. Поэтому, когда код вне определенияPlayer
хочет получить доступ к атрибутам (включая методы) экземпляра классаmyPlayer
, ему нужно использоватьmyPlayer
, а неself
. - person PM 2Ring   schedule 29.07.2018self
обычно является первым параметром метода, но в сигнатуре вашей функции он не определяет никаких параметров, поэтомуself
будет неопределенным. Обратите внимание, что никаких ошибок не выдается, потому что этот код никогда не достигается из-за проблем сis
/==
. - person juanpa.arrivillaga   schedule 29.07.2018