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()
Скорее всего, вы хотите исправить это там же.