파이썬 터틀 충돌 판정을 어떻게 하나요?

조회수 2320회

이미지

이 4가지 조건에 따라서 앵그리 버드 파이썬을 구현하는 것이 제 과제 입니다. 그래서 제가 파이썬으로 구현을 시도 해봤습니다. 그런데 막상 해보니 조건 4번을 구현을 못하겠습니다. 저는 분명히 거북이가 이동할 때 x,y값을 주어진 범위 안에 비교해서 범위 안이면 종료하고 아니면 다시 발사하기 위해 코드를 짜봤는데 제대로 구현이 안되더라구요...

import turtle as t
import math
import random

def square(): //사각형을 그리는 함수
    for i in range(4):
        t.forward(10)
        t.left(90)


t.forward(500) //땅바닥그리기
t.goto(0,0)

d1 = random.randint(100,200) //100에서 200사이의 값 중 랜덤으로 고르기 조건 1구현

t.up()
t.forward(d1)
t.down()
square() // 사각형을 그려서 목표물을 생성

t.up()
t.home()
t.down()

def fire(): //발사함수를 생성
    x=0
    y=0
    gameover = False

    speed = int(input("속도:")) // 조건2번 구현
    angle = int(input("각도:")) // 조건 2번 구현

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

    while gameover == False and t.ycor()>=0: //조건 3번을 구현하기 위해 gameover가 False이고 t의 y값이 음수가 아닐 때만 반복
        vx = vx
        vy = vy - 10
        x = x + vx
        y = y + vy
        t.goto(x,y) // 조건3번 사각형 방향으로 포탄 발사
        x_pos = t.xcor()
        y_pos = t.ycor()
        if d1<=x_pos<=d1+10 or 0 <= y_pos <= 10: // 만약 x값과 y값이 //조건 4번을 구현하려고했음.
            gameover = True
            break

    if gameover == True: 
        exit()
    else:
        t.up()
        t.home()
        t.down()
        fire()
fire()

문제가 되는 4번 조건을 구현하려고 작성한 코드가 아래 부분입니다.

while gameover == False and t.ycor()>=0: /
        vx = vx
        vy = vy - 10
        x = x + vx
        y = y + vy
        t.goto(x,y)         //문제가 되는 조건 4번 구현 코드입니다.
        x_pos = t.xcor()  // 거북이를 이동시키고 난 후 x값을 반환 해 x_pos에 저장하고
        y_pos = t.ycor() // 똑같이 y값도 x_pos에 저장한 뒤
        if d1<=x_pos<=d1+10 and 0 <= y_pos <= 10:  //만약 x와 y의 값이 이 범위 안에 맞으면
            gameover = True    //gameover변수에 True값을 할당하고
            break    //반복문을 종료한 뒤

    if gameover == True:     //만약 gameover변수가 True라면
        exit()    //프로그램을 종료
    else:    //아니라면
        t.up()
        t.home() //다시 원점으로 돌아가서
        t.down()
        fire()    //다시 발사

이렇게 생각을 하고 작성했는데도 거북이가 저 범위 안에 들어도 프로그램 종료가 안됐습니다... 제가 작성한 코드가 어떤 부분이 문제가 되는지 알려주시면 감사하겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 지난번 질문에서와 문제 동일합니다.

    
                                                            o x+vx, y+vy
                           _________________________
                           |                       |
                           |                       |
                           |                       |
            o              | ______________________|
        x, y 
    

    이렇게 되었다고 하면, (x,y) 점과 (x+vx, y+vy) 를 연결하는 선은 사각형은 분명 사각형 영역을 지나지만, 질문자분의 조건은 이 두 점에 대해서만 사각형 안에 있는지 검사하기 때문에, 충돌하지 않았다고 나오는거죠.

    두 점을 지나는 직선의 방정식을 구하고, 직선이 사각형영역을 지나는지를 확인하면 되요. 열심히 중고등학교 수학실력 발휘하면 됩니다. 그런데, 잘 생각해 보면 x 가 d1<= x <=d1+10 인 영역에 들어올 때만 검사하면 되고, 등등 조건을 생각하면 의외로 간단한 조건을 찾을 수도 있어요.


    조금 더 간단할 지도 모르는 것은, 포물선을 직선을 연결해서 그리지 말고, 포물선의 방정식 구해서 ( y = ax^2 + b ), d1<= x <=d1+10 영역에서 타겟사각형 영역에 들어오는지 확인해 보는 방법입니다. 포물선 방정식은 첨부한 이미지 중에 분홍색 수식에서 t를 소거하면 꽤 간단하게 나오고요.

    • 직선의 방적식을 구하고 사각형 영역을 지나는 것을 어떻게 구현해야할 지 감이 안잡힙니다. 알 수 없는 사용자 2020.5.10 19:51

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)