无法使用龟图形正确绘制抛物线曲线

时间:2016-11-02 17:31:16

标签: python drawing turtle-graphics

我正在做一个像'愤怒的小鸟'的游戏。

有两个输入:功率和角度。 我将这些输入应用于抛物线曲线。

我的乌龟飞翔,形成一条抛物线。我的乌龟必须击中目标, 但是当角度大于46,角度为30,40等时,我的乌龟会画出奇怪的曲线......

我不知道问题出在哪里....这是我的代码:

import turtle
import random
import math

g=9.80665
origin_x=-480
origin_y=-180
flag=False


def create_target():

    x=random.randint(0,500)
    y=random.randint(-200,0)
    target=turtle.Turtle()
    target.hideturtle()
    target.penup()
    target.goto(x,y)
    target.shape('square')
    target.color('red')
    target.showturtle()
    return target

def create_turtle():

    homework=turtle.Turtle()
    homework.hideturtle()
    homework.penup()
    homework.speed(0)
    homework.goto(origin_x,origin_y)
    homework.pendown()
    homework.shape('turtle')
    homework.color('blue')
    homework.left(45)
    homework.showturtle()
    return homework

def setting():
    '''drawing back ground lines'''
    setting=turtle.Turtle()
    setting.hideturtle()
    setting.speed(0)
    turtle.colormode(255)
    setting.pencolor(214,214,214)

    for y in range(100,-101,-100):
        setting.penup()
        setting.goto(-500,y)
        setting.pendown()
        setting.goto(500,y)

    for x in range(-375,500,125):
        setting.penup()
        setting.goto(x,200)
        setting.pendown()
        setting.goto(x,-200)


def throw_turtle(turtle,target):
    angle=int(input("Enter Angle:"))
    power=int(input("Enter Power:"))
    '''
    parabola fomula:
        x coordinate: speed(in here, that is power) * cos(anlge)*time
        y coordinate: speed*sin(angle)*time - (gravity speed*time**2)/2
    '''
    for time in range(1,20):
        # the origin fomula is for the situation that starts from (0,0). so I think
        # I should  compensate it, but is it right?
        x=power*math.cos(angle)*time + origin_x
        y=power*math.sin(angle)*time - (((time**2)*g)/2) + origin_y
        if x<origin_x:  # I think it has problem...
            x-=origin_x

        turtle.goto(x,y)
        turtle.stamp()    #this is for testing
        if (x==target.xcor()) and (y==target.ycor()):
            print("******Target is HIT!!! ******")
            print("End of Game")
            flag=True
            break
    else:
        print("You missed...")


turtle.setup(1000,400)
windo=turtle.Screen()
windo.title('Angry Turtle')
setting()

#__main

my_turtle=create_turtle()
while flag==False:
    target=create_target()
    my_turtle=create_turtle()
    my_turtle.speed(6)

    throw_turtle(my_turtle,target)
    my_turtle.hideturtle()
    target.hideturtle()

我认为create_target()create_turtle()以及setting()没有问题......

2 个答案:

答案 0 :(得分:0)

下面,我将您的代码缩减为MVCE(最小,完整且可验证的示例),以检查抛物线曲线绘制代码。我发现的问题是 弧度 之间的差异。 Python数学库以弧度为单位,但为度数提供转换函数。默认情况下,Python turtle库会在degress中进行思考,但可以使用turtle.radians()切换到弧度。无论哪种方式都很好,但使用必须保持一致:

from turtle import Turtle, Screen
import math
import random

G = 9.80665
origin_x = -480
origin_y = -180

def create_turtle():

    homework = Turtle(shape='turtle')
    homework.hideturtle()
    homework.penup()
    homework.goto(origin_x, origin_y)
    homework.pendown()
    homework.speed(0)
    homework.left(45)
    homework.showturtle()

    return homework

def throw_turtle(turtle):

    angle = int(input("Enter Angle (in degrees): "))
    power = int(input("Enter Power: "))

    # parabola formula:
    #   x coordinate: speed(in here, that is power) * cos(angle)*time
    #   y coordinate: speed*sin(angle)*time - (gravity speed * time**2)/2

    for time in range(1, 20):

        x = power * math.cos(math.radians(angle)) * time + origin_x
        y = power * math.sin(math.radians(angle)) * time - (((time ** 2) * G) / 2) + origin_y

        turtle.goto(x, y)
        turtle.stamp()  # this is for testing


window = Screen()
window.setup(1000, 400)

for _ in range(3):
    my_turtle = create_turtle()

    my_turtle.color(random.choice(['red', 'green', 'blue', 'purple', 'black']))

    throw_turtle(my_turtle)

window.exitonclick()

示例

> python3 test.py
Enter Angle (in degrees): 30   
Enter Power: 120
Enter Angle (in degrees): 45
Enter Power: 90
Enter Angle (in degrees): 60
Enter Power: 90
> 

enter image description here

现在,你还希望它以抛物线方式做什么呢?

答案 1 :(得分:0)

哦,谢谢,非常感谢....... !!!! 但是,我还有一个问题。也就是说,&#39; if&#39; throw_turtle函数中的句子。 我打算使用那个&#39;如果&#39;句子用于检查并结束游戏。但事实上,用户无法准确纠正目标的坐标。所以结束游戏是不可能的。所以游戏无穷无尽......

要避免这种情况,我会像这样重写。

def throw_turtle(turtle,target):
    angle=int(input("Enter Angle:"))
    power=int(input("Enter Power:"))

    '''
    parabola fomula: x coordinate: speed(in here, that is power) * cos(anlge)*time
                              y coordinate: speed*sin(angle)*time - (gravity speed*time**2)/2'''
    for time in range(1,20):
        x=power*math.cos(math.radians(angle))*time + origin_x         #the origin fomula is for the situation that starts from (0,0). so i think i should  compensate it. but.. is it right?
        y=power*math.sin(math.radians(angle))*time - (((time**2)*g)/2) + origin_y     

        turtle.goto(x,y)
        turtle.stamp()    #this is for testing        min_target_x=target.xcor()-1

        max_target_x=target.xcor()+1     #the '1' means target's size
        min_target_y=target.ycor()-1 
        max_target_y=target.ycor()+1
        min_target_y=target.ycor()-1

        if ((turtle.xcor()>=min_target_x) or (turtle.xcor()<=max_target_x)) and ((turtle.ycor()>=min_target_y) or (turtle.ycor()<=max_target_y)):

            print("******Target is HIT!!! ******")
            print("End of Game")
            flag=True
            break
    else:     
        print("You missed...")