Files
miku-discord/uno-online/BOT_QUICK_REF.md

177 lines
4.0 KiB
Markdown
Raw Permalink Normal View History

# UNO Bot Integration - Quick Reference
## Game State JSON Quick View
### Checking Bot's Turn
```javascript
gameState.game.currentTurn === "Player 2" // Bot's turn
gameState.player2.isCurrentTurn // Alternative check
```
### Getting Playable Cards
```javascript
const playable = gameState.player2.playableCards
// Each card has: code, type, value, color, displayName, isPlayable
```
### Card Types
- `number`: 0-9 cards
- `skip`: Skip opponent (code: 404)
- `reverse`: Reverse direction (code: 0, acts as skip in 2-player)
- `draw2`: Opponent draws 2 (code: 252)
- `wild`: Change color (code: 300)
- `draw4_wild`: Change color + opponent draws 4 (code: 600)
### Current Card Info
```javascript
gameState.currentCard.displayName // "5 red"
gameState.currentCard.color // "R"
gameState.currentCard.value // 5
```
### Bot Status
```javascript
gameState.botContext.canPlay // Can play a card?
gameState.botContext.mustDraw // Must draw a card?
gameState.botContext.hasUno // Has 2 cards (press UNO)?
gameState.botContext.isWinning // Has 1 card (about to win)?
```
## API Quick Reference
### Get Game State
```bash
GET http://localhost:5000/api/game/ABC123/state
```
### Play a Card
```bash
POST http://localhost:5000/api/game/ABC123/action
Content-Type: application/json
{
"action": "play_card",
"cardCode": "5R",
"chosenColor": null
}
```
### Play Wild Card
```bash
POST http://localhost:5000/api/game/ABC123/action
Content-Type: application/json
{
"action": "play_card",
"cardCode": "W",
"chosenColor": "R"
}
```
### Draw a Card
```bash
POST http://localhost:5000/api/game/ABC123/action
Content-Type: application/json
{
"action": "draw_card"
}
```
## Color Codes
- `R` = Red
- `G` = Green
- `B` = Blue
- `Y` = Yellow
## Card Code Examples
- `5R` = 5 Red
- `0G` = 0 Green
- `skipB` = Skip Blue
- `_Y` = Reverse Yellow
- `D2R` = Draw 2 Red
- `W` = Wild
- `D4W` = Draw 4 Wild
## Simple Bot Logic
```python
# 1. Get game state
state = requests.get(f"{base_url}/api/game/{room}/state").json()['gameState']
# 2. Check if bot's turn
if state['game']['currentTurn'] != 'Player 2':
return # Not our turn
# 3. Get playable cards
playable = state['player2']['playableCards']
# 4. Choose card (simple strategy: play first playable)
if playable:
card = playable[0]
action = {
'action': 'play_card',
'cardCode': card['code'],
'chosenColor': 'R' if 'wild' in card['type'] else None
}
else:
action = {'action': 'draw_card'}
# 5. Submit action
requests.post(f"{base_url}/api/game/{room}/action", json=action)
```
## LLM Prompt Template
```
You are playing UNO as Player 2.
CURRENT CARD: {currentCard.displayName}
YOUR HAND: {player2.cards with displayNames}
PLAYABLE CARDS: {player2.playableCards}
OPPONENT CARDS: {player1.cardCount}
RULES:
- Match color OR number
- Wild cards can be played anytime
- Special cards: Skip (opponent skips turn), Draw 2, Wild, Draw 4
Choose an action. Respond in JSON format:
{"action": "play_card", "cardCode": "CODE", "chosenColor": "R/G/B/Y or null"}
OR
{"action": "draw_card"}
Your decision:
```
## Console Logs to Watch
When running the game, look for these in browser console:
- `🎮 UNO GAME STATE (Simplified):` - Quick view
- `🤖 FULL GAME STATE (For Bot):` - Complete state object
- `📋 JSON for Bot API:` - Formatted JSON (copy-paste ready)
## Files Modified
### Client-side
- `/client/src/components/Game.js` - Added game state export & logging
- `/client/src/utils/cardParser.js` - NEW: Card parsing utilities
- `/client/src/utils/gameStateBuilder.js` - NEW: Game state JSON builder
### Server-side
- `/server.js` - Added HTTP API endpoints & Socket.IO event handlers
## Testing Workflow
1. Start server: `npm start` (in /uno-online)
2. Start client: `npm start` (in /uno-online/client)
3. Create game in browser, get room code
4. Join as Player 2
5. Open browser console (F12)
6. Watch for game state logs
7. Test API: `curl http://localhost:5000/api/game/ROOMCODE/state`
## Next: Miku Bot Integration
See `BOT_INTEGRATION_GUIDE.md` for full implementation details.