M9: 컴퓨터 상대 — 게임 22종 컴퓨터 전략, 서버 구동(BotDriver), 연습 방
- packages/shared/src/bots.ts: 컴퓨터 id(bot:<n>:<ulid>)·프로필(컴퓨터 n)·BOT_GAMES
(도블·할리갈리·그림 맞히기·마피아 제외)
- packages/games/src/bots: 전략 계약(자기 view + 합법 수만), decideBotAction(validate 재검사),
게임별 <게임>/bot.ts 22개 + 행동 테스트, 전 게임 판 끝까지 돌리는 공통 테스트
- 서버: Room.addBot/removeBot(방장·대기실만, 방은 친구만), RoomManager.createPractice
(POST /api/rooms {practice:true}), BotDriver(사람 같은 지연, 사람과 같은 창이면 더 천천히,
재시작 후 다시 예약), 연습 게임은 전적 제외(result_json.practice), 사람이 모두 나가면 무효
- 프로토콜 addBot/removeBot, 문서 03·06 §12·08·09 §8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -86,13 +86,13 @@ CREATE TABLE games (
|
||||
started_at INTEGER NOT NULL,
|
||||
ended_at INTEGER,
|
||||
end_reason TEXT, -- 'normal' | 'resign' | 'abandoned' | 'void'
|
||||
result_json TEXT
|
||||
result_json TEXT -- 컴퓨터와 한 연습 게임은 "practice": true
|
||||
);
|
||||
CREATE INDEX games_room ON games(room_id);
|
||||
|
||||
CREATE TABLE game_players (
|
||||
game_pk TEXT NOT NULL REFERENCES games(id) ON DELETE CASCADE,
|
||||
user_id TEXT NOT NULL,
|
||||
user_id TEXT NOT NULL, -- 컴퓨터는 'bot:<번호>:<ULID>'(users에 없음)
|
||||
seat INTEGER NOT NULL,
|
||||
rank INTEGER, -- 1 = 1등, 무승부는 같은 순위
|
||||
score REAL,
|
||||
@@ -117,7 +117,7 @@ CREATE TABLE user_stats (
|
||||
| 대기실 변경(자리, 옵션, 준비) | `room_state` update(+ `room_log`) |
|
||||
| 게임 시작 | `games` insert, `room_state`, `room_log` |
|
||||
| 게임 행동 / 시간 초과 | `room_log` insert + `room_state` update (한 트랜잭션) |
|
||||
| 게임 끝 | `games` update(결과, 시드 공개), `game_players`, `user_stats` upsert (한 트랜잭션) |
|
||||
| 게임 끝 | `games` update(결과, 시드 공개), `game_players`, `user_stats` upsert (한 트랜잭션). 무효·연습 게임은 `user_stats` 제외 |
|
||||
| 방 닫힘 | `rooms.status='closed'`, `room_state` 삭제 |
|
||||
|
||||
## 4. 정리 작업(매시간)
|
||||
|
||||
Reference in New Issue
Block a user