为我的吃豆子游戏制作边框,这样乌龟就不会碰到蓝色

问题描述 投票:0回答:1

有人可以帮我为我的吃豆子游戏制作边框,这样乌龟就不会碰到蓝色吗?我在使用该功能时遇到了麻烦。这是我的代码:

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 值来找到绝对值的度量。但这不起作用,我想知道是否有更快的方法来解决这个问题。如果有人能给我一段代码来帮助我解决这个问题,我将不胜感激。

python border turtle-graphics pacman thonny
1个回答
0
投票

划定界限会让处理碰撞变得困难。您可以在绘图周围使用

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
,以便您可以在其上使用与内部边界类似的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.