티스토리 뷰

Game with Python

테트리스 제작 - (5)

Conkara 2017. 6. 28. 03:20

네 다들 좋은 새벽입니다 필자는 새벽 세시에 잠이 안와서 이 글을 쓰고 있습니다.



자 테트리스 계속 제작을 진행 해 봅시다 아래의 함수는 새로운 블럭을 생성하는 함수입니다.









아주 간단합니다 그냥 superblock 에 block 객체를 새로 생성하고 자신의 block 에 블럭을 집어넣는 것 뿐입니다.



너무 간단한데.... 이렇게 하면 이전에 있던 블럭은 어떻게 될까요



더이상 연결된 곳이 없어서 참조 할 수 없으므로 파이썬에 있는  GC(Garbage Collector) 가 자원을 해제해줍니다. C/C++ 이였다면 


메모리를 해제해주는 코드가 있었어야겠지요 ㅎㅎ.... 이전 객체를 파기했어야했습니다. 동적으로 생성해서 지우고 새로운 객체를 할당 받는 식으로 짜야 겠지만, 파이썬이라서 (자바도 됩니다) GC 가 알아서 해줍니다.



정말 나중에 GC의 맹점과 파이썬 GC 도 사실 메모리가 새는 부분이 있는데 이런건 나아아아아아아아아중에 다루도록 하겠습니다... 리소스 딸려서 최적화 빡시게 해야하는 게임만들때... (그런 게임을 만들거면 우선 파이썬을 쓰지않으면 됩니다.)



이제 블럭을 실제 게임판에 고정하는 코드도 살펴볼까요?





간단합니다. 루프를 돌면서 0이 아닌 블럭부분만 게임판에 끼워줍니다.


그리고 나서 라인이 지워져야하는지를 체크해줍니다. CheckAndDeleteLine(i) 의 부분이 바로 그 함수라고 할 수 있는데요


매개변수 i 가 의미하는것은 i 라인을 지우라는 소리이고 아래쪽 라인부터 지워나갑니다. 왜냐하면 지우고 블럭을 끌어내려야하기 때문입니다. 지운 라인을 기억했다가 한번에 내리는것보다 이렇게 짜면 훨씬 깔끔하게 짤 수 있겠지요.


도전해보고 싶으시다면 윗쪽 줄부터 지우는 코드를 작성 해 보셔도 좋습니다. (권장하지는 않습니다.)


저 함수는 조금 있다가 살펴보겠습니다. 다만 저 함수에서 False 가 반환되야만 i를 한칸 올려서 지운다는것정도만 알아두시면 되겠습니다.

(이유가 있습니다)


그리고 새로운 블럭을 생성해주면 됩니다.



이 함수는 충돌하지 않을때만 실행됨이 보장됩니다. 모든 블럭의 이동시에는 항상 충돌 응답/처리가 따라가기 때문입니다. 


만일 충돌 응답/처리 코드가 부실하다면 실제로 있는 블럭부분이 덧씌워질 위험이 있습니다.




자 다음에 저 CheckAndDeleteLine 함수를 살펴봅시다





위 코드에서 사실 Line2 는 필요 없습니다 전부 Line 으로 처리하셔도 됩니다. 


다만 필자가 이 코드를 쓸때는 파이썬은 전부 얕은 복사로 주고 받는 것으로 착각하여 Line2를 생성해서 처리 했었습니다.


여기서 Line은 정수형인데 정수형으로 넘겨진 매개변수는 변경이 불가능하기때문에 Line-=1 을 처리하기 위해서는 새로운 Line 을 할당해야 했기 때문이고, 즉 외부와는 아무 상관 없었다는 뜻입니다.


괜히 메모리 더 쓰는 코드입니다 별 의미는 없어요.



함수에 대한 설명을 계속하자면 


라인을 검출해서 단 하나라도 0 (공백) 이 있다면 False 를 반환합니다.


그리고 라인이 지워진 적이 있으면 True 를 반환합니다.


라인을 지운다는것은 무엇을 의미할까요?


바로 위쪽 라인을 바로 내리는 것을 의미합니다



그래서 바로 위쪽 라인을 아래쪽으로 내리고 나면 한줄 짜리 블럭이 바로 사라지게 되는 것이지요. 별로 어렵지는 않습니다. 조금만 생각해보시면 바로 이해하실 수 있을거에요



그럼 마지막 줄은 어떻게 하느냐??


테트리스 게임 룰을 조금만 생각해보면 됩니다


마지막 줄에 블럭이 들어와서 Fix 되는 순간 GameOver 입니다 그 줄에 블럭이 쌓이고 나서 블럭이 지워지는 일이라는것은 존재하지 않아요



그래서 저 코드를 써도 논리적으로는 에러가 존재하지 않게 됩니다



그리고 만일 true 를 반환하게 되었으면 그 라인을 한번 더 검사합니다


왜냐하면 두줄 혹은 그 이상이 한번에 없어지게 되었을때


한줄을 없애고 나서 내린 후 검사할 줄을 올리게 되면


가득찬 한 줄을 없애지 못하게 됩니다. 이것도 차분히 생각해보세요. 그래서 한줄을 없애고 나면 다시 검사한 줄을 검사해 주어야합니다.






게임오버 함수인데 너무 간단합니다. 첫줄에 블럭이 하나라도 있으면 False 없으면 True 입니다.






이제 객체를 생성해서 게임 구동만 구현하면 끝입니다. 얼마 안남았습니다. 다음시간에 게임을 완성해보도록 합시다.

'Game with Python' 카테고리의 다른 글

테트리스 제작 - (7)  (0) 2017.07.07
테트리스 제작 - (6)  (0) 2017.07.01
테트리스 제작 - (4)  (0) 2017.06.27
테트리스 제작 - (3)  (0) 2017.06.26
테트리스 제작 - (2)  (0) 2017.06.26
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함