2016-11-02 15 views
0

私は '怒っている鳥'のようなゲームを作っています。タートルグラフィックスで放物線を正しく描けない

電源と角度の2つの入力があります。 これらの入力を放物線に適用します。

私のカメは飛んで、放物線を描いています。私のカメは目標を打つ必要があります 角度が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() 

私は以下

答えて

0

... create_target()create_turtle()、およびsetting()が問題を持っていないと思いますが、私は検討するMVCE(最小限の完全、かつ検証例)にあなたのコードを減らします放物線の描画コード。私はそれで見つかった問題は、ラジアンの差の通常のものです。 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

ああありがとう本当にありがとう....... !!!! しかし、もう一つ問題があります。つまり、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...") 
+0

あなたのmax_ *&min_ *ロジックが乱雑です。まず、割り当てにコピー&ペーストエラーがあります。 2番目の目標はあまりにもタイトなターゲットを使用しています - 最大位置を基点にしないで、位置と幅と高さに基づいて基点を設定します。必要に応じてターゲットを大きくするためにいくつか追加します。最後に、if(()または())と(()または()))のロジックが間違っているように見えるかもしれません。if((()and())and()and())) – cdlane

+0

ああありがとう!私はそれを解決することができると思う...!私はあなたを祝福...♥^ _ ^ – user6442076