【问题标题】:Logic error in python turtlepython乌龟中的逻辑错误
【发布时间】:2016-03-19 21:45:20
【问题描述】:

我正在使用 python 3.2 turtle 进行编码,并且我有这张漂亮的坦克图。我知道如何将它向左移动并写入。然而,当试图让坦克上下移动时。我面临它上升的问题,但如果我放手并再次按下向上按钮。它向左转。可能很难解释,所以我附上了代码。

"""
Programmer: Bert
Tank Run 1
"""

#------------------------------------------------------------------------------
#Importing random modules geddit
from turtle import *
from turtle import Turtle
import turtle
import random

#Welcome Statement and story
input("WELCOME TO TANK RUN 1!! PRESS ENTER TO CONTINUE")
Name = input("Name your Tank: ")
quitFunction = input(
"""The """ + Name + """ is in a battle and heading toward the
enemy base camp so that the """ + Name + """ can blow it up
Get to the base camp and do not let enemy
artillery, or soldiers kill you. Good luck"""
)

#setting up variables
unVar1 = 25
unVar2 = 100
unVar3 = 90
unVar4 = 150
unVar5 = -30
unVar6 = 75
unVar7 = 50
t = Turtle()

#defining shapes
def polySquare(t, x, y, length):
    t.goto(x, y)
    t.setheading(270)
    t.begin_poly()
    for count in range(4):
        t.forward(length)
        t.left(90)
    t.end_poly()
    return t.get_poly()

def polyCircle(t, x, y, radius):
    t.up()
    t.goto(x, y)
    t.down()
    t.hideturtle()
    t.circle(radius)
    t.end_poly()
    return t.get_poly()

def polyRectangle(t, x, y, length1, length2):
    t.goto(x, y)
    t.setheading(270)
    t.begin_poly()
    for count in range(2):
        t.forward(length1)
        t.left(90)
        t.forward(length2)
        t.left(90)
    t.end_poly()
    return t.get_poly()

def drawLine(t, x1, x2, y1, y2):
    t.up()
    t.hideturtle()
    t.goto(x1, y1)
    t.do+wn()
    t.goto(x2, y2)

def tankCursor():
    """
    Create the tank cursor.  An alternate solution is to toss the temporary turtle
    and use the commented out polygon assignments instead of the poly* function calls
    """
    temporary = turtle.Turtle()
    screen = turtle.getscreen()
    delay = screen.delay()
    screen.delay(0)
    temporary.hideturtle()
    temporary.penup()
    tank = turtle.Shape("compound")
    # tire1 = ((10, unVar1), (10, unVar1 - unVar6), (10 + 30, unVar1 - unVar6), (10 + 30, unVar1))
    tire1 = polyRectangle(temporary, 10, unVar1, unVar6, 30)  # Tire #1
    tank.addcomponent(tire1, "gray", "black")
    # tire2 = ((110, unVar1), (110, unVar1 - unVar6), (110 + 30, unVar1 - unVar6), (110 + 30, unVar1))
    tire2 = polyRectangle(temporary, 110, unVar1, unVar6, 30)  # Tire #2
    tank.addcomponent(tire2, "gray", "black")
    # tire3 = ((110, unVar2), (110, unVar2 - unVar6), (110 + 30, unVar2 - unVar6), (110 + 30, unVar2))
    tire3 = polyRectangle(temporary, 110, unVar2, unVar6, 30)  # Tire #3
    tank.addcomponent(tire3, "gray", "black")
    # tire4 = ((10, unVar2), (10, unVar2 - unVar6), (10 + 30, unVar2 - unVar6), (10 + 30, unVar2))
    tire4 = polyRectangle(temporary, 10, unVar2, unVar6, 30)  # Tire #4
    tank.addcomponent(tire4, "gray", "black")
    # bodyTank = ((20, unVar3), (20, unVar3 - 130), (20 + 110, unVar3 - 130), (20 + 110, unVar3))
    bodyTank = polyRectangle(temporary, 20, unVar3, 130, 110)
    tank.addcomponent(bodyTank, "black", "gray")
    # gunTank = ((65, unVar4), (65, unVar4 - 100), (65 + 20, unVar4 - 100), (65 + 20, unVar4))
    gunTank = polyRectangle(temporary, 65, unVar4, 100, 20)   # Gun
    tank.addcomponent(gunTank, "black", "gray")
    # exhaustTank = ((50, unVar5), (50, unVar5 - 20), (50 + 10, unVar5 - 20), (50 + 10, unVar5))
    exhaustTank = polyRectangle(temporary, 50, unVar5, 20, 10)
    tank.addcomponent(exhaustTank, "black", "gray")
    # turretTank = ((50, unVar7), (50, unVar7 - 50), (50 + 50, unVar7 - 50), (50 + 50, unVar7))
    turretTank = polySquare(temporary, 50, unVar7, 50)  # Turret
    tank.addcomponent(turretTank, "red", "gray")
    turtle.addshape("tank", shape=tank)
    del temporary
    screen.delay(delay)

tankCursor()  # creates and registers the "tank" cursor shape
tank = turtle
tank.shape("tank")

turtle.up()  # get rid of the ink
screen = turtle.Screen()

def moveforward():    #I cannot get this function to work
    tank.left(90)
    tank.forward(40)

def movebackward():    #I cannot get this function to work
    tank.left(90)
    tank.backward(40)

def moveright():
    tank.forward(40)

def moveleft():
    tank.backward(40)

#Background color
t.screen.bgcolor("green")

#Movement of tank
screen.onkeypress(moveright, "Right")
screen.onkeypress(moveleft, "Left")
screen.onkeypress(moveforward, "Up")
screen.onkeypress(movebackward, "Down")

【问题讨论】:

    标签: python python-3.x turtle-graphics


    【解决方案1】:

    在绘制自定义光标时,除非您有理由不这样做,否则请保持光标设计以原点 (0, 0) 为中心。如果你画到原点的一侧,那么当你的乌龟向右或向左转时,它不会对称地这样做。也就是说,当它朝一个方向转动时,它看起来会转得很快,但在相反的方向上,它会显得“绕远路”。

    我已经处理了坦克光标下方的多边形,使其中心是炮塔的中心,并从绘图例程中删除了 setheading() 调用。

    这个例子使用了我认为是一致的运动:无论坦克方向如何,“上”是向前,“下”是向后,“左”是向左 90 度,“右”是向右 90 度。我还精简了示例,只是为了演示动议:

    import turtle
    
    # Defining shapes
    def polySquare(t, x, y, length):
        t.goto(x, y)
        t.begin_poly()
        for count in range(4):
            t.forward(length)
            t.left(90)
        t.end_poly()
        return t.get_poly()
    
    def polyRectangle(t, x, y, length1, length2):
        t.goto(x, y)
        t.begin_poly()
        for count in range(2):
            t.forward(length1)
            t.left(90)
            t.forward(length2)
            t.left(90)
        t.end_poly()
        return t.get_poly()
    
    def tankCursor():
        """
        Create the tank cursor.
        """
        temporary = turtle.Turtle()
        temporary.hideturtle()
        temporary.penup()
    
        screen = turtle.getscreen()
        delay = screen.delay()
        screen.delay(0)
    
        tank = turtle.Shape("compound")
        tire1 = polyRectangle(temporary, -65, -75, 30, 75)  # Tire #1
        tank.addcomponent(tire1, "gray", "black")
        tire2 = polyRectangle(temporary, 35, -75, 30, 75)  # Tire #2
        tank.addcomponent(tire2, "gray", "black")
        tire3 = polyRectangle(temporary, 35, 0, 30, 75)  # Tire #3
        tank.addcomponent(tire3, "gray", "black")
        tire4 = polyRectangle(temporary, -65, 0, 30, 75)  # Tire #4
        tank.addcomponent(tire4, "gray", "black")
        bodyTank = polyRectangle(temporary, -55, -65, 110, 130)
        tank.addcomponent(bodyTank, "black", "gray")
        gunTank = polyRectangle(temporary, -10, 25, 20, 100)   # Gun
        tank.addcomponent(gunTank, "black", "gray")
        exhaustTank = polyRectangle(temporary, -25, -75, 10, 20)
        tank.addcomponent(exhaustTank, "black", "gray")
        turretTank = polySquare(temporary, -25, -25, 50)  # Turret
        tank.addcomponent(turretTank, "red", "gray")
        turtle.addshape("tank", shape=tank)
    
        del temporary
        screen.delay(delay)
    
    tankCursor()  # creates and registers the "tank" cursor shape
    turtle.shape("tank")
    turtle.up()  # get rid of the ink
    
    # Movement of tank
    screen = turtle.Screen()
    screen.onkeypress(lambda : turtle.right(90), "Right")
    screen.onkeypress(lambda : turtle.left(90), "Left")
    screen.onkeypress(lambda : turtle.forward(40), "Up")
    screen.onkeypress(lambda : turtle.backward(40), "Down")
    
    turtle.listen()
    
    turtle.mainloop()
    

    【讨论】:

    • 非常感谢您解决我的问题。
    • @cdlane 这将解决 OPs 问题,但不会解释他们做错了什么或为什么错了,也不会帮助未来的用户。
    • @XamuelSchulman,我已经修改了我的答案,以更好地解决设计与原点对称的海龟光标的具体问题——我希望它可以解决你的合理担忧,即没有足够的带回家在这个答案中给其他人留言。
    猜你喜欢
    • 2020-07-19
    • 2023-03-28
    • 1970-01-01
    • 2021-04-07
    • 2017-08-09
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多