일단제가짯던 테트리스 소스
요약해드리면
1 ▣ (낙하 완료되지않은 블록)
0 ' '(공백)
-2 ■ (블록 낙하 완료후)
-1 ▩ (테두리벽)
<왼쪽의 숫자는 대응대는 값>
이런식으로 배열에 숫자를 넣어서 해당되는숫자에 맞게 프린트 함수가 맵전체를 다시출력해주는 구조거든요
낙하 완료된 블록은 -1에서 -2로 넘어가고
블록이 ▣▣▣▣ 였다면
낙하완료후에 값이 -2로 바뀌면서 화면 재출력에 의해 ■■■■ 로 바뀜
즉 벽이나 장애물은 각각 -1과 -2로 좌표 입력돼있고
회전 충돌여부는 원래 1이였던(낙하완료되지않은 블록) 블록이 회전후에 음수가 되는 블록이 하나라도 있으면 회전이안되는방식인데
(예를들어
▣
▣▣▣ 상태라면 1이였던 블록 (배열상 좌표 [1],[2])의 블록이 회전후에는 좌표 [2][1] 의 벽과 만나게 되므로 회전이안되는 방식으로 짰거든요
▩▩▩
이게 님이 말한 버그랑상관이 있는건가요? (블록 낙하 후처리문제)
그리고 바닥에 닿기직전에 회전시키면 바닥까지 같이회전되는게아니구 바닥에 파묻혀버림;;
지금 발생하는 버그 이야기라면 그건 한 줄만 고치면 되는 간단한 문제임.
아 그럼? ㄷㄷ 직접 프로그램을 돌려본 게 아니라서 회전 버그가 있다는 정도만 파악했었음.
구조 자체를 내가 말한 구조로 뜯어 고쳐야지 가능할 듯. 그게 제일 완벽하고 깔끔한 방법이에요.
님 얘기 들어보니 제가 말한 버그랑은 또 다른 버그인 거 같은데... 버그가 한 둘이 아닌 거 같은데 내려놓지 않은 블록은 위치와 상태 정보만 가지고 있고 맵에 반영하지는 않는 구조로 바꿔보시길. 그러면 90%의 버그는 해결돼요.
근데 제가짠소스는 내려놓지않은 블록 값 =1 , 내려놓은 블록 값=-2 이렇게 양수와 음수로 확실히 구분하기때문에 님이말한문제가 아닐수도있을거같아서 여쭤본거임
아 모르겟다 지금 졸려서 헛소리하는걸수도 내일해결해보고 다시올게여 잇으시다면
일단 님 코드의 문제는 블록 사이즈를 3x3으로 놓고 처리한다는 거임.
회전을 할 때 3x3 영역을 지우고 회전한 걸 다시 써주는데 이 영역에 다른 블럭이 있다면 그 블럭은 지워지겠죠.
3x3 영역을 다 지우는 게 아니라 3x3 영역 중에서 내려놓지 않은 블록 값(1)만 0으로 고쳐줘야 하는데
그 체크가 전혀 없더군요. 물론 이건 제가 발견했던 버그고. 님이 발견한 버그는 또 다른 거 같아 보이는데,
프로그램 구조를 아예 싹 바꾸는 게 제일 깔끔한 해결책이에요. 버그 발견되는 대로 고치면서 땜빵하는 식으로 가면 무슨 버그가 또 있을지 어떻게 암.
지우는건 0보다 크거나 같은 블럭만 지우게 처리했기때문에 문제가없을텐데요..아마도
블럭 지울때 마이너스애들은 안지우게했어요
음... 음수가 벽이나 이미 놓아진 블록으로 구분이 된다고 하면 큰 문제는 없겠네요. 그거 구분 안한 줄 알고 버그 있는 줄 알았음. 코드 다시 자세히 읽어보니 0 이상인지 체크 하네요. 근데 저게 무슨 의미인지 몰라서 버그 있는 줄 ㅋㅋ 하지만 실제로 다른 버그가 있었으니... 버그 없는 테트리스 짜기가 좀 성가셔요 은근히...
하지만 버그를 싹 뿌리 뽑으려면 근본적으로 제가 말한 구조로 뜯어 고치시는 걸 추천. 지금 님이 발견한 버그를 고친다고 해도 또 무슨 버그가 있을지 아무도 모름.