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

Can't draw parabolic curve correctly with turtle graphics

我正在制作类似 'angry bird' 的游戏。

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

我的乌龟飞了起来,画了一条抛物线。我的乌龟必须击中目标, 但是当角度大于 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()没有问题...

下面,我将您的代码简化为一个 MVCE(最小、完整且可验证的示例)来检查抛物线绘制代码。我发现的问题是 degreesradians[=27 之间的常见区别之一=]。 Python 数学库以弧度为单位,但提供了度数转换函数。 Python turtle 库默认以递减方式思考,但可以使用 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
> 

现在,您还希望它以抛物线方式执行哪些操作?

哦谢谢谢谢真的谢谢.......!!!! 但是,我还有一个问题。即throw_turtle函数中的'if'句。 我使用 'if' 句子的目的是检查并结束游戏。但实际上,用户并不能准确地修正目标坐标。所以结束比赛是不可能的。所以游戏是无止境的....

为了避免这种情况,我重新写成这样。

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...")