首页 > 解决方案 > 乌龟要走出国门了

问题描述

我正在制作一个蟒蛇龟游戏,你必须在其中捉老鼠。当我靠近鼠标时,它应该会消失,但它并没有完全完成。问题是当我去抓老鼠时,我的乌龟能够逃脱我的游戏边界,而通常当我不追鼠标时,我的乌龟不会离开边界。我不知道为什么。有人可以帮我吗?

我是 python 的初学者,所以我的代码有点乱,而且效率可能不太高。抱歉,这是我的代码:

import turtle
import os
import math
import random

from turtle import *

#Screen
wn = turtle.Screen()
wn.bgcolor("green")
wn.title("Catch and run")
#wn.bgpic("background.gif")
#scene
border_pen = turtle.Turtle()
border_pen.speed(0)
border_pen.color("white")
border_pen.penup()
border_pen.setposition(-300,-200)
border_pen.pensize(3)
border_pen.pendown()
for side in range(2):
    border_pen.fd(600)
    border_pen.lt(90)
    border_pen.fd(405)
    border_pen.lt(90)
#border coordinates:
#x: -300 - 300
#y: -190 - 200
border_pen.hideturtle()

#player
player = turtle.Turtle()
player.color("black")
player.shape("triangle")
player.penup()
player.speed(0)
player.setposition(0,90)
player.lt(90)
player_speed = 15

#movment
def right():
    if player.xcor() < 280:
        player.setheading(360)
        x = player.xcor()
        x += player_speed
        player.setx(x)
def left():
    if player.xcor() > -280:
        player.setheading(180)
        x = player.xcor()
        x -= player_speed
        player.setx(x)
def up():
    if player.ycor() < 185:
        player.setheading(90)
        y = player.ycor()
        y += player_speed
        player.sety(y)
def down():
    if player.ycor() > -170:
        player.setheading(270)
        y = player.ycor()
        y -= player_speed
        player.sety(y)

#mouse
mouse = turtle.Turtle()
mouse.color("white")
mouse.shape("circle")
mouse.penup()
mouse.speed(0)
mouse.setposition(100,150)
mouse.lt(90)
mouse.shapesize(0.5,0.5)
mouse_speed = 14
mouse_direction = "fd"

def move_mouse():
    global mouse_direction
    distance = math.sqrt(math.pow(player.xcor()-mouse.xcor(),2) + math.pow(player.ycor()-mouse.ycor(),2))
    if distance < 80:
        x = mouse.xcor()
        y = mouse.ycor()
        if x < -290:
            mouse_direction = "rt"
        elif x > 290:
            mouse_direction = "lt"
        elif y < -180:
            mouse_direction = "fd"
        elif y > 190:
            mouse_direction = "dw"
        if mouse_direction == "fd":
            y += mouse_speed
        elif mouse_direction == "dw":
            y -= mouse_speed
        elif mouse_direction == "lt":
            x -= mouse_speed
        else:
            x += mouse_speed
        mouse.setx(x)
        mouse.sety(y)

#key binding
turtle.listen()
turtle.onkey(right,"Right")
turtle.onkey(left, "Left")
turtle.onkey(up, "Up")
turtle.onkey(down, "Down")

def game_loop():
    move_mouse()
    turtle.ontimer(game_loop,1)


turtle.ontimer(game_loop,1)
turtle.mainloop()

标签: pythonturtle-graphics

解决方案


我发现玩家的移动存在两个问题。首先,如果onkey()事件处理程序花费的时间太长,即按键重复太快,事件可能会重叠,从而将玩家推到边界之外。其次,当玩家接近一个边界时,步长是固定的并且很大,所以它可以将玩家放在边界的错误一侧——步长需要是固定步长和剩余距离中较小的一个边界。

以下是您的代码的返工,它试图解决上述玩家问题,但由于其运动逻辑不完整而忽略了鼠标参与者:

from turtle import Screen, Turtle

WIDTH, HEIGHT = 600, 400

PLAYER_SPEED = 15
PLAYER_SIZE = 20

# Movement
def right():
    screen.onkey(None, 'Right')  # disable handler inside handler

    x = player.xcor()

    if x < WIDTH/2 - PLAYER_SIZE:
        player.setheading(0)
        player.setx(x + min(PLAYER_SPEED, WIDTH/2 - PLAYER_SIZE - x))

    screen.onkey(right, 'Right')  # reenable on exit

def left():
    screen.onkey(None, 'Left')

    x = player.xcor()

    if x > PLAYER_SIZE - WIDTH/2:
        player.setheading(180)
        player.setx(x - min(PLAYER_SPEED, x + WIDTH/2 - PLAYER_SIZE))

    screen.onkey(left, 'Left')

def up():
    screen.onkey(None, 'Up')

    y = player.ycor()

    if y < HEIGHT/2 - PLAYER_SIZE:
        player.setheading(90)
        player.sety(y + min(PLAYER_SPEED, HEIGHT/2 - PLAYER_SIZE - y))

    screen.onkey(up, 'Up')

def down():
    screen.onkey(None, 'Down')

    y = player.ycor()

    if y > PLAYER_SIZE - HEIGHT/2:
        player.setheading(270)
        player.sety(y - min(PLAYER_SPEED, y + HEIGHT/2 - PLAYER_SIZE))

    screen.onkey(down, 'Down')

# Screen
screen = Screen()
screen.bgcolor('green')
screen.title("Catch and run")

# Border
border_pen = Turtle()
border_pen.hideturtle()
border_pen.speed('fastest')
border_pen.color('white')
border_pen.pensize(3)

border_pen.penup()
border_pen.setposition(-WIDTH/2, -HEIGHT/2)
border_pen.pendown()

for side in range(2):
    border_pen.fd(WIDTH)
    border_pen.lt(90)
    border_pen.fd(HEIGHT)
    border_pen.lt(90)

# player
player = Turtle()
player.shape('triangle')
player.speed('fastest')
player.penup()

# key binding
screen.onkey(right, 'Right')
screen.onkey(left, 'Left')
screen.onkey(up, 'Up')
screen.onkey(down, 'Down')
screen.listen()

screen.mainloop()

推荐阅读