gpt4 book ai didi

python - 类型错误 : __init__() takes at least 2 arguments (1 given) error

转载 作者:太空狗 更新时间:2023-10-29 21:35:07 36 4
gpt4 key购买 nike

我正在使用 Python3 开发一个简单的基于文本的地下城游戏。首先提示用户从 screen.py 文件中选择英雄。

from game import *


class GameScreen:
'''Display the current state of a game in a text-based format.
This class is fully implemented and needs no
additional work from students.'''

def initialize_game(self):
'''(GameScreen) -> NoneType
Initialize new game with new user-selected hero class
and starting room files.'''

hero = None
while hero is None:
c = input("Select hero type:\n(R)ogue (M)age (B)arbarian\n")
c = c.lower()
if c == 'r':
hero = Rogue()
elif c == 'm':
hero = Mage()
elif c == 'b':
hero = Barbarian()

self.game = Game("rooms/startroom", hero)

def play(self):
'''(Game) -> NoneType
The main game loop.'''

exit = False
while not exit:
print(self)
if self.game.game_over():
break
c = input("Next: ")
if c in ['q', 'x']:
print("Thanks for playing!")
exit = True
elif c == 'w': # UP
self.game.move_hero(-1, 0)
elif c == 's': # DOWN
self.game.move_hero(1, 0)
elif c == 'a': # LEFT
self.game.move_hero(0, -1)
elif c == 'd': # RIGHT
self.game.move_hero(0, 1)
elif c == 'r':
## RESTART GAME
self.initialize_game()
else:
pass

def __str__(self):
'''(GameScreen) -> NoneType
Return a string representing the current room.
Include the game's Hero string represetation and a
status message from the last action taken.'''

room = self.game.current_room
s = ""

if self.game.game_over():
#render a GAME OVER screen with text mostly centered
#in the space of the room in which the character died.

#top row
s += "X" * (2 + room.cols) + "\n"
#empty rows above GAME OVER
for i in list(range(floor((room.rows - 2) / 2))):
s += "X" + " " * room.cols + "X\n"
# GAME OVER rows
s += ("X" + " " * floor((room.cols - 4) / 2) +
"GAME" + " " * ceil((room.cols - 4) / 2) + "X\n")
s += ("X" + " " * floor((room.cols - 4) / 2) +
"OVER" + " " * ceil((room.cols - 4) / 2) + "X\n")
#empty rows below GAME OVER
for i in list(range(ceil((room.rows - 2) / 2))):
s += "X" + " " * room.cols + "X\n"
#bottom row
s += "X" * (2 + room.cols) + "\n"
else:
for i in range(room.rows):
for j in room.grid[i]:
if j is not None:
if j.visible:
s += j.symbol()
else:
#This is the symbol for 'not yet explored' : ?
s += "?"
s += "\n"
#hero representation
s += str(self.game.hero)
#last status message
s += room.status
return s

if __name__ == '__main__':
gs = GameScreen()
gs.initialize_game()
gs.play()

每当我运行此代码时,我都会收到此错误:TypeError: init() takes at least 2 arguments (1 given) which has do with Rogue() or other hero classes.这是 hero.py。

class Rogue(Tile):
'''A class representing the hero venturing into the dungeon.
Heroes have the following attributes: a name, a list of items,
hit points, strength, gold, and a viewing radius. Heroes
inherit the visible boolean from Tile.'''

def __init__(self, rogue, bonuses=(0, 0, 0)):
'''(Rogue, str, list) -> NoneType
Create a new hero with name Rogue,
an empty list of items and bonuses to
hp, strength, gold and radius as specified
in bonuses'''

self.rogue = rogue
self.items = []
self.hp = 10 + bonuses[0]
self.strength = 2 + bonuses[1]
self.radius = 2 + bonuses[2]
Tile.__init__(self, True)

def symbol(self):
'''(Rogue) -> str
Return the map representation symbol of Hero: O.'''

#return "\u263b"
return "O"

def __str__(self):
'''(Item) -> str
Return the Hero's name.'''

return "{}\nHP:{:2d} STR:{:2d} RAD:{:2d}\n".format(
self.rogue, self.hp, self.strength, self.radius)

def take(self, item):
'''ADD SIGNATURE HERE
Add item to hero's items
and update their stats as a result.'''

# IMPLEMENT TAKE METHOD HERE
pass

def fight(self, baddie):
'''ADD SIGNATURE HERE -> str
Fight baddie and return the outcome of the
battle in string format.'''

# Baddie strikes first
# Until one opponent is dead
# attacker deals damage equal to their strength
# attacker and defender alternate
if self.hp < 0:
return "Killed by"
return "Defeated"

我做错了什么?

最佳答案

问题

GameScreen.initialize_game() 中,您设置了 hero=Rogue(),但是 Rogue 构造函数采用了 rogue 作为参数。 (换句话说,Rogue__init__ 要求传入 rogue。)当您设置 时,您可能会遇到同样的问题hero=法师hero=野蛮人

解决方案

幸运的是修复很简单;你可以将 hero=Rogue() 更改为 hero=Rogue("MyRogueName")。也许您可以提示用户在 initialize_game 中输入一个名称,然后使用该名称。

关于“至少 2 个参数(给定 1 个)”的注释

当您看到这样的错误时,这意味着您调用了一个函数或方法,但没有向其传递足够的参数。 (__init__ 只是一个特殊的方法,当一个对象被初始化时被调用。)所以以后调试这样的东西时,看看你在哪里调用函数/方法,在哪里定义它,并确保两者具有相同数量的参数。

关于这类错误的一件棘手的事情是被传递的 self

>>> class MyClass:
... def __init__(self):
... self.foo = 'foo'
...
>>> myObj = MyClass()

在那个例子中,人们可能会想,“很奇怪,我初始化了 myObj,所以调用了 MyClass.__init__;为什么我不必为 self ?答案是只要使用“object.method()”符号,就会有效地传入 self。希望这有助于清除错误并说明将来如何调试它。

关于python - 类型错误 : __init__() takes at least 2 arguments (1 given) error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12947599/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com