Simplegui: undefined: RangeError: Превышен максимальный размер стека вызовов

Я использую Python и codeskulptor/simplegui сделать игру, и я получил эту ошибку, которая сказала "undefined: RangeError: Maximum call stack size exceeded"здесь, когда я определяю класс.

import simplegui, random, time 
level = 1
balls = []
class Person():
    def __init__(self):
        self.deg = 0
        self.fall = False
        self.ball = Ball()
class Ball():
    global level
    def __init__(self):
        self.velo = 0
        self.pos = [random.randint(100, 500), 0] //error here
        self.xChange = random.randint(-5, 5)
    def move(self):
        self.velo = level
        self.pos[1] += level
        self.pos[0] += xChange
        if self.pos[0] <= 0 or self.pos[0] >= 600:
            self.xChange *= -1
        if self.pos[1] >= 500:
            self.pos[0] = random.randint(100, 500)
            self.pos[1] = 0 
class Player():
    def __init__(self):
        global balls
        self.posx = 300
        self.velo = 0
        self.gameover = False
        self.pearson = Person()
        self.ball = Ball()
        self.game = Game()
    def left(self):
        self.velo -= 0.5
        self.pearson.deg -= 0.5
    def right(self): 
        self.velo += 0.5 
        self.pearson.deg += 0.5
    def renewInfo(self):
        self.posx += self.velo
    def hit(self):
        if self.posx + 10 <= self.ball.pos[0] and self.posx - 10 >= self.ball.pos[0] and self.ball.pos[1] >= 470:
            self.game.gameover 
class Game():
    global balls
    def __init__(self):
        self.person = Person()
        self.ball = Ball()
        self.player = Player()
    def spBall(self):
        for i in range(10):
            balls.append(self.ball)
    def move(self):
        pass
    def gameover(self):
        pass
game = Game()
def draw(canvas):
    pass
def keydown(key):
    if key == 37:
        game.player.left
    if key == 39:
        game.player.right
def time_handler():
    global level
    level += 1 
timer = simplegui.create_timer(30000, time_handler)
timer.start()
frame = simplegui.create_frame('Quake Control', 800, 500)
frame.set_canvas_background('white')
frame.set_draw_handler(draw) 
frame.set_keydown_handler(keydown)
frame.start()  

Моя идея состоит в том, что вы используете клавиши со стрелками для перемещения и избегаете шаров, но ваше положение вызовет землетрясение, и человек наклонится в этом направлении, если человек упадет или вы ударите по мячу, вы проиграете.

1 ответ

Решение

Вы, кажется, рекурсивно создаете объекты для своего класса, Пример -

Game() -> Player() -> Game() -> .... This goes on.

Это делается в строках -

Для игрового класса -

класс Game(): глобальные шары def init(self): self.person = Person () self.ball = Ball () self.player = Player () # Обратите внимание, что здесь вы создаете объект Player.

Для игрока класса -

class Player():
    def __init__(self):
        global balls
        self.posx = 300
        self.velo = 0
        self.gameover = False
        self.pearson = Person()
        self.ball = Ball()
        self.game = Game()      #Notice you are creating new Game() object here.

Это наиболее вероятно, что вызывает проблему. Вы не должны рекурсивно создавать объекты, как это, если вы хотите Player() иметь ссылку на game передать его из Game()s' __init__() метод в качестве аргумента. Пример -

class Player():
    def __init__(self, person, ball, game):
        global balls
        self.posx = 300
        self.velo = 0
        self.gameover = False
        self.pearson = person
        self.ball = ball
        self.game = game

class Game():
    global balls
    def __init__(self):
        self.person = Person()
        self.ball = Ball()
        self.player = Player(self.person, self.ball, self)
    def spBall(self):
        for i in range(10):
            balls.append(self.ball)
    def move(self):
        pass
    def gameover(self):
        pass

Вы также, скорее всего, создаете ненужные Ball() объект в Person() Скорее всего, вы хотите исправить это там же.

Другие вопросы по тегам