ํด์ ํ ๋ง์ ํธ๋ฆญ ํ ์ดํน ์นด๋ ๊ฒ์ **์ค์ปฌํน(Skull King)**์ ์น ๋ฒ์ ์ ๋๋ค.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๐ข Connected ๐ Skull Kingโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ [Player1] [Player2] [Me] โ
โ ๋ฒ ํ
:2 ๋ฒ ํ
:1 ๋ฒ ํ
:? โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ํ์ฌ ํธ๋ฆญ โ
โ ๐ต7 โ โซ5 โ ??? โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ ๋ด ์นด๋ (3์ฅ) โ
โ [๐ก3] [๐ด8] [๐ดโโ ๏ธ] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ [๐ฎ Game] [๐ฌ Chat] โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
# ์์กด์ฑ ์ค์น
npm install
# ๊ฐ๋ฐ ์๋ฒ ์คํ (์๋ฒ + ํด๋ผ์ด์ธํธ ๋์)
npm run dev- ํด๋ผ์ด์ธํธ: http://localhost:3000
- ์๋ฒ: http://localhost:8080
- Health Check: http://localhost:8080/health
| ์์ญ | ๊ธฐ์ |
|---|---|
| ํ๋ก ํธ์๋ | React 18 + Vite + TypeScript |
| ๋ฐฑ์๋ | Node.js + Express + WebSocket (ws) |
| ์ํ๊ด๋ฆฌ | ์๋ฒ Authoritative + React Context |
| ์คํค๋ง ๊ฒ์ฆ | Zod |
| ํจํค์ง ๊ด๋ฆฌ | npm workspaces (monorepo) |
skull-king/
โโโ package.json # ๋ฃจํธ (workspaces)
โโโ shared/ # ๊ณต์ ํ์
/์คํค๋ง
โ โโโ src/
โ โโโ types/ # ์นด๋, ํ๋ ์ด์ด, ๊ฒ์ ์ํ ํ์
โ โโโ schemas/ # Zod ์คํค๋ง (๋ฉ์์ง ๊ฒ์ฆ)
โโโ server/ # ๋ฐฑ์๋
โ โโโ src/
โ โโโ game/ # ๊ฒ์ ์์ง (๋ฑ, ํธ๋ฆญ, ์ ์)
โ โโโ store/ # ๋ฉ๋ชจ๋ฆฌ ๋ฃธ ์ ์ฅ์
โ โโโ websocket/ # WebSocket ํธ๋ค๋ฌ
โโโ client/ # ํ๋ก ํธ์๋
โ โโโ src/
โ โโโ components/ # UI ์ปดํฌ๋ํธ
โ โโโ context/ # ๊ฒ์ ์ํ Context
โ โโโ hooks/ # WebSocket, LocalStorage ํ
โโโ docs/ # ์ค๊ณ ๋ฌธ์
โโโ rules.md # ๊ฒ์ ๊ท์น
- ํ๋ ์ด์ด: 2~6๋ช
- ๋ผ์ด๋: 10๋ผ์ด๋ (๋ผ์ด๋ N์์ N์ฅ์ฉ ๋ฐฐ๋ถ)
- ๋ชฉํ: ๋ฒ ํ ํ ํธ๋ฆญ ์๋ฅผ ์ ํํ ๋ง์ถฐ ์ ์ ํ๋
- ์ซ์ ์นด๋: 4์(๋ ธ๋/ํ๋/๋นจ๊ฐ/๊ฒ์ ) ร 13์ฅ = 52์ฅ
- ํน์ ์นด๋: ๋๋ง(5), ํด์ (5), ์ธ์ด(2), ์ค์ปฌํน(1), ํ์ด๊ทธ๋ ์ค(1) = 14์ฅ
๐ Skull King > ๐ง Mermaid (์ธ์ด๊ฐ ์ค์ปฌํน์ ์ก์!)
๐ง Mermaid > ๐ดโโ ๏ธ Pirate (์ธ์ด๊ฐ ํด์ ์ ์ก์!)
๐ดโโ ๏ธ Pirate > ์ซ์ ์นด๋
โซ Black(ํธ๋ผํ) > ๋ฆฌ๋ ์ํธ > ๐ Escape
| ๊ฒฐ๊ณผ | ์ ์ |
|---|---|
| 0 ๋ฒ ํ ์ฑ๊ณต | +๋ผ์ด๋๋ฒํธ ร 10 |
| 0 ๋ฒ ํ ์คํจ | -๋ผ์ด๋๋ฒํธ ร 10 |
| N ๋ฒ ํ ์ฑ๊ณต | +20 ร N |
| N ๋ฒ ํ ์คํจ | -10 ร |
์์ธํ ๊ท์น์ docs/rules.md ์ฐธ์กฐ.
| ํ์ | ์ค๋ช |
|---|---|
JOIN |
๋ฃธ ์ ์ฅ |
CHAT_SEND |
์ฑํ ๋ฉ์์ง |
READY |
์ค๋น ์ํ |
GAME_START |
๊ฒ์ ์์ (๋ฐฉ์ฅ) |
BID_SUBMIT |
๋ฒ ํ ์ ์ถ |
CARD_PLAY |
์นด๋ ์ ์ถ |
| ํ์ | ์ค๋ช |
|---|---|
WELCOME |
์ ์ฅ ์๋ฃ + ๋ฃธ ์ค๋ ์ท |
ROOM_SNAPSHOT |
์ ์ฒด ์ํ ์ ๋ฐ์ดํธ |
ROUND_STARTED |
๋ผ์ด๋ ์์ + ํธ๋ |
BID_PLACED |
๋ฒ ํ ์๋ฃ ์๋ฆผ |
CARD_PLAYED |
์นด๋ ์ ์ถ๋จ |
TRICK_ENDED |
ํธ๋ฆญ ์ข ๋ฃ + ์น์ |
ROUND_ENDED |
๋ผ์ด๋ ์ข ๋ฃ + ์ ์ |
GAME_ENDED |
๊ฒ์ ์ข ๋ฃ + ์์ |
# ์ ์ฒด ์์กด์ฑ ์ค์น
npm install
# ๊ฐ๋ฐ ์๋ฒ (์๋ฒ + ํด๋ผ์ด์ธํธ ๋์)
npm run dev
# ์๋ฒ๋ง ์คํ
npm run dev:server
# ํด๋ผ์ด์ธํธ๋ง ์คํ
npm run dev:client
# ๊ณต์ ํจํค์ง ๋น๋
npm run build:shared
# ํ
์คํธ
npm testnpm run dev์คํ (์๋ฒ: 8080ํฌํธ, ํด๋ผ์ด์ธํธ: 3000ํฌํธ)- ๋ธ๋ผ์ฐ์ ์ฐฝ 2~3๊ฐ๋ก http://localhost:3000 ์ ์
- ๊ฐ ์ฐฝ์์ ๋ค๋ฅธ ๋๋ค์ ์ ๋ ฅ ํ ์๋ ์ ์ฅ
- ๋ชจ๋ ํ๋ ์ด์ด "์ค๋น ์๋ฃ" ํด๋ฆญ
- ๋ฐฉ์ฅ์ด "๊ฒ์ ์์" ํด๋ฆญ
- ๋ฒ ํ โ ํธ๋ฆญ ํ๋ ์ด โ ์ ์ ํ์ธ ๋ฐ๋ณต (10๋ผ์ด๋)
- ๋ฏธ๋ ๊ฒ์ HUD: ์ฑํ
ํ๋ฉด ์๋จ์์ ๊ฒ์ ์ํ ์ค์๊ฐ ํ์ธ
- ํ์ฌ ๋ผ์ด๋/๋ผ์ด๋ ์, ๊ฒ์ ํ์ด์ฆ, ๋ด ์ ์ ํ์
- ๋ด ํด์ผ ๋ ๊ฐ์กฐ ํ์ + "๋ด ํด!" ๋ฐฐ์ง
- ๊ฐํ ์๋ฆผ ์์คํ
:
- ๐ ์ฌ์ด๋ ์๋ฆผ: ๋ด ํด ์ ๋นํ์ ์๋ ์ฌ์
- ๐ ๋ธ๋ผ์ฐ์ ์๋ฆผ: ๋ฐฑ๊ทธ๋ผ์ด๋์์๋ ํธ์ ์๋ฆผ (๊ถํ ํ์ฉ ์)
- ๐ ์ ๋ชฉ ๋ณ๊ฒฝ: ํญ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ผ ๋ "๐ ๋ด ํด! - ์ค์ปฌํน"์ผ๋ก ํ์
- ์ํฐ์น ๋ณต๊ท: ์ฑํ ์ค ๋ด ํด์ด ๋๋ฉด "๊ฒ์์ผ๋ก" ๋ฒํผ ์๋ ํ์
- 44px+ ํฐ์น ์์ญ: ๋ชจ๋ ๋ฒํผ์ด ๋ชจ๋ฐ์ผ ํฐ์น ๊ฐ์ด๋๋ผ์ธ ์ค์
- ๊ณ ์ ํ๋จ ํญ: Game | Chat ํญ์ด ํ๋จ ๊ณ ์ , ์์ง๋ก ์ฌ์ด ์ ํ
- ์คํฌ๋กค ๊ฐ๋ฅํ ์นด๋: ๋ง์ ์นด๋๋ ๊ฐ๋ก ์คํฌ๋กค๋ก ํธ๋ฆฌํ๊ฒ ์ ํ
- ์นด๋ ํผ๋๋ฐฑ: ํฐ์น ์ ์ฆ๊ฐ์ ์ธ ์๊ฐ์ /ํ ํฑ ํผ๋๋ฐฑ
๐ฑ ์ฑํ
์ค โ ๐ ๋ด ํด ์๋ฆผ โ ๐ ์ํฐ์น ๊ฒ์ ๋ณต๊ท โ ๐ฏ ์นด๋ ์ ํ โ โ
์๋ฃ ํ ์๋์ผ๋ก ์ฑํ
๋ณต๊ท ๊ฐ๋ฅ
- ๋ฐ์คํฌํฑ: ์์ด๋ ๋ ์ด์์, ํธ๋ฒ ํจ๊ณผ
- ํ๋ธ๋ฆฟ: ์ค๊ฐ ํฌ๊ธฐ ํฐ์น ์์ญ, ์นด๋ ํฌ๊ธฐ ์ต์ ํ
- ์ค๋งํธํฐ: ์ธ๋ก/๊ฐ๋ก ๋ชจ๋ ์ง์, ์นด๋ ๊ฒน์นจ ๋ฐฉ์ง
- ์์ ๋๋น WCAG AA ์ค์
- ํฐ์น ์์ญ ์ต์ 44px ๋ณด์ฅ
- ์คํฌ๋ฆฐ ๋ฆฌ๋ ํธํ์ฑ
- ํค๋ณด๋ ๋ค๋น๊ฒ์ด์ ์ง์
- ๋จ์ผ public ๋ฃธ (ํ๋ผ์ด๋น ๋ฃธ ์์)
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ (์๋ฒ ์ฌ์์ ์ ์ด๊ธฐํ)
- ํ์์์ ์์ (๋ฌด์ ํ ๋๊ธฐ)
- ๋ณด๋์ค ์ ์ ์์
- ์ง์ ๋ธ๋ผ์ฐ์ : Chrome 90+, Safari 14+, Firefox 88+
- ๋ชจ๋ฐ์ผ ์ง์: iOS Safari, Android Chrome
- ๋คํธ์ํฌ: WebSocket ์ค์๊ฐ ํต์ (์๋ ์ฌ์ฐ๊ฒฐ)
- PWA ์ค๋น: ํ ํ๋ฉด ์ถ๊ฐ, ์คํ๋ผ์ธ ์ค๋น
๋ฐ๋ชจ ์ ๋ค์ ํญ๋ชฉ๋ค์ ํ์ธํ์ธ์:
- Node.js 18+ ์ค์น๋จ
-
npm install์๋ฃ -
npm run dev์คํ (์๋ฒ 8080, ํด๋ผ์ด์ธํธ 3000)
- ๋๋ค์ ์ ๋ ฅ ํ ์๋ ์ ์ฅ
- ์ฑํ ๋ฉ์์ง ์ค์๊ฐ ์ ์ก/์์
- ๋ชจ๋ ํ๋ ์ด์ด "์ค๋น ์๋ฃ" โ ๋ฐฉ์ฅ์ด "๊ฒ์ ์์"
- ๋ฒ ํ โ ์นด๋ ํ๋ ์ด โ ํธ๋ฆญ ๊ฒฐ๊ณผ โ ๋ผ์ด๋ ์ ์
- ์๋ก๊ณ ์นจ ํ ์๋ ์ฌ์ฐ๊ฒฐ (30์ด ๋ด)
- ์ฌ์ฐ๊ฒฐ ์ ๊ฒ์ ์ํ ์ ์ง
- ์ฐ๊ฒฐ ์ํ ํ์ (์ฐ๊ฒฐ๋จ/์ฌ์ฐ๊ฒฐ ์ค.../์ฐ๊ฒฐ ๋๊น)
- ์๋ฌ ๋ฉ์์ง Toast ํ์
- ๋น ๋ฅธ ์ค๋ณต ํด๋ฆญ ๋ฐฉ์ง
- ๋ธ๋ผ์ฐ์ ์ฐฝ 2-3๊ฐ ์ด๊ธฐ
- ๊ฐ๊ฐ ๋ค๋ฅธ ๋๋ค์์ผ๋ก ์ ์ฅ
- ํ ์ฐฝ์์ ์๋ก๊ณ ์นจ โ ์๋ ์ฌ์ ์ ํ์ธ
- ๊ฒ์ ์ค ํ ํ๋ ์ด์ด ์๋ก๊ณ ์นจ โ ๊ฒ์ ๊ณ์ ๊ฐ๋ฅ ํ์ธ
- ๋จ์ผ public ๋ฃธ๋ง ์ง์
- ์๋ฒ ์ฌ์์ ์ ๋ชจ๋ ์ํ ์ด๊ธฐํ
- ํ์์์ ์์ (ํ๋ ์ด์ด ๋๊ธฐ ๋ฌด์ ํ)
MIT