프로젝트 사면초가
드디어 저의 사면초가 프로젝트가 완성되었습니다.
군복무 시절, 일이 없어 잔류로 남아있는 일과 시간에는 시간이 잘 가지 않고 심심하기도 해서 보드게임을 즐기곤 했습니다. 각종 보드 게임, 체스, 오목, 장기 등 여러 게임들을 했는데, 저는 그 중 장기가 가장 재미있었습니다.
체스나 오목은 어렸을 때에도 많이 해봤는데, 장기는 태어나서 처음 해봤습니다. 규칙을 아예 모르고 있었습니다. 처음 장기판과 기물들을 자세히 보았더니 예전에 넷마블 알까기 게임이 생각났습니다. 그 게임은 알고 보니 장기판과 장기 기물들을 빌린 거였네요.
전역 후 지금까지도 온라인 게임으로 장기를 두고 있습니다. 장기는 저의 취미로 깊게 자리 잡았습니다.
사면초가(四面楚歌)
'사방에서 초나라 노래가 흘러나온다는 뜻으로, 적에게 완전히 포위되어 희망이 없는 고립무원(孤立無援)의 상태를 이르는 말'
장기는 초한전쟁을 배경으로 만들어진 게임이라고 합니다. 초나라가 한나라와의 전투에서 패배하였고, 한나라가 초나라의 사기를 꺾기 위해서 항복한 초나라 병사들에게 노래를 부르게 했습니다. 초나라의 패왕인 항우가 사방에서 들려오는 초나라의 노래를 듣고 ‘초는 이미 유방에게 넘어간 것인가? 어떻게 포로의 수가 저렇게 많은가!’ 라며 탄식을 하였다고 합니다. 사면초가의 상황을 맞이한거죠.
저의 프로젝트는 한나라의 기물이 지속적으로 부활하면서 초나라의 왕을 노립니다. 유저는 초나라 진영에서 플레이 하고, 초나라는 끊임없이 쳐들어오는 한나라의 공격을 막으면서 최대한 오래 버티는 게임입니다. 그렇게 결국 초나라는 힘이 빠지면서 사방의 한나라 기물들에게 위협받을 것이고, 사면초가의 상황을 맞이한 초나라의 왕은 결국 죽게 됩니다.
메인 스크린
홈
게임 시작, 도움말, 환경 설정으로 이루어진 홈 스크린입니다.
대국에서 사용할 골드를 정하고 포진을 선택하여 게임을 시작할 수 있습니다.
도움말을 통해 게임에 대한 상세한 설명을 참고할 수 있습니다.
환경설정을 통해 효과음 볼륨 조절을 할 수 있습니다.
랭크
랭크 스크린입니다. 게임이 종료된 후 랭크에 등록할 수 있습니다. 닉네임을 가볍게 적은 후 등록하시면 됩니다. 이 앱은 Authentication을 사용하지 않아서 익명으로 랭크를 등록합니다. 랭크는 100위까지 볼 수 있습니다.
랭크 데이터를 보관하는 곳은 파이어베이스 리얼타임 데이터베이스 입니다. 데이터의 구조가 간단하고, 호출을 많이 하기 때문에 비용적인 측면에서 파이어스토어 보다는 리얼타임 데이터베이스가 적합하다고 생각했습니다.
광고
광고 스크린입니다. 유저가 광고를 시청한 후 1000골드를 획득할 수 있습니다. 골드는 게임 내에서 중요한 아이템이기 때문에 유저가 광고를 시청할 것이라 생각합니다.
스크린에 여백이 많은데, 프로덕션 출시 후 배너 광고를 추가할 생각입니다. 구글 애드몹에서 심사를 받지 않아서 그런지 배너 광고를 릴리스 모드에서 보게 되면 배너 광고가 제대로 게재 되지 않습니다. 이에 대해서는 프로덕션 출시 후 구글 애드몹에서 심사를 거친 뒤 다시 확인해보겠습니다.
대국 스크린
대국
대국 스크린입니다. 앱바의 가운데에 수(手)가 있고, 우측에 남은 골드가 있습니다.
가운데 정면에 장기판과 기물들이 있습니다. 한나라는 왕과 사가 없습니다.
초나라의 궁이 사망하거나 한나라 기물의 총 개수가 50을 초과하면 게임은 종료됩니다.
부활
기물을 부활시킬 수 있습니다. 실제 장기에서 점수가 높은 기물일수록 골드가 더 많이 소모됩니다.
처형
초나라 또는 한나라의 기물을 처형할 수 있습니다. 기물을 처형하기 위해서 300골드가 소모됩니다.
한나라 알고리즘 강화
20수 마다 한나라의 알고리즘이 강화됩니다.
한나라의 알고리즘이 강화될수록 기물의 부활 빈도와 상급 기물의 부활 확률이 증가합니다.
또한 미니맥스 알고리즘의 Tree Depth가 증가합니다. 틱택토처럼 경우의 수가 적은 소규모 게임은 연산량이 적기 때문에 게임이 끝날 때까지 트리를 탐색할 수 있지만, 장기와 같은 경우의 수가 방대한 게임은 그렇게 하지 못합니다. 그래서 트리의 깊이를 정해두고 미니맥스 알고리즘을 수행합니다.
0, 1단계: 3
2, 3단계: 4
4, 5단계: 5
저는 처음에 트리의 깊이를 100으로 설정할 생각을 하고 있었습니다. 하지만 어림도 없었습니다. 10으로만 설정해도 알고리즘을 수행하는 데 30분이 걸렸습니다. 그래서 3, 4, 5 정도로 작은 숫자로 설정하였습니다. 이 정도만 하더라도 한나라 기물들이 잘 움직여 줍니다.
스토어
프로젝트 후기
제가 좋아하는 장기를 응용한 게임을 만드는 것이 매우 즐거웠습니다. 장기를 좋아하시는 분들이 제 게임을 한번 해보셨으면 좋겠습니다!
플러터를 다루는 실력도 많이 늘었다고 생각합니다. 코딩하면서 각종 버그들을 맞이하였고, 버그들을 해결하면서 실력이 늘었습니다. 플러터의 위젯 트리와 엘리먼트 트리, 상태 관리, 에셋 다루기(이미지, 오디오) 등 여러 지식을 얻게 된 것 같아 너무 좋았습니다.
그리고 배포에 대한 경험을 갖게 되어서 너무 좋았습니다. 프로젝트를 하면서 코딩 이외에 환경 설정, 배포와 같은 영역은 처음 하면 굉장히 어렵지만 그 이후부턴 눈 감고도 할 수 있는 부분 아닌가요? 이제는 구글 플레이 스토어에 자신 있게 배포할 수 있을 것 같습니다. 나중에 IOS 앱스토어에도 배포할 생각입니다.
확실히 사이드 프로젝트를 해봐야 실력이 쭉쭉 늘어나네요. 역시 개발은 손가락으로 직접 부딪혀서 배워야 합니다. 여러분도 이론 공부를 어느 정도 하셨다면 바로 프로젝트를 해보시기 바랍니다.
댓글
댓글 쓰기