별로 대단한 건 아니고 짤만 봐도 대충 짐작이 가겠지만 그냥 보드게임임. c++로 만든거고 현재 여기에 올라가 있음.


https://github.com/attltb/NimTetris


해보려면 그냥 릴리즈 다운받아서 해보면 된다. 문제는 윈도우밖에 지원안함.

나중엔 달라질수도 있는데 지금은 내가 GUI를 윈도우밖에 다룰 줄 몰라서 어쩔 수 없음.



간단히 설명하자면 그냥 두 플레이어가 번갈아가면서 10x10사이즈의 보드에다가 테트리스 블록을 하나씩 놓는 게임임.

더 이상 블록 놓을 자리가 없으면 게임이 끝나고 이 때 마지막 블록을 놓은 사람이 지는거.


왜 마지막 블록을 놓은 사람이 지는 거로 했냐면 여기에는 스프라그-그런디 정리(Sprague-Grundy Theorem)라는 심오한 이유가 있다.


https://en.wikipedia.org/wiki/Sprague–Grundy_theorem


대충 요약하자면 플레이어가 승리조건을 공유하는 이런 류의 2인 게임은

마지막에 플레이한 사람이 이기면 다 간단한 한 줄짜리 Nim(https://en.wikipedia.org/wiki/Nim) 게임으로 환원시킬 수 있다는 정리다.


이 경우 게임이 너무 간단해지기 때문에 대부분 이런 류의 게임은 마지막에 플레이한 사람이 지는 룰로 정하는 게 거의 국룰이라고 보면 됨.

원본인 Nim도 그래서 마지막에 플레이한 사람이 지는 룰이 표준.




하여튼 컨셉이 특이할 뿐이지 딱히 만들기 힘들 이유도 없고 포트폴리오가 될지 말지도 애매한 물건인데

그래도 이게 나한테는 프로그래밍을 시작하게 한 직접적인 계기였음.

내가 이 게임을 생각해낸게 고딩때인데 사실상 이거 만들어보려고 독학으로 코딩 배운거나 다름없거든.


신기한건 그 당시 나는 스프라그-그런디고 나발이고 아무것도 모르는 상태였는데

왠지 마지막에 플레이한 사람이 이기게 하면 게임이 너무 단순해질 것 같아서 룰을 지금처럼 정함. 뭐 이런건 몇 판만 스스로 해보면 감이 오니까.



이 게임이 생각보다 깊이가 있다.

바둑에서 축장문 모르는 사람이 이길 수가 없듯이 이 게임도 나름의 전술이 있어서 그걸 모르는 사람이 거의 이길 수가 없는 구조임.


https://github.com/attltb/NimTetris/blob/main/Strategy.kor.md


이거 읽어보면 생각보다 신박하고 재미진 게임이라는 걸 알 수 있을 거다.

혼자만 승리공식 알 때 모르는 사람 능욕하는 재미가 꽤나 쏠쏠하며 만약 둘 다 승리공식을 알게 되면 그때부터는 아주 치열한 능지게임이 됨.




그러나 이 게임의 최대 포인트는 바로 내장된 AI라고 할 수 있겠다.


https://github.com/attltb/NimTetris/blob/main/AI.kor.md


마지막에 플레이한 사람이 이기는 룰이면 그냥 스프라그-그런디 정리 쓰면 되지만 이 게임은 그렇지 않기 때문에 다른 방법이 필요한데,

여기서는 최적화 정보 집합이라는 걸 이용해서 구현함.

그냥 내가 만든 단어고 뭘 어떻게 했는지는 들어가 보면 알거.


성능이 엄청나서 굳이 AI 레벨을 최고난이도까지 안올리고 Lv 5정도까지만 올려도 내가 쉽게 이기지 못할 정도의 실력을 보여줌.

사실 이 게임에서 다른 부분이야 아무나 만들 수 있는 거고 이 AI 구현한게 자랑.



내가 논문쓴 알고리즘도 이 게임의 AI 최적화하던 중 생각해낸 거였고 해서 여러모로 내 입장에서는 애착이 가는 프로젝트일 수밖에 없는데,

하도 오래 전에 시작한거다 보니 코드보여주기 쪽팔려서 지금까지 깃헙에 못 올렸다는 슬픈 사연이 있다.

최대한 리팩토링해서 지금 올리는 거.


물론 지금 코드도 조잡하긴 한데 그건 그냥 내가 좆밥이라 그렇다고 보고 넘겨라.




그리고 이걸 공개하지 못했던 가장 큰 이유중 하나인 조잡하기 짝이 없는 디자인도 산뜻한 투명룩으로 바꿈.

블록들 전부 내가 디자인한 거고 어디서 가져온거 아님.

역대 테트리스류 게임에 나오는 블록치고 내꺼만큼 이쁜거 아직 못봤다. 디자인 센스 ㅇㅈ?



하여간 열심히 만들었고 특히 디자인 저거는 거의 내가 2달이 넘는 시간을 꼬라박고 나온 결과물임. 들어와서 별좀 많이 눌러줬으면 함.


https://github.com/attltb/NimTetris


ㅎㅎ