UNO card game web app (Node.js/React) with Miku bot integration. Previously an independent git repo (fork of mizanxali/uno-online). Removed .git/ and absorbed into main repo for unified tracking. Includes bot integration code: botActionExecutor, cardParser, gameStateBuilder, and server-side bot action support. 37 files, node_modules excluded via local .gitignore.
177 lines
4.0 KiB
Markdown
177 lines
4.0 KiB
Markdown
# 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.
|