简体   繁体   中英

Lives counter in Python turtle graphics

I could do with some help on how to make a lives counter in Python turtle graphics.

My code:

def draw_lives():

    global lives

    lives = turtle.Turtle()
    lives.penup
    lives.hideturtle
    lives.goto(-200, 400)

    while True:
        lives.write("Lives: " + str(lives), font=("Arial", 50, "normal"))
        if lives > 0:
        lives.write("You have lost all lives. Try again.", font=("Arial", 50, "normal"))
        break

I thought on making my lives counter a Turtle and not just a random counter somewhere (which would actually sound better).

Furthermore did I get the error for my if lives > 0: that the > is not supported between instances of Turtle and int .

Can someone help?

Your code is badly constructed -- let's look at specifics. The primary issue is that you use the same variable name, lives , for both the counter and the turtle that displays the counter. Name them differently. If you do so, you don't need:

global lives

The next problem is basic Python:

lives.penup
lives.hideturtle

These are method calls so they should be:

lives.penup()
lives.hideturtle()

Finally your while True: has no business here, or anywere in a turtle event-driven program. And you're missing a line of code or two in your if statement.

Let's rework your code so that it updates the value of the lives counter on the screen:

from turtle import Screen, Turtle

FONT = ("Arial", 24, "normal")

def draw_lives():
    lives_pen.clear()

    if lives > 0:
        lives_pen.write("Lives: " + str(lives), font=FONT)
    else:
        lives_pen.write("You have lost all lives. Try again.", font=FONT)

lives = 5

lives_pen = Turtle()  # this turtle is only used to update lives counter display
lives_pen.hideturtle()
lives_pen.penup()
lives_pen.goto(-200, 300)
lives_pen.write("Lives: " + str(lives), font=FONT)

if __name__ == '__main__':
    from time import sleep

    # test code

    screen = Screen()

    for _ in range(lives + 1):
        draw_lives()
        sleep(1)
        lives -= 1

    screen.exitonclick()

The __main__ section is just test code to confirm that draw_lives() works the way we want -- so toss it.

Utility turtles like lives_pen should only be created once , not every time you need to update the counter as they are global entities and are not garbage collected when the function exits.

It's a bad practice to use global in your code. Instead, you can create a custom attribute for your turtles.

It's super easy, barely an inconvenience:

from turtle import Turtle
pen = Turtle()
pen.lives = 5 # Here, the lives attribute is created

You may even do the same for the font, though it may be unnecessary:

pen.font = ("Arial", 30, "normal")

If loosing lives is the only situation where the life count will be updated, do not keep rewriting them in the loop (unless, of course, the something gets in the way of the text, and you want the text to be displayed on top) , only rewrite it when a life is lost.

We can redraw and update the lives in a function like this:

def update_lives():
    pen.clear()
    if pen.lives:
        pen.write(f"Lives: {pen.lives}", font=pen.font)
    else:
        pen.write("You have lost all lives. Try again.", font=pen.font)
    pen.lives -= 1 # Remove this line and this becomes your typical text updater

To see this in action, I implemented a demo where a life is lost whenever the user presses the SPACE bar:

from turtle import Turtle, Screen

wn = Screen()

def update_lives():
    pen.clear()
    if pen.lives:
        pen.write(f"Lives: {pen.lives}", font=pen.font)
    else:
        pen.write("You have lost all lives. Try again.", font=pen.font)
    pen.lives -= 1

pen = Turtle(visible=False)
pen.penup()
pen.goto(-300, 200)
pen.lives = 5
pen.font = ("Arial", 30, "normal")

update_lives()

wn.listen()
wn.onkey(update_lives, 'space')

With the above code, when the user reaches 0 , pressing SPACE again will make the function proceed to display negative values.

To fix that, for your main game loop, use while pen.lives to tell python to only keep looping until the number of lives remaining is greater than 0 :

while pen.lives:
    # Your game code here
    wn.update()

Output:

在此处输入图像描述

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM