1

我正在用 PyGame 开发一个小型蠕虫程序。我有一条虫子吃苹果,每次它吃一个苹果就长。当它遇到自己的尾巴或窗户边缘时,它“游戏结束”。我想随机添加有毒的坏苹果。这些苹果出现在屏幕上的任何地方,在某个尚未被苹果占据的地方。相反,好苹果一次出现一个。当wormy吃掉一个苹果时,它会长一个,屏幕上会出现另一个苹果。所以,我想我应该在一个单独的线程中生产坏苹果。但是,我想在主线程中访问坏苹果的位置等,以便虫子在遇到坏苹果时死亡。

你知道怎么写吗?

我想在 main() 中有这个

# Start bad apples thread
threading.Thread(target=badApples).start()

所以 main() 最终看起来像这样:

def runGame():
# Set a random start point.
startx = random.randint(5, CELLWIDTH-5)
starty = random.randint(5, CELLHEIGHT-5)
wormCoords = [{'x': startx,     'y': starty},
              {'x': startx - 1, 'y': starty},
              {'x': startx - 2, 'y': starty}]
direction = RIGHT

# Start the apple in a random place.
apple = getRandomLocation()

# Start bad apples thread
threading.Thread(target=badApples).start()

while True: # main game loop
    for event in pygame.event.get(): # event handling loop
        if event.type == QUIT:
            terminate()
        elif event.type == KEYDOWN:
            if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
                direction = LEFT
            elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
                direction = RIGHT
            elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
                direction = UP
            elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
                direction = DOWN
            elif event.key == K_ESCAPE:
                terminate()

    # check if the worm has hit itself or the edge
    if wormCoords[HEAD]['x'] == -1 or wormCoords[HEAD]['x'] == CELLWIDTH or wormCoords[HEAD]['y'] == -1 or wormCoords[HEAD]['y'] == CELLHEIGHT:
        return # game over
    for wormBody in wormCoords[1:]:
        if wormBody['x'] == wormCoords[HEAD]['x'] and wormBody['y'] == wormCoords[HEAD]['y']:
            return # game over

    # etc... 

(主要来自http://inventwithpython.com/的代码)

和一个以 badApples 开头的目标方法

def badApples():
    time.sleep(random.randint(200,500))
    badApple = getRandomLocation()

但是如何在主线程中恢复坏苹果的位置,以删除蠕虫?

谢谢并恭祝安康

4

1 回答 1

4

您绝对不必为此使用线程。由于您可以控制游戏循环,因此您可以安排创建一个坏苹果(使用某种倒计时)。

创建一个变量,该变量将存储一个值,该值指示新的坏苹果何时出现,以及已创建的坏苹果列表。

def get_bad_apple_time():
    # create a bad apple every 5 to 15 seconds
    # assuming your FPS is 60 
    return random.randrange(5, 16) * 60 

#  all bad apple coordinates go here
bad_apples = []  

# timeout until the next bad apple shows up
next_bad_apple = get_bad_apple_time()

在您的主循环中,减小 next_bad_apple 的值。如果达到0,则创建一个坏苹果并重新开始。

while True:
    ...
    next_bad_apple -= 1
    if not next_bad_apple:
        pos = getRandomLocation()

        # if there's already a bad apple on this position
        # create a new position
        while pos in bad_apples:
            pos = getRandomLocation()

        bad_apples.append(pos)
        next_bad_apple = get_bad_apple_time()
于 2012-07-09T12:02:56.233 回答