파이썬 터틀 충돌 판정을 어떻게 하나요?
조회수 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
를 소거하면 꽤 간단하게 나오고요.
댓글 입력