python - 乌龟要走出国门了
问题描述
我正在制作一个蟒蛇龟游戏,你必须在其中捉老鼠。当我靠近鼠标时,它应该会消失,但它并没有完全完成。问题是当我去抓老鼠时,我的乌龟能够逃脱我的游戏边界,而通常当我不追鼠标时,我的乌龟不会离开边界。我不知道为什么。有人可以帮我吗?
我是 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()
解决方案
我发现玩家的移动存在两个问题。首先,如果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()