[英]How can I draw in Turtle given speed and angle value?
我看到你的代碼有幾個問題。 首先,您是否正在使用帶有 tkinter 的獨立海龜。 當你在 tkinter 程序中嵌入 turtle 時,你需要使用嵌入的 turtle,即RawTurtle
代替Turtle
, TurtleScreen
代替Screen
等。否則,你有兩個根,會出現奇怪的問題。
其次,您需要某種彈道邏輯,僅計算角度是不夠的。 此外,您必須清楚哪些角度是度數(例如,可能是用戶輸入;默認情況下烏龜想要什么)與弧度( math.py庫想要什么。)
最后,在 tkinter 接口和海龜 output 之間傳遞值的一種方法是使用與Entry
小部件關聯的IntVar
值。 這是我對解決上述問題的代碼的(可能是錯誤的)返工:
from tkinter import *
from turtle import TurtleScreen, RawTurtle
from random import randint
from math import sin, cos, radians
x0, y0 = -200, 10 # initial location
g = 11.0 # acceleration due to gravity in units per second squared
def fire():
a = angle.get()
turtle.setheading(a)
v = velocity.get()
vx, vy = cos(radians(a)) * v, sin(radians(a)) * v # initial velocity in units per second
for t in range(1, 10_000):
x = x0 + vx * t
y = y0 + vy * t - g / 2 * t**2
turtle.goto(x, y)
if y < y0:
break
distance = turtle.distance(target, y0)
if distance < 25:
turtle.color('blue')
turtle.write("HIT", align='center', font=('', 10))
else:
turtle.color('red')
turtle.write("MISS", align='center', font=('', 10))
turtle.color('black')
turtle.goto(x0, y0)
turtle.setheading(0)
window = Tk()
window.geometry("+250+150")
window.title("Ballistics")
canvas = Canvas(window, width=600, height=300)
canvas.pack() # fill="both", expand=True)
screen = TurtleScreen(canvas)
turtle = RawTurtle(screen)
turtle.penup()
turtle.setx(-300)
turtle.pendown()
turtle.setx(300)
target = randint(50, 150)
turtle.pensize(3)
turtle.color('green')
turtle.penup()
turtle.goto(target - 25, 2)
turtle.pendown()
turtle.goto(target + 25, 2)
turtle.color('black')
turtle.pensize(2)
turtle.penup()
turtle.goto(x0, y0)
menu = Toplevel(window)
menu.geometry("200x150")
menu.title("Menu")
velocity = IntVar()
Label(menu, text="Velocity").pack()
Entry(menu, textvariable=velocity).pack()
angle = IntVar()
Label(menu, text="Angle").pack()
Entry(menu, textvariable=angle).pack()
Button(menu, text="Fire", command=fire).pack()
window.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.