주사위의 운명을 심리전으로 바꾸다
TAKE-DICE 기획 배경
1. 주사위 게임의 딜레마 : 너무 강한 운명을 어떻게 제어할 것인가?
보드게임이나 캐주얼 웹 게임 기획에서 주사위는 누구나 룰을 직관적으로 이해할 수 있는 훌륭한 도구다.
하지만 주사위 기반 게임에는 항상 치명적인 문제가 따라붙는다.
"플레이어의 실력보다 단순 운에 의해 승패가 결정된다" 는 허탈감이다.
아무리 판을 유리하게 이끌어가도, 마지막에 주사위 눈금 하나가 빗나가면 게임이 뒤집히고 유저는 "망할 운빨겜"라며 피로감을 느끼고 이탈한다.
그래서 TAKE-DICE를 처음 구상할 때 가장 깊게 고민한 질문은 이것이었다.
"주사위 특유의 무작위성은 살리되, 플레이어에게 의사결정권을 넘기는 방법은 없을까?"
🎲 주사위 2개 중 1개 선택 : 확률적 통제권 부여
주사위 1개만 굴려 나오는 대로 배치해야 한다면 플레이어의 선택권은 없다.
하지만, 서버가 주사위 2개를 굴려주고, 플레이어가 그중 1개를 선택하여 3개 행 중 원하는 곳에 배치하도록 룰을 바꾸면 판도가 완전히 달라진다.
주사위 2개를 독립적으로 굴릴 때, 특정 눈금 V가 최소 1개 이상 나올 확률은 여사건의 확률로 다음과 같이 계산된다.
P(Neither is V) = ( 5 / 6 ) × ( 5 / 6 ) = 25 / 36
P(V ≥ 1 ) = 1 - ( 25 / 36 ) = ( 11 / 36 ) ≒ 30.6 %
플레이어는 약 30.6%의 확률을 계산하며 자신이 원하는 콤보를 노릴지, 아니면 나온 2개의 주사위 중 덜 중요한 행에 버리는 수를 둘지 스스로 위험을 관리할 수 있게 된다.
2. 양날의 검: 상호 공멸과 무적 주사위
단순히 주사위를 채워 점수만 겨루는 게임은 금방 지루해질 수 있다. 그러기에 상대와의 팽팽한 상호작용은 필수다.
💥 상호 공멸
- 상대방의 행에 나와 같은 주사위 눈금이 있다면, 그 행에 주사위를 배치하여 상대 주사위를 파괴할 수 있다.
- 하지만 "공격한 내 주사위도 함께 파괴되어 사라진다"는 조건을 부여했다.
- 즉, 상대를 견제하기 위해 내 주사위 슬롯과 턴을 함께 소모하는 공멸하는 메커니즘이다.
🛡️ 무적 주사위의 딜레마 : 든든한 방패인가, 거추장스러운 짐인가?
- 공격에 성공한 플레이어는 보너스 턴을 획득하며, 이때 배치하는 주사위는 상대 공격에 절대 파괴되지 않는 무적 주사위 가 된다.
- 여기까지 보면 무적 주사위는 무조건 좋은 보상 같지만, 핵심 룰을 하나 더 걸었다
"무적 주사위는 상대방 주사위를 공격할 수 없다"
- 무적 주사위는 상대의 파괴 공격을 완벽히 막아내는 방패지만, 내 보드의 한 칸을 영구 점유한다.
- 예를 들어 내 행에
[4, 4]페어가 있어 트리플(36점)을 눈앞에 두고 있는 상황에서, 보너스 턴에 엉뚱하게 6이 나와 무적으로 배치하면[4, 4, 6] = 22점으로 슬롯이 굳어버려 영영 36점을 만들 수 없는 슬롯 오염 이 발생한다. - 따라서 플레이어는 무조건 공격할 것이 아니라, "지금 공격해서 얻는 무적 주사위가 나에에 득이 될 것인가, 짐이 될 것인가" 를 신중하게 저울질해야 한다.
3. 비선형 점수 K^2 와 2/3 라인 승패제
📈 폭발적인 콤보 점수 공식
한 행에 같은 주사위 눈금 V가 K개 모였을 때의 점수를 비선형 거듭제곱으로 설계했다.
RowScore = K × V × K = K^2 × V
| 주사위 눈금 (V) | 1개 (1 × V) | 2개 콤보 (4 × V) | 3개 트리플 (9 × V) |
|---|---|---|---|
| 6 | 6점 | 24점 | 54점 |
| 5 | 5점 | 20점 | 45점 |
| 4 | 4점 | 16점 | 36점 |
4, 5, 6 눈금의 트리플을 달성하면 점수가 기하급수적으로 폭발한다. 상대방의 페어(2개)를 견제하지 않으면 한 라인을 통째로 빼앗기게 된다.
🏆 2/3 라인 승리제
- 승패 판정은 총점 기준이 아니라, 3개 라인 중 2개 이상의 라인을 승리한 플레이어가 최종 승리한다.
- 한 행에서 54점(6 트리플)으로 오버킬을 달성해도, 나머지 두 행을 10:12, 14:18로 내주면 1승 2패로 패배한다.
- 라인 승수가 1-1로 비길 때만 1차 타이브레이커로 총점을 비교한다.
4. 기술 선택
[클라이언트 : React 19 + Vite] ──WSS/HTTPS──▶ [백엔드 : Express 5 + Socket.io] ──▶ [DB : PostgreSQL 15]
Frontend : React 19 를 선택한 이유
- 선언적 UI 및 컴포넌트 기반 상태 관리: 3x3 보드 격자, 주사위 슬롯, 모달, 점수판 등 빈번하게 변경되는 게임 인터페이스를 컴포넌트 단위로 격리하여 렌더링을 제어하기에 적합하다.
- framer-motion 연동 애니메이션: 주사위 롤링, 보드 안착, 파괴 효과 등 게임 인터랙션 연출을 선언적 애니메이션으로 구현하기에 용이하다.
Backend : Express를 채택한 이유
- Socket.io와의 연동성: Node.js 환경에서 WebSocket 라이브러리인 Socket.io와 결합하여 실시간 양방향 통신 환경을 구축하기에 용이하다.
- 간결한 구조: 이벤트 라우팅과 미들웨어 구성이 직관적이어서 소켓 서버와 데이터베이스 연동 환경을 빠르게 구성할 수 있다.