蛇游戏 - str对象不可调用

问题描述 投票:0回答:4

很抱歉,如果答案很简单,但我真的被困在这个...我正在尝试制作一个'Snake游戏',但是当我尝试调用该函数让我的蛇移动时,我收到了一个错误。错误说明:

    Traceback (most recent call last):
  File "C:\Users\Fran\Desktop\SnakeISN.py", line 89, in <module>
    theApp.on_execute()
  File "C:\Users\Fran\Desktop\SnakeISN.py", line 80, in on_execute
    snake.changeDirectionTo(3)
TypeError: 'str' object is not callable

每当我开始按箭头键...导入pygame import sys import random

class Snake():
    def __init__(self):
     self.x=400
     self.y=590
     self.direction = "RIGHT"
     self.changeDirectionTo = self.direction

    def changeDirectionTo(self,dir):
     if dir == 1 and not self.direction == 2:
         self.direction = "RIGHT"
     if dir == 2 and not self.direction == 1:
         self.direction = "LEFT"
     if dir == 3 and not self.direction == 4:
         self.direction = "UP"
     if dir == 4 and not self.direction == 3:
         self.direction = "DOWN"

    def move(self, foodPos):
     if self.direction == "RIGHT":
         self.x += 100
     if self.direction == "LEFT":
         self.x -= 100
     if self.direction == "UP":
         self.y -= 100
     if self.direction == "DOWN":
         self.y += 100

class Appli:

    windowX = 800
    windowY = 600

    def __init__(self):
        self._running = True
        self._show_surf = None
        self._image_surf = None
        self.snake = Snake() 

    def on_init(self):
        pygame.init()
        self._show_surf = pygame.display.set_mode((self.windowX,self.windowY), pygame.HWSURFACE)

        pygame.display.set_caption('Snake V2.7')
        self._running = True
        self._image_surf = pygame.image.load("pygame.png").convert()


    def on_event(self, event):
        if event.type == QUIT:
            self._running = False

    def on_loop(self):
        pass

    def on_render(self):
        self._display_surf.fill((0,0,0))
        self._display_surf.blit(self._image_surf,(self.snake.x,self.snake.y))
        pygame.display.flip()

    def on_cleanup(self):
        pygame.quit()

    def on_execute(self):
        snake=Snake()
        if self.on_init() == False:
            self._running = False

        while( self._running ):
            pygame.event.pump()
            action = pygame.key.get_pressed()
            if action[pygame.K_RIGHT]:
                snake.changeDirectionTo(1)
            if action[pygame.K_LEFT]:
                snake.changeDirectionTo(2)
            if action[pygame.K_UP]:
                snake.changeDirectionTo(3)
            if action[pygame.K_DOWN]:
                snake.changeDirectionTo(4)
            self.on_loop()
            self.on_render()
        self.on_cleanup()


if __name__ == "__main__" :
    theApp = App()
    theApp.on_execute()

谁知道问题出在哪里?第一次出现这个错误时,我将所有方向“RIGHT”,“LEFT”,“UP”,“DOWN”更改为1,2,3,4,希望它能解决'str call'错误,但它没有...

感谢帮助

python string
4个回答
0
投票

理解错误消息是解决问题的关键。

调用函数时,可以添加括号和任何参数:

>>> def func():
...     print('worked!')
...
>>> func()
worked!

但是当你将括号添加到不是函数的东西时会发生什么?

>>> func = 1
>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable

>>> func = 'abc'
>>> func()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable

因此,您的错误表明您尝试调用的函数(changeDirectionTo(3))不是函数,而是字符串。

由于你有一个def changeDirectionTo行声明它作为一个函数,寻找覆盖这个定义的changeDirectionTo的其他用途。

问题出在def __init__。这两行声明一个字符串,然后将其分配给changeDirectionTo,覆盖前一个函数定义。

 self.direction = "RIGHT"
 self.changeDirectionTo = self.direction

使用其他变量名称或删除该行以解决问题。


0
投票

在你的蛇的__init__方法中,你已经定义了一个属性self.changeDirectionTo,它指向一个字符串并覆盖具有相同名称的方法。

你应该删除该行。


0
投票

从你的__init__方法中删除这一行:

self.changeDirectionTo = self.direction

你已经将函数changeDirectionTo变成了一个字符串......


0
投票

去掉

 self.changeDirectionTo = self.direction

您可以使用隐藏方法的相同名称命名方法和实例变量

class Hello:
    def __init__(self):
        self.hello = 'hello instance variable'

    def hello(self):
        print('hello')

h = Hello()
print(h.hello)  # print out hello instance variable
print(h.hello())  # throw the error you got  TypeError: 'str' object is not callable
© www.soinside.com 2019 - 2024. All rights reserved.