2016-11-02 10 views
0

Я делаю игру как «сердитая птица».Невозможно правильно рисовать параболическую кривую с черепаховой графикой

Есть два входа: мощность и угол. Я применяю эти входы к параболической кривой.

Моя черепаха летит, делая параболическую кривую. и моя черепаха должна ударить по цели, , но моя черепаха рисует странную кривую, когда угол больше 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() не проблема ...

ответ

0

Ниже я уменьшаю свой код на MVCE (минимальный, полный и проверяемый пример) для изучения код рисования параболической кривой. Проблема, которую я нашел с ней, является обычной с разницей между градусов и radians. Математическая библиотека Python думает в радианах, но обеспечивает функцию преобразования для степеней. Библиотека Python черепахи думает в 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

Теперь, что еще вы хотите, чтобы это сделать параболическую кривую премудрого?

+0

О, спасибо, спасибо, спасибо ....... !!!! но, у меня есть еще одна проблема. то есть – user6442076

+0

умм .... я упоминаю это ниже !!!! пожалуйста, помогите мне еще раз .... !!! – user6442076

0

О, спасибо, спасибо, спасибо ....... !!!! но, у меня есть еще одна проблема. то есть предложение «if» в функции throw_turtle. мое намерение использовать это предложение «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...") 
+0

Ваша логика max_ * & min_ * испорчена. Сначала у вас есть ошибка copy-n-paste в назначениях. Во-вторых, вы используете слишком тугую цель - не устанавливайте максимальную позицию только в позиции, оставьте ее в позиции плюс ширина и высота. А затем добавьте некоторые, чтобы при необходимости увеличить цель. Наконец, ваши логики if (() или()) и (() или())) кажутся неправильными и могут хотеть быть, если ((() и()) и() и())). – cdlane

+0

oh Спасибо! я думаю, я могу решить это ... !! я благословляю тебя ... ♥^_ ^ – user6442076