add: absorb uno-online as regular subdirectory
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.
This commit is contained in:
176
uno-online/BOT_QUICK_REF.md
Normal file
176
uno-online/BOT_QUICK_REF.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user