首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在游戏中添加计时器,使游戏在计时器为0时重置?

如何在游戏中添加计时器,使游戏在计时器为0时重置?
EN

Stack Overflow用户
提问于 2019-05-04 10:14:41
回答 1查看 152关注 0票数 0

我正在制作一个屏幕上有追逐者和跑步者(鲍勃和菲尔)的游戏。它很像tag。到目前为止,如果追逐者与跑步者相撞,游戏会重置,玩家会回到原来的位置。我想添加一个计时器,这样当计时器达到0时,游戏就会重置。

我想有一个名为'time‘的变量,并将其设置为60。然后,我会用time -= 1和time.sleep函数使变量每秒减去1。问题是time.sleep函数会停止整个程序。有没有办法在我的游戏中实现一个计时器而不会遇到前面提到的问题?

代码语言:javascript
复制
import turtle
import math

# Distance formula for collision checking
def isCollision(t1, t2):
    distance = math.sqrt(math.pow(t1.xcor()-t2.xcor(),2)+math.pow(t1.ycor()-t2.ycor(),2))
    if distance < 30:
        return True
    else:
        return False

# Makes the wn that the game is played on
wn = turtle.Screen()
wn.bgcolor("black")
wn.setup(width = 900, height = 900)
wn.tracer()

# Runs the actual game when space is pressed, see around end of code to understand
def game():
        start.clear()
        runner = "omright.gif"
        chaser = "pilav angry.gif"
        wn.addshape(chaser)
        wn.addshape(runner)

        #Designs the 4 sides of the game
        border_pen = turtle.Turtle()
        border_pen.speed(0)
        border_pen.color("white")
        border_pen.penup()
        border_pen.setposition(-300,-300)
        border_pen.pendown()
        border_pen.pensize(3)
        for side in range(4):
            border_pen.fd(600)
            border_pen.lt(90)
        border_pen.hideturtle()

        title = turtle.Turtle()
        title.speed(0)
        title.color("white")
        title.penup()
        title.setpos(0, 325)
        title.write("THE TAG GAME BY OM", False, align = 'center', font=('Impact', 55, 'normal'))
        title.setpos(370, 315)
        title.write("Patent Pending", False, align = 'center', font=('Calibri', 11, 'normal'))
        title.setpos(370, -335)
        title.write("Not Really Pending", False, align = 'center', font=('Calibri', 11, 'normal'))
        title.hideturtle()

        # First turtle (basically an object that can be manipulated)
        bob = turtle.Turtle()
        bob.speed(0)
        bob.color("blue")
        bob.penup()
        bob.setpos(-50, 0)
        bob.seth(0)
        bob.shape(chaser)


        # Function to move first turtle (bob)
        def fd():
            bob.seth(90)
            bob.fd(20)
            # Border Checking
            if bob.xcor() > 280:
                bob.setx(280)
            if bob.ycor() > 280:
                bob.sety(280)

            if bob.xcor() < -280:
                bob.setx(-280)
            if bob.ycor() < -280:
                bob.sety(-280)
            # Checks for collision with enemy player
            if isCollision(bob, phil):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)

        # Moves right (90 degrees)
        def right():
            bob.seth(0)
            bob.fd(20)
            # Border Checking
            if bob.xcor() > 280:
                bob.setx(280)
            if bob.ycor() > 280:
                bob.sety(280)

            if bob.xcor() < -280:
                bob.setx(-280)
            if bob.ycor() < -280:
                bob.sety(-280)
            # Checks for collision with enemy player
            if isCollision(bob, phil):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)

        # Moves left (90 degrees)
        def left():
            bob.seth(180)
            bob.fd(20)
            # Border Checking
            if bob.xcor() > 280:
                bob.setx(280)
            if bob.ycor() > 280:
                bob.sety(280)

            if bob.xcor() < -280:
                bob.setx(-280)
            if bob.ycor() < -280:
                bob.sety(-280)
            # Checks for collision with enemy player
            if isCollision(bob, phil):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)
        def down():
            bob.seth(270)
            bob.fd(20)
            # Border Checking
            if bob.xcor() > 280:
                bob.setx(280)
            if bob.ycor() > 280:
                bob.sety(280)
                phil.seth(180)

            if bob.xcor() < -280:
                bob.setx(-280)
            if bob.ycor() <- 280:
                bob.sety(-280)
            # Checks for collision with enemy player
            if isCollision(bob, phil):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)

        # Logs keys and outputs function
        wn.listen()
        wn.onkey(left, "Left")
        wn.onkey(fd, "Up")
        wn.onkey(right, "Right")
        wn.onkey(down, "Down")

        # Second turtle
        phil = turtle.Turtle()
        phil.speed(0)
        phil.penup()
        phil.shape("triangle")
        phil.color("red")
        phil.setpos(50, 0)
        phil.seth(180)
        phil.shape(runner)

        #Refer back to first turtle
        def fdp():
            phil.seth(90)
            phil.fd(20)
            if phil.xcor() > 280:
                phil.setx(280)
            if phil.ycor() > 280:
                phil.sety(280)

            if phil.xcor() < -280:
                phil.setx(-280)
            if phil.ycor() < -280:
                phil.sety(-280)
            if isCollision(bob, phil):
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)
        def rightp():
            phil.seth(0)
            phil.fd(20)
            # Border Checking
            if phil.xcor() > 280:
                phil.setx(280)
            if phil.ycor() > 280:
                phil.sety(280)

            if phil.xcor() < -280:
                phil.setx(-280)
            if phil.ycor() < -280:
                phil.sety(-280)
            # Checks for collision with enemy player
            if isCollision(phil, bob):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)


        def leftp():
            phil.seth(180)
            phil.fd(20)
            # Border Checking
            if phil.xcor() > 280:
                phil.setx(280)
            if phil.ycor() > 280:
                phil.sety(280)

            if phil.xcor() < -280:
                phil.setx(-280)
            if phil.ycor() < -280:
                phil.sety(-280)
            # Checks for collision with enemy player
            if isCollision(phil, bob):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)

        def downp():
            phil.seth(270)
            phil.fd(20)
            # Border Checking
            if phil.xcor() > 280:
                phil.setx(280)
            if phil.ycor() > 280:
                phil.sety(280)

            if phil.xcor() < -280:
                phil.setx(-280)
            if phil.ycor() < -280:
                phil.sety(-280)
            # Checks for collision with enemy player
            if isCollision(phil, bob):
                # If there is collision, resets players'
                bob.setposition(-50, 0)
                phil.setposition(50, 0)
                bob.seth(0)
                phil.seth(180)

        wn.listen()
        wn.onkey(leftp, "a")
        wn.onkey(fdp, "w")
        wn.onkey(rightp, "d")
        wn.onkey(downp, "s")





# Just a start screen
start = turtle.Turtle()
start.speed(0)
start.color("white")
start.penup()
start.goto(0, 0)
start.write("PRESS SPACE TO START!", False, align='center', font=('Arial Bold', 48, 'normal'))
start.hideturtle()

wn.listen()
wn.onkey(game, "space")

# Stops the program from closing automatically when it is run

turtle.done()

除了实际的计时器,我希望在屏幕顶部以文本形式显示计时器,但我相当有信心,当我可以实际添加计时器时,我会很有信心地完成它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-04 10:29:24

我不熟悉您用来创建游戏的包,但我发现在答案状态中有一个在turtle中的ontimer()函数的similar question

特别有趣的是这一部分:

代码语言:javascript
复制
def countdown():
    global timer

    timer -= 1

    if timer <= 0:  # time is up, disable user control
        wn.onkey(None, 'Left')
        wn.onkey(None, 'Right')
        wn.onkey(None, 'Up')
        wn.onkey(None, 'Down')
        # Whatever else you need to do to tell the user its game over
    else:
        wn.ontimer(countdown, 1000)  # one second from now

wn.ontimer(countdown, 1000) # start the timer

所以这个函数只是在设定的毫秒数(1000,在本例中是1秒)之后调用它自己,如果它为零就会禁用控制(根据游戏的需要进行定制)。

您可以将计时器设置为100ms,并将timer -= 1更改为-= 0.1,以获得更精确的时钟以便于显示。

只需记住在全局位置创建一个计时器即可。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55978917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档