0

我正在使用 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()  

我的想法是你用方向键移动,避开球,但是你的位置会引起地震,一个人会朝那个方向倾斜,如果这个人摔倒或者你撞到球,你就输了。

4

1 回答 1

0

您似乎正在为您的班级递归创建对象,例如 -

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

这是在行中完成的 -

对于游戏类 -

class Game(): global balls 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.

这很可能是导致问题的原因。你不应该像这样递归地创建对象,如果你想要从s'方法作为参数传递它Player()的引用。例子 -gameGame()__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(),很可能您也想在那里以类似的方式修复它。

于 2015-08-07T07:19:22.053 回答