Как я могу сделать код, который оценивает столкновение черепахи и прямоугольника - PullRequest
0 голосов
/ 09 мая 2020

В моей задаче требование: 1. Нарисуйте случайный квадрат от 100 до 200. 2. Ширина и высота квадрата должны быть 10. 3. Добраться до пользователя, вводящего скорость запуска и угол запуска. 4. Стреляйте снарядом из начала координат в квадрат. но оболочка должна рисовать параболу. 5. Если снаряд попал в квадрат, завершите программу, иначе вернитесь к номеру 3.

, но проблема в номере 5. Я пытаюсь воплотить номер 5, но это не сработало. пожалуйста, посмотрите мой код.

import turtle as t
import math
import random
import sys

def square():  //function that make the square
    for i in range(4):
        t.forward(10)
        t.left(90)

t.forward(500)
t.goto(0,0)

d1 = random.randint(100,200) //choose the random distance between 100 to 200

t.up()
t.forward(d1)
t.down()
square() //satisfy condition 1

t.up()
t.goto(0,0)
t.down()


def fire(): //function that fire a shell to a square direction.
    x = 0
    y = 0
    gameover = False

    speed = int(input("speed:")) //satisfy condition 3
    angle = int(input("angle:")) //satisfy condition 3

    vx = speed * math.cos(angle * 3.14/180.0)
    vy = speed * math.sin(angle * 3.14/180.0)

    while t.ycor()>=0: // until y becomes negative. and satisfy condition 4
        vx = vx
        vy = vy - 10
        x = x + vx
        y = y + vy
        t.goto(x,y)
        x_pos = t.xcor() // save x-coordinate to x_pos
        y_pos = t.ycor() // save y-coordinate to y_pos
        if d1<=x_pos<=d1+10 and 0 <= y_pos <= 10: // if x_pos and y_pos are within range, save gameover to True and break
            gameover = True
            break

    if gameover == True: // trying to satisfy number 5
        exit()
    else:    // if a shell not hit a square repeat the fire.
        t.up()
        t.home()
        t.down()
        fire()


fire()

скажите, пожалуйста, как я могу воплотить число 5 или скажите, что я сделал не так.

1 Ответ

0 голосов
/ 10 мая 2020

Вместо того, чтобы fire() вызывать его саморекурсивно при последующих попытках, вам было бы лучше с while not gameover: l oop в fire() и соответствующим образом скорректировать остальную часть кода. В моем переписывании вашего кода ниже я использую такой al oop, и я также использую собственную функцию turtle graphi c numinput() вместо консоли:

from turtle import Screen, Turtle
from math import radians, sin, cos
from random import randint

def square(t):
    ''' function that make the square '''

    for _ in range(4):
        t.forward(10)
        t.left(90)

def fire(t):
    ''' function that fire a shell to a square direction '''

    gameover = False

    speed = None
    angle = None

    while not gameover:
        t.up()
        t.home()
        t.down()

        speed = screen.numinput("Angry Turtle", "Speed:", default=speed, minval=1, maxval=1000)  # satisfy condition 3
        if speed is None:
            continue

        angle = screen.numinput("Angry Turtle", "Angle (in degrees):", default=angle, minval=1, maxval=89)  # satisfy condition 3
        if angle is None:
            continue

        vx = speed * cos(radians(angle))
        vy = speed * sin(radians(angle))

        x = 0
        y = 0

        while t.ycor() >= 0:  # until y becomes negative; satisfy condition 4
            vy -= 10
            x += vx
            y += vy
            t.goto(x, y)

            x_pos, y_pos = t.position()

            # if x_pos and y_pos are within range, set gameover to True and break loop
            if d1 <= x_pos <= d1 + 10 and 0 <= y_pos <= 10:
                gameover = True
                break

screen = Screen()
screen.title("Angry Turtle")

turtle = Turtle()
turtle.shape("turtle")
turtle.forward(screen.window_width() // 2)
turtle.home()

d1 = randint(100, 200)  # choose the random distance between 100 to 200

turtle.up()
turtle.forward(d1)
turtle.down()

square(turtle)  # satisfy condition 1

fire(turtle)

Однако приведенный выше дизайн улавливает пользователь в сценарии «выиграйте игру, если хотите выйти», и вы можете дать ему лучший способ выйти из программы.

...