티스토리 뷰

Game with Python

16퍼즐 제작 - (9)

Conkara 2017. 6. 18. 23:31

드디어 16퍼즐 제작 마지막 글을 씁니다.


사실 다 만든건 2주가 넘었는데 제가 뭘 고쳤는지 기억이 안나서... 더듬으면서 쓰다보니 엉망이 되었네요.



오늘 적는 내용은 순도 300000% 필자 본인의 개인적인 생각이고 저보다 훨씬 더 잘 아시고 잘 하시는 분들 많아서...




우선 16퍼즐은 언제 맞춰지지 않는 모양이 될까요...?


일전에 이걸 해결하기 위해 방법이 두가지가 떠오른다고 했었던거 같은데


무작위로 생성 vs 이동 방향을 랜덤으로 설정하고 아주 많이 실행 후 게임 시작


뭐든 좋습니다. 다만 저는 무작위로 생성했고 그럼 그게 풀리지 않는 퍼즐 형태인 경우 새로 생성해주면 그만입니다.




지금은 수학시간이 아니니 코드로 옮길 지식만 얻도록 하겠습니다.


http://semi.math1.org/monthly/2003/04/15puzzle.pdf



이 링크를 타고 들어가셔서 한번 읽어 보시면 됩니다.

 (사실 한번 읽어서는 코드로 옮길만큼 이해가 안될겁니다. 저는 그랬어요 사실 필자가 바보인거)



요지는 거꾸로 된것들과 공백까지 고려해서 나오는 결과의 숫자가 짝수이면 항상 해결 가능한 퍼즐이라는 것입니다.



이것을 코드로 옮겨보았습니다.






날림으로 만들어서 대충 만들었습니다.... 어쨋든 논문(?) 의 내용을 그대로 코드로 옮겨서 항상 풀어지는 판을 만들게 되었습니다.


원리는 풀수 없는 판이 나오면 새로 만들어라... 라는 의미입니다.





다음에는 클리어시 승리 이미지가 뜨게 하고싶습니다.


예를들어서....






이런식으로 클리어 했음을 나타내주는 것은 어떨까요??? cong!!!는 congraturation! 을 쓰고싶었지만 필자가 그림을 너무 못그려서 그냥 저걸로 때웠습니다.



자 중요하지 않은것은 넘어가고 저걸 어떻게 구현했을까요...?



두가지를 고려해야 이 문제를 해결할 수 있습니다.



하나는 이미 그려져있는 판위에 그림만 새로 그리는 방법과, 게임 루프를 어떻게 구성해야 할 것인가... 인데요



사실 클래스로 깔끔하게 다 짜두었으면 아무 문제 없습니다만... 저는 삽질하는걸 보여드리고 싶었습니다!!!

(거짓말 그냥 필자가 못하는겁니다)


흠흠... 어쨋든 코드를 보면서 설명을 하겠습니다.






우선 전체를 큰 while 루프로 감싸고 게임이 끝나지 않은 동안에는 첫번째 while 루프가 계속 작동합니다.


클리어가 되는 순간 첫번째 루프는 더이상 작동하지 않고 두번째 루프로 이동해서 계속해서 상태를 묻게 됩니다.


(나중에 이부분은 다형성으로 깔끔하게 구현할 수 있습니다) 왜 깔끔하게 구현하지 않은거지 핫산?



두번째 루프의 내용은 깔끔함 그 자체입니다. 초당 5프레임만큼 화면을 갱신하고, 미리 있던 이미지만 위에 화면을 계속 출력해줍니다. 이것만으로도 cong!!! 이미지가 출력이 된다는 소리입니다... 다음 quit 반응이 들어오면 게임을 종료.왼쪽버튼을 누르면 다시시작

오른쪽 버튼을 눌러도 quit 입니다.


어째서 화면에 출력만 했는데 이미 덮어써져버린걸까요?



답은 DOUBLEBUFFER 에 있습니다. 게임 내 로직을 보면 화면을 실시간으로 그릴때 지우고 그렸죠? 이게 pygame.display.flip() 을 해주지 않는다면 뒤에 다른 화면에 그린걸 앞의 화면으로 옮기지 않습니다. 이러한 기술을 더블 버퍼라고 합니다. 미리 그려놓고 옮기는 과정을 하는거죠



이미 그린걸 가져다 붙이는데는 아주 짧은 시간이 필요하지만 컴퓨터 입장에서도 새로 그리려면 시간이 필요하답니다 그래서 더블버퍼를 쓰지않는다면 그림이 깨지거나 찢어져 보일 수 있어요. 요즘 용량이 큰 게임같은경우는 배경 이미지는 미리 그리고 더블 버퍼를 써서


총 트리플 버퍼로 게임을 제작한다고 하더라구요. 저와는 상관 없는 이야기니 넘어가겠습니다.



어쨋든 흰바탕으로 지우지 않는다면 위에 덧대서 갱신하는것만으로도 그려지겠죠? 아주 간단합니다.


screen.blit(conf,(100,100)) 으로  버퍼에 미리 그려놓고 위에 덧댄다. 아주 간단합니다.





마지막으로 이 게임이 더 나아갈 방향이 있을까요?


필자 생각에는 몇가지가 떠오릅니다




코드를 많이 수정해줘야하긴 하겠지만 유저에게 초급 중급 고급 으로 3 *3 4*4 5*5 6*6 등의 퍼즐을 제공 할 수 있다면 참 좋을것 같습니다.


또한 최소 이동수를 기록하는것도 좋은 방법일 수 있지요.


클리어 하는데 걸리는 시간을 측정해서 랭킹을 매기거나 성공 실패를 매길 수도 있고



조작감에관해서는 두블럭 혹은 세개의 블럭을 동시에 밀 수 있으면 더 좋을것 같습니다.



물론 필자는 위에 말한 부분을 구현할 생각은 전혀 없습니다. 구현은 여러분의 몫이고 저는 다른 게임을 만드는것으로 뵙도록 하겠습니다.




16퍼즐 제작 읽어주신 여러분들 모두 감사합니다. 더 좋은 코드와 더 좋은 설명 으로 다음 게임인 테트리스에서 뵙도록 하겠습니다.



봐주시는 분들도 몇분 없지만 2017/6/18일 기점으로 일주일정도 뒤에 뵙겠습니다. 필자도 일하고 있는 처지라 마구 만들지 못해서 조금씩 만들어요 ㅠㅠ 테트리스 잘 기억도 안나고... 룰북도 찾아봐야해서... (사실 제가 코딩을 잘 못해서) 





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

테트리스 제작 - (2)  (0) 2017.06.26
테트리스 제작 - (1)  (0) 2017.06.26
16퍼즐 제작 - (8)  (0) 2017.06.16
16퍼즐 제작 - (7)  (0) 2017.06.16
pygame에 대해서 간단히 알아봅시다. -(2)  (0) 2017.06.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함