racket 이라는 언어로 big-bang 이라는 라이브러리 써서 만들었음
lisp 문법이 처음보면 족같은거 아니까 로직위주로 들어보셈
일단 간단하게 문법은 (1 + 1) 이 (+ 1 1) 로 쓰고 f(x) 가 아니라 (f x) 라고 생각하면 됌
먼저 메인 함수를 보여주자면
fresh-block 은 초기화 함수
on-tick 에 매 틱마다 실행되는 함수를 할당하고
on-key 에 키 이벤트 발생 함수
to-draw 에 화면에 그리는 함수를 할당해줌
이제 처음으로 돌아와서
x y 좌표를 갖는 posn struct를 정의해줌
그리고 블록은 원점을 기준으로 한칸씩 확장시킨 값을 각각 posn value를 선언해주면
우리가 원하는 블록을 만들 수 있음
블록이 이런 구조를 갖는다면 회전할때 각각의 값들에
(x,y) =회전=> (-y,x) 공식을 적용시키면 됌
게임의 전체를 표현하기 위해 구조체를 2개 더 만들어보자
먼저 pit 구조체는 위에 정의한 block value와 posn을 포함하는데 여기서 posn이 계속 움직이고
그릴때나 충돌 검사를 할때만 block 의 값들과 합쳐서 실체화를 할거야
그리고 world는 게임을 위한 정보가 모두 담겨있는 구조체이고 pit 가 포함되며
board 는 바닥에 닿으면 블록이 쌓이잖아 그걸 관리하는 리스트야
이제 충돌에 대해서 정의해보자
이건 별거 없어 그냥 이름 그대로 block 들의 좌표값 받아와서 충돌하는지 확인하는거야
주의할 점은 tick 함수와 key 함수에서 분기를 담당하지만 결과는 다르다는거야
이제 tick 함수를 정의하자
define 안에 있는 define 은 로컬 변수인데 여기서 movement 라는 변수는 미리 블록을 움직여보는거야
이제 이 movement 가 충돌을 안 했으면 움직인 값을 리턴하고 충돌했으면 새로운 블록을 만들고 board 에 움직이기 전 값을 넣어줘야 해
그리고 board 는 한줄이 꽉차면 없어져야 하니까 satisfy 라는 함수로 한번 검사를 돌려줘
이 함수는 설명하기 복잡해서 단순하게 y좌표를 기준으로 쭉 뽑아서 맵 가로 크기보다 넓으면 삭제시키는거야
이제 key 이벤트 함수를 만들어보자 여기는 메인 로직하나만 설명할게 다 설명하려면 문법 설명해야 할 것 같아서;
tick 함수와 비슷하게 movement 변수로 먼저 움직이는데 이 때 키에 따라 로직이 다르겠지? 나는 up 키를 회전으로 해놨음
그리고 벽과 보드에 충돌했으면 움직이기 전 값을 리턴하고 충돌안했으면 움직인 값을 리턴해주면 됌
render 함수는 그냥 좌표값에 따라서 그리는 거니까 생략할게
일단 개추