Je suis assez nouveau dans la programmation python et je voulais m'essayer à un simple jeu d'aventure texte, mais j'ai immédiatement trébuché sur un barrage routier.
class userInterface:
def __init__(self, roomID, roomDesc, dirDesc, itemDesc):
self.roomID = roomID
self.roomDesc = roomDesc
self.dirDesc = dirDesc
self.itemDesc = itemDesc
def displayRoom(self): #Displays the room description
print(self.roomDesc)
def displayDir(self): #Displays available directions
L1 = self.dirDesc.keys()
L2 = ""
for i in L1:
L2 += str(i) + " "
print("You can go: " + L2)
def displayItems(self): #Displays any items of interest
print("Interesting items: " + str(self.itemDesc))
def displayAll(self, num): #Displays all of the above
num.displayRoom()
num.displayDir()
num.displayItems()
def playerMovement(self): #Allows the player to change rooms based on the cardinal directions
if input( "--> " ) in self.dirDesc.keys():
letsago = "ID" + str(self.dirDesc.values())
self.displayAll(letsago)
else:
print("Sorry, you can't go there mate.")
ID1 = userInterface(1, "This is a very small and empty room.", {"N": 2}, "There is nothing here.")
ID2 = userInterface(2, "This is another room.", {"W": 3}, ["knife", "butter"])
ID3 = userInterface(3, "This is the third room. GET OVER HERE", {}, ["rocket launcher"])
ID1.displayAll(ID1)
ID1.playerMovement()
C'est mon code, qui pour une raison quelconque jette cette erreur:
Traceback (most recent call last):
File "D:/Python34/Text Adventure/framework.py", line 42, in <module>
ID1.playerMovement()
File "D:/Python34/Text Adventure/framework.py", line 30, in playerMovement
self.displayAll(fuckthis)
File "D:/Python34/Text Adventure/framework.py", line 23, in displayAll
num.displayRoom()
AttributeError: 'str' object has no attribute 'displayRoom'
J'ai cherché sur Internet et dans la documentation python ce que je fais de mal ici et je n'ai aucune idée. Si je mets ID2 ou ID3 à la place de self.displayAll (letsago ) cela fonctionne parfaitement, mais cela ne sert à rien puisque le joueur n'a aucun contrôle sur l'endroit où il veut aller, donc je suppose qu'il y a quelque chose de mal à essayer de connecter l'ID avec le numéro du dictionnaire, mais je n'ai aucune idée de quoi faire et Comment régler ceci.
Le problème vient de votre méthode playerMovement
. Vous créez le nom de chaîne de vos variables de pièce (ID1
, ID2
, ID3
):
letsago = "ID" + str(self.dirDesc.values())
Cependant, ce que vous créez n'est qu'un str
. Ce n'est pas la variable. De plus, je ne pense pas qu'il fait ce que vous pensez qu'il fait:
>>>str({'a':1}.values())
'dict_values([1])'
Si vous AVEZ VRAIMENT nécessaire pour trouver la variable de cette façon, vous pouvez utiliser la fonction eval
:
>>>foo = 'Hello World!'
>>>eval('foo')
'Hello World!'
ou la fonction globals
:
class Foo(object):
def __init__(self):
super(Foo, self).__init__()
def test(self, name):
print(globals()[name])
foo = Foo()
bar = 'Hello World!'
foo.text('bar')
Cependant, à la place, je voudrais fortement vous recommander de repenser vos classes. Votre classe userInterface
est essentiellement une Room
. Il ne devrait pas gérer les mouvements des joueurs. Cela devrait être dans une autre classe, peut-être GameManager
ou quelque chose comme ça.