有人可以帮我为我的吃豆子游戏制作边框,这样乌龟就不会碰到蓝色吗?我在使用该功能时遇到了麻烦。这是我的代码:
import turtle
import random
sam=turtle.Turtle()
score=turtle.Turtle()
screen=turtle.Screen()
sam.pensize(10)
sam.speed(0)
sam.penup()
sam.goto(-400,-400)
sam.pendown()
sam.speed(0)
sam.color("blue")
screen.bgcolor("black")
sam.penup()
sam.fd(200)
sam.pendown()
sam.fd(600)
sam.lt(90)
sam.fd(130)
sam.lt(90)
sam.fd(30)
sam.rt(90)
sam.fd(20)
sam.rt(90)
sam.fd(30)
sam.lt(90)
sam.fd(130)
sam.lt(90)
sam.fd(75)
sam.rt(90)
sam.fd(75)
sam.rt(90)
sam.fd(200)
sam.lt(90)
sam.fd(30)
sam.lt(90)
sam.fd(200)
sam.rt(90)
sam.fd(100)
sam.rt(90)
sam.fd(75)
sam.lt(90)
sam.fd(200)
sam.lt(90)
sam.fd(300)
sam.lt(90)
sam.fd(75)
sam.rt(90)
sam.fd(20)
sam.rt(90)
sam.fd(75)
sam.lt(90)
sam.fd(300)
sam.lt(90)
sam.fd(200)
sam.lt(90)
sam.fd(75)
sam.rt(90)
sam.fd(100)
sam.rt(90)
sam.fd(200)
sam.lt(90)
sam.fd(30)
sam.lt(90)
sam.fd(200)
sam.rt(90)
sam.fd(75)
sam.rt(90)
sam.fd(75)
sam.lt(90)
sam.fd(130)
sam.lt(90)
sam.fd(30)
sam.rt(90)
sam.fd(20)
sam.rt(90)
sam.fd(30)
sam.lt(90)
sam.fd(130)
sam.lt(90)
sam.fd(30)
class lshape:
def __init__(self,turtle):
self.turtle=turtle
def draw(self):
sam.fd(100)
sam.lt(90)
sam.fd(50)
sam.lt(90)
sam.fd(20)
sam.lt(90)
sam.fd(30)
sam.rt(90)
sam.fd(80)
sam.lt(90)
sam.fd(20)
sam.lt(90)
class lshape2:
def __init__(self,turtle):
self.turtle=turtle
def draw(self):
self.turtle.fd(150)
self.turtle.lt(90)
self.turtle.fd(20)
self.turtle.lt(90)
self.turtle.fd(40)
self.turtle.rt(90)
self.turtle.fd(70)
self.turtle.lt(90)
self.turtle.fd(20)
self.turtle.lt(90)
self.turtle.fd(70)
self.turtle.rt(90)
self.turtle.fd(90)
self.turtle.lt(90)
self.turtle.fd(20)
class lshape3:
def __init__(self,turtle):
self.turtle=turtle
def draw(self):
self.turtle.fd(150)
self.turtle.rt(90)
self.turtle.fd(20)
self.turtle.rt(90)
self.turtle.fd(65)
self.turtle.lt(90)
self.turtle.fd(70)
self.turtle.rt(90)
self.turtle.fd(20)
self.turtle.rt(90)
self.turtle.fd(70)
self.turtle.lt(90)
self.turtle.fd(65)
self.turtle.rt(90)
self.turtle.fd(20)
class lshape4:
def __init__(self,turtle):
self.turtle=turtle
def draw(self):
for i in range(2):
self.turtle.fd(100)
self.turtle.rt(90)
self.turtle.fd(20)
self.turtle.rt(90)
class lshape5:
def __init__(self,turtle,l):
self.l=l
self.turtle=turtle
def draw(self):
for i in range(2):
self.turtle.fd(self.l)
self.turtle.rt(90)
self.turtle.fd(40)
self.turtle.rt(90)
class Wshape:
def __init__(self,turtle):
self.turtle=turtle
def draw(self):
self.turtle.fd(150)
self.turtle.lt(90)
self.turtle.fd(20)
self.turtle.lt(90)
self.turtle.fd(90)
self.turtle.rt(90)
self.turtle.fd(70)
self.turtle.lt(90)
self.turtle.fd(20)
self.turtle.lt(90)
self.turtle.fd(70)
self.turtle.rt(90)
self.turtle.fd(40)
self.turtle.lt(90)
self.turtle.fd(20)
class Wshape2:
def __init__(self,turtle):
self.turtle=turtle
def draw(self):
sam.fd(100)
sam.rt(90)
sam.fd(50)
sam.rt(90)
sam.fd(20)
sam.rt(90)
sam.fd(30)
sam.lt(90)
sam.fd(80)
sam.rt(90)
sam.fd(20)
sam.lt(90)
class Box:
def __init__(self,turtle,x,y):
self.turtle=turtle
self.x=x
self.y=y
def draw(self):
for i in range(2):
self.turtle.fd(200)
self.turtle.lt(90)
self.turtle.fd(100)
self.turtle.lt(90)
self.turtle.penup()
self.turtle.goto(self.x-5,self.y-5)
self.turtle.pendown()
for i in range(2):
self.turtle.fd(210)
self.turtle.lt(90)
self.turtle.fd(110)
self.turtle.lt(90)
shape=lshape(sam)
shape2=lshape2(sam)
shape3=lshape3(sam)
shape4=lshape4(sam)
shape5=lshape5(sam,100)
wshape=Wshape(sam)
wshape2=Wshape2(sam)
box=Box(sam,-5,-80)
sam.penup()
sam.goto(-120,-270)
sam.lt(90)
sam.pendown()
shape.draw()
sam.penup()
sam.goto(-140,-350)
sam.rt(90)
sam.pendown()
shape2.draw()
sam.penup()
sam.goto(25,-260)
sam.lt(90)
sam.pendown()
shape3.draw()
sam.penup()
sam.goto(190,-350)
sam.rt(90)
sam.pendown()
wshape.draw()
sam.penup()
sam.goto(310,-270)
sam.rt(180)
sam.pendown()
wshape2.draw()
sam.penup()
sam.goto(150,-200)
sam.lt(90)
sam.pendown()
shape4.draw()
sam.penup()
sam.goto(-50,-200)
sam.pendown()
shape4.draw()
sam.penup()
sam.goto(25,-120)
sam.pendown()
shape3.draw()
sam.penup()
sam.goto(-100,-120)
sam.pendown()
shape4.draw()
sam.penup()
sam.goto(265,-120)
sam.pendown()
shape4.draw()
sam.penup()
sam.goto(-5,-80)
sam.pendown()
sam.rt(90)
box.draw()
sam.penup()
sam.goto(-100,20)
sam.pendown()
sam.lt(90)
shape3.draw()
sam.penup()
sam.goto(20,170)
sam.pendown()
sam.rt(180)
shape3.draw()
sam.penup()
sam.goto(280,170)
sam.pendown()
sam.lt(180)
shape3.draw()
sam.penup()
sam.goto(150,250)
sam.pendown()
shape5.draw()
shape5=lshape5(sam,70)
sam.penup()
sam.goto(300,250)
sam.pendown()
shape5.draw()
shape5=lshape5(sam,100)
sam.penup()
sam.goto(-70,250)
sam.pendown()
shape5.draw()
shape5=lshape5(sam,70)
sam.penup()
sam.goto(-190,250)
sam.pendown()
shape5.draw()
j=turtle.Turtle()
j.shape("turtle")
j.color("yellow")
j.penup()
j.goto(200,-370)
j.pendown()
def right():
j.rt(90)
def left():
j.lt(90)
def up():
j.fd(10)
def down():
j.bk(10)
j.penup()
screen.onkey(up,"Up")
screen.onkey(down,"Down")
screen.onkey(right,"Right")
screen.onkey(left,"Left")
screen.listen()
##Im trying to make it so that if the yellow turtle cant go through any of the blue borders. Also I cant use any packages other than turtle.
for i in range(-220,420,1):
x=int(j.xcor())
y=int(j.ycor())
if x-(i)<=5 and y-(-400)<=5:
j.hideturlte()
screen.update()
我试图通过滥用海龟的 xcor 与边界的 xcor 值来找到绝对值的度量。但这不起作用,我想知道是否有更快的方法来解决这个问题。如果有人能给我一段代码来帮助我解决这个问题,我将不胜感激。
划定界限会让处理碰撞变得困难。您可以在绘图周围使用
begin_poly()
和 end_poly()
,然后保存 get_poly()
的结果。然后,您需要一个例程来确定一个点(海龟的位置)是否位于任何多边形内。 (此类例程可在网络上找到。)另一种方法是使用更简单的形状进行构建,例如使用更宽的笔和更少的线条,或者通过冲压统一大小的正方形而不是绘图。
为了保持基本程序的完整性,我们可以向每个
collision()
对象添加一个 lshape*
方法,用于确定形状是否已被海龟击中。您需要保存绘制形状的原始位置。它看起来像这样:
from turtle import Screen, Turtle
PEN_SIZE = 10
CURSOR_SIZE = 20
BOUNDARY = PEN_SIZE/2 + CURSOR_SIZE/2
class lshape1:
def __init__(self, turtle):
self.turtle = turtle
self.position = None
def draw(self):
self.position = self.turtle.position()
self.turtle.left(90)
self.turtle.forward(100)
self.turtle.left(90)
self.turtle.forward(50)
self.turtle.left(90)
self.turtle.forward(20)
self.turtle.left(90)
self.turtle.forward(30)
self.turtle.rt(90)
self.turtle.forward(80)
self.turtle.left(90)
self.turtle.forward(20)
self.turtle.left(90)
def collision(self, position):
# outer bounding box = (0, 0, 50, 100)
# internal safe zone = (0, 0, 30, 80)
x1, y1 = self.position
x2, y2 = position
if x1 - 50 - BOUNDARY < x2 < x1 + BOUNDARY and y1 - BOUNDARY < y2 < y1 + 100 + BOUNDARY:
# inside outer
if x2 < x1 - 20 - BOUNDARY and y2 < y1 + 80 - BOUNDARY:
# inside inner
return False
# outside inner
return True # collision!
return False
screen = Screen()
screen.bgcolor('black')
sam = Turtle()
sam.hideturtle()
sam.color('blue')
sam.pensize(PEN_SIZE)
sam.speed('fastest')
shapes = []
shape1 = lshape1(sam)
sam.penup()
sam.goto(-120, -270)
sam.setheading(0)
sam.pendown()
shape1.draw()
shapes.append(shape1)
j = Turtle()
j.shape('turtle')
j.color('yellow')
j.penup()
j.goto(200, -370)
def right():
j.rt(90)
def left():
j.left(90)
def up():
j.forward(10)
position = j.position()
for shape in shapes:
if shape.collision(position):
j.undo()
return
def down():
j.bk(10)
position = j.position()
for shape in shapes:
if shape.collision(position):
j.undo()
return
screen.onkey(up, 'Up')
screen.onkey(down, 'Down')
screen.onkey(right, 'Right')
screen.onkey(left, 'Left')
screen.listen()
screen.mainloop()
运行它看看这是否是您想要的功能。这种方法对于迷宫的外边界来说是最困难的。
代码建议,让事情变得更容易:将
lshape
重命名为 lshape1
并同上相关变量;将外部边界封装为对象类lshape0
,以便您可以在其上使用与内部边界类似的逻辑。