python 乌龟倒数生命

Counting down lives in python turtle

我正在尝试创建一个简单的 python 乌龟游戏,其中乌龟需要进入圆圈,同时避开移动的方块。我希望代码对生命进行倒计时并将乌龟移回起点,直到剩下 0 条生命。下面的代码允许一次播放,然后运动循环不会重复。

我试过递归函数(move(3)),但是 onkey 命令不起作用....

import turtle, random, time

#background
canvas = turtle.Screen()
canvas.bgcolor('black')

#Pen
pen = turtle.Turtle()
pen.penup()
pen.color('white')
pen.hideturtle()
pen.penup()

#Lilypad
pad = turtle.Turtle()
pad.hideturtle()
pad.color('yellow')
pad.shape('circle')
pad.penup()
pad.setposition(0,290)
pad.showturtle()

#Turtle
player = turtle.Turtle()
player.hideturtle()
player.shape('turtle')
player.color('green')
player.penup()
player.left(90)
player.setposition(0, -290)
player.showturtle()

#truck
truck1 = turtle.Turtle()
truck1.hideturtle()
truck1.shape('square')
truck1.color('blue')
truck1.penup()
truck1.showturtle()

speed = random.randint(1,5)

def move():
  #move player and truck
  player.forward(2)
  truck1.forward(speed)
  if truck1.xcor() > 300 or truck1.xcor() < -300:
    truck1.right(180)

 #win if hit the lilypad
  if player.distance(pad)<10:
    pen.penup()
    pen.setposition(0,-50)
    pen.write('You win!', align='left', font=('Arial', 36, 'normal'))
    done()

  #lose a life if hit the truck
  if player.distance(truck1) < 30:
    player.setposition(0,-290)
    life = life - 1
    while life > 0:
      pen.penup()
      pen.setposition(0,-60)
      pen.write('Try again', align='left', font=('Arial', 36, 'normal'))
      time.sleep(1)
      pen.clear()
      move()

    #game over if 0 lives left
    pen.penup()
    pen.setposition(0,-60)
    pen.write('Game over!', align='left', font=('Arial', 36, 'normal'))
    done()

  canvas.ontimer(move,10)

canvas.onkey(lambda:player.setheading(90),'Up')
canvas.onkey(lambda:player.setheading(180),'Left')
canvas.onkey(lambda:player.setheading(0),'Right')
canvas.onkey(lambda:player.setheading(270),'Down')
canvas.listen()

life = 3
move()
canvas.mainloop()

这样做的关键是将 所有 初始化代码移动到一个函数中,该函数在最后一步调用您的 move() 函数。初始化代码做的第一件事是调用 canvas.clear(),这几乎消除了所有内容。然后您的 move() 函数在最后选择是在下一次计时器迭代时调用自身,还是在下一次计时器迭代时调用初始化代码以重置所有内容并开始新游戏。

下面是您按照上述行以及各种柚木修改后的代码:

from turtle import Screen, Turtle
from random import randint
from time import sleep

FONT = ('Arial', 36, 'normal')

def initialize():
    global pen, pad, player, truck, speed, life

    canvas.clear()  # assume that this resets *everything*
    # background
    canvas.bgcolor('black')

    # Pen
    pen = Turtle(visible=False)
    pen.color('white')
    pen.penup()

    # Lilypad
    pad = Turtle('circle', visible=False)
    pad.color('yellow')
    pad.penup()
    pad.setposition(0, 290)
    pad.showturtle()

    # Turtle
    player = Turtle('turtle', visible=False)
    player.color('green')
    player.penup()
    player.setheading(90)
    player.setposition(0, -290)
    player.showturtle()

    # truck
    truck = Turtle('square', visible=False)
    truck.color('blue')
    truck.penup()
    truck.showturtle()

    speed = randint(1, 5)

    canvas.onkey(lambda: player.setheading(90), 'Up')
    canvas.onkey(lambda: player.setheading(180), 'Left')
    canvas.onkey(lambda: player.setheading(0), 'Right')
    canvas.onkey(lambda: player.setheading(270), 'Down')
    canvas.listen()

    life = 3

    move()

def move():
    global life

    # move player and truck
    player.forward(2)

    truck.forward(speed)
    if not -300 < truck.xcor() < 300:
        truck.right(180)

    # lose a life if hit the truck
    if player.distance(truck) < 20:
        player.setposition(0, -290)
        life -= 1

        if life > 0:
            pen.setposition(0, -60)
            pen.write('Try again', font=FONT)
            sleep(1)
            pen.clear()

    # win if hit the lilypad
    if player.distance(pad) < 20:
        pen.setposition(0, -50)
        pen.write('You win!', font=FONT)
        canvas.ontimer(initialize, 1000)
    elif life == 0:  # game over if 0 lives left
        pen.setposition(0, -60)
        pen.write('Game over!', font=FONT)
        canvas.ontimer(initialize, 1000)
    else:
        canvas.ontimer(move, 10)

canvas = Screen()

pen = None
pad = None
player = None
truck = None
speed = -1
life = -1

initialize()

canvas.mainloop()

无论您是赢了还是 运行 没命,这都可以让您重新玩一遍。