我很惊讶这不会崩溃,但我真的不确定这里发生了什么。鼠标悬停在+键上按下&#39; d&#39;应该在鼠标下面显示对象菜单(它确实如此)。选择对象时,它应该从该对象描述中向控制台打印消息。但它不会打印类似<__main__.Object instance at 0x02AE1800>
的内容。
以下是相关代码
def menu(header, options, width):
if len(options) > 26: raise ValueError('Cannot have a menu with more than 26 options.'
#calculate the total height for the header (afer auto wrap) and one line per option
header_height = libtcod.console_get_height_rect(con, 0, 0, width, SCREEN_HEIGHT, header)
height = len(options) + header_height
#create an off-screen console that represents the menu's window
window = libtcod.console_new(width, height)
#print the header, with auto wrap, baby.
libtcod.console_set_default_foreground(window, libtcod.white)
libtcod.console_print_rect_ex(window, 0, 0, width, height, libtcod.BKGND_NONE, libtcod.LEFT, header)
#print all the options
y = header_height
letter_index = ord('a')
for option_text in options:
text = '(' + chr(letter_index) + ') ' + option_text
libtcod.console_print_ex(window, 0, y, libtcod.BKGND_NONE, libtcod.LEFT, text)
y += 1
letter_index += 1
#blit the contents of "window" to the root console
x = SCREEN_WIDTH/2 - width/2
y = SCREEN_HEIGHT /2 - height/2
libtcod.console_blit(window, 0, 0, width, height, 0, x, y, 1.0, 0.7)
#present the root console to the player and wait for keypress
libtcod.console_flush()
key = libtcod.console_wait_for_keypress(True)
#convert the ASCII code to an index; if it corresponds to an option, return it
index = key.c - ord('a')
if index >= 0 and index < len(options): return index
return None
def handle_keys():
global keys;
if key_char == 'd':
#show the description menu, if an item is selected, describe it.
chosen_object = description_menu('Press the key next to an object to see its description.\n')
if chosen_object is not None:
chosen_object.describe()
else:
return 'cancelled'
return 'didnt-take-turn'
def description_menu(header):
global mouse
#return a string with the names of all objects under the mouse
(x, y) = (mouse.cx, mouse.cy)
#create a list with the names of all objects at the mouse's coordinates and in FOV
names = [obj for obj in objects if obj.x == x and obj.y == y and libtcod.map_is_in_fov(fov_map, obj.x, obj.y) and obj.description is not None]
#show a menu with each object under the mouse as an option
if len(names) == 0:
options = ['There is nothing here.']
else:
options = [object.name for object in names]
index = menu(header, options, INVENTORY_WIDTH)
#if an item was chosen, return it
if index is None or len(names) == 0: return None
return names[index]
Class Object:
#this is a generic object: the player, a monster, an item, the stairs...
#it's always represented by a character on screen.
def __init__(self, x, y, char, name, color, blocks=False, fighter=None, ai=None, item=None, description=None):
self.x = x
self.y = y
self.char = char
self.name = name
self.color = color
self.blocks = blocks
self.fighter = fighter
if self.fighter: #let the fighter component know who owns it
self.fighter.owner = self
self.ai = ai
if self.ai: #let the ai component know who owns it
self.ai.owner = self
self.item = item
if self.item: #let the item component know who owns it, like a bitch
self.item.owner = self
self.description = self
if self.description: #let the description component know who owns it
self.description.owner = self
def describe(self):
#describe this object
if self.description is None:
message('The ' + self.owner.name + ' cannot be described.')
else:
message(str(self.description), libtcod.white)`
答案 0 :(得分:1)
我的猜测是,当你真的希望传递带有一些易于理解的信息的字符串时,你将Object
实例的字符串表示传递给message
。 str
方法调用Object.__str__
(其中一个python&#39; s magic methods)Object.__str__
尚未在您的代码中定义,因此str
默认调用{ {1}}这是您获得Object.__repr__
。
尝试定义<__main__.Object instance at 0x02AE1800>
,以便它返回一个字符串,其中包含您希望它在显示Object.__str__
时显示的信息。
例如:
print
最后,我无法确定问题是什么,因为我们没有Class Object:
def __init__(self, name, x, y):
self.name = name
self.x = x
self.y = y
def __str__(self):
return("Object " + self.name + " is at position [" + self.x + "," + self.y + "]")
方法的定义。您应该包含该方法的代码,以便我们更好地了解正在发生的事情。祝你好运!