Python龟游戏,制作不在境外的墙壁

时间:2017-11-15 16:59:40

标签: python-3.x turtle-graphics

我正在尝试用Python龟制作游戏。我知道这不是它的用途,但我认为这很有趣。在我的游戏中我有一条“河流”,我不希望玩家能够穿过,除非他们越过桥梁,所以我试图让它们如果他们试图越过河流就回到起点没有使用桥梁。多次尝试后,我只是不知道该怎么做。 这是我的代码:

import turtle
import random
import time
wn = turtle.Screen()
layout = turtle.Turtle()
layout.speed(100)
layout.up()

wn.bgcolor("lightgreen")
def drawTree(t, sd):
for i in range(4):
    layout.down()
    t.forward(sd)
    t.right(90)
    layout.up()

def drawRiver():
for i in range(2):
    print(layout.pos()[0])
    print(layout.pos()[1])
    layout.color("darkblue")
    layout.fillcolor("blue")
    layout.begin_fill()
    layout.down()
    layout.forward(2000)
    layout.right(90)
    layout.forward(99)
    layout.right(90)
    layout.forward(4000)
    layout.end_fill()
    layout.up()

def tree(branchLen,layout):
if branchLen > 6:
    layout.down()
    layout.forward(branchLen)
    layout.right(20)
    tree(branchLen-6,layout)
    layout.left(40)
    tree(branchLen-6,layout)
    layout.right(20)
    layout.backward(branchLen)
    layout.up()

def main():
myWin = turtle.Screen()
layout.left(90)
layout.up()
layout.backward(100)
layout.down()
layout.color("brown")
tree(36,layout)
layout.right(90)
layout.up()


def drawBridge():
layout.goto(50, -120)
layout.down()
layout.color("rosybrown4")
layout.fillcolor("saddlebrown")
layout.begin_fill()
layout.forward(100)
layout.left(90)
layout.forward(150)
layout.left(90)
layout.forward(100)
layout.left(90)
layout.forward(150)
layout.left(90)
layout.up()
layout.end_fill()
layout.goto(150, -118)
layout.left(90)
for i in range(38):
    layout.pensize(.1)
    layout.down()
    layout.color("black")
    layout.forward(.1)
    layout.left(90)
    layout.forward(100)
    layout.left(90)
    layout.forward(.1)
    layout.left(90)
    layout.forward(100)
    layout.left(90)
    layout.up()
    layout.forward(4)
layout.up()
layout.right(90)

layout.goto(-799, 0)
drawRiver()
drawBridge()
# Tree locations
layout.goto(222, 198)
main()
layout.goto(-334, 155)
main()
layout.goto(132, 140)
main()
layout.goto(400, -200)
main()
layout.goto(50, -222)
main()
layout.goto(180, -122)
main()
layout.goto(-400, 400)
main()
layout.goto(-332, -332)
main()
layout.goto(-472, 400)
main()
layout.goto(-400, -380)
main()
layout.goto(-362,200)
main()
layout.goto(-222, 198)
main()
layout.goto(-750, -300)
main()
layout.goto(600, -467)
main()
layout.goto(100, 450)
main()
layout.goto(-100, 400)
main()
layout.goto(-600, 400)
main()
layout.goto(500, 123)
main()
layout.goto(700, 400)
main()
layout.goto(350, 350)
main()

layout.color("blue")
layout.goto(0, -50)
Player = turtle.Turtle()
Player.up()
Player.goto(0, -200)
Player.left(90)

def k1():
Player.forward(45)

def k2():
Player.left(30)

def k3():
Player.right(30)

def k4():
Player.back(45)

wn.onkey(k1, "Up")
wn.onkey(k2, "Left")
wn.onkey(k3, "Right")
wn.onkey(k4, "Down")

wn.listen()

1 个答案:

答案 0 :(得分:0)

您的代码是一项挑战。

对于这个例子,我扔了你的树和桥板,因为它们对问题没有影响。由于您的河流和桥梁是矩形的,我将它们的绘图包裹在begin_poly()end_poly()组合中,以便我们拥有这些矩形的边界框。然后,对于两个运动命令(向前和向后),我们测试结果运动是否将我们放入河中,而不是桥梁,如果是这样的话,只需goto()起始位置:

from turtle import Turtle, Screen

def inside(point, rectangle):
    x, y = point

    # not efficient, just a quick solution
    x1 = min(p[0] for p in rectangle)
    y1 = min(p[1] for p in rectangle)
    x2 = max(p[0] for p in rectangle)
    y2 = max(p[1] for p in rectangle)

    return x1 < x < x2 and y1 < y < y2

def not_safe(turtle):
    position = turtle.position()
    return inside(position, river) and not inside(position, bridge)

def drawRiver(turtle):
    turtle.color('darkblue', 'blue')

    turtle.goto(-WIDTH / 2, 0)

    turtle.begin_poly()
    turtle.begin_fill()
    turtle.forward(WIDTH)
    turtle.right(90)
    turtle.forward(100)
    turtle.right(90)
    turtle.forward(WIDTH)
    turtle.end_fill()
    turtle.end_poly()

    return turtle.get_poly()

def drawBridge(turtle):
    turtle.right(180)
    turtle.goto(50, -120)
    turtle.color('rosybrown4', 'saddlebrown')

    turtle.begin_poly()
    turtle.begin_fill()
    turtle.forward(100)
    turtle.left(90)
    turtle.forward(150)
    turtle.left(90)
    turtle.forward(100)
    turtle.left(90)
    turtle.end_fill()
    turtle.end_poly()

    return turtle.get_poly()

wn = Screen()
wn.bgcolor('lightgreen')
WIDTH = wn.window_width()

layout = Turtle(visible=False)
layout.speed('fastest')
layout.penup()

river = drawRiver(layout)
bridge = drawBridge(layout)

player = Turtle('turtle')
player.penup()

player.goto(0, -200)
player.setheading(90)

def k1():
    player.forward(45)
    if not_safe(player):
        player.goto(0, -200)
        player.setheading(90)


def k2():
    player.back(45)
    if not_safe(player):
        player.goto(0, -200)
        player.setheading(90)

def k3():
    player.left(30)

def k4():
    player.right(30)

wn.onkey(k1, 'Up')
wn.onkey(k2, 'Down')
wn.onkey(k3, 'Left')
wn.onkey(k4, 'Right')

wn.listen()
wn.mainloop()

enter image description here