name: ai-opponent description: Implement or tune AI opponent behavior argument-hint: "[difficulty: easy|medium|hard]" allowed-tools:
- Read
- Edit
- Write
- Grep
- Glob
- Bash model: sonnet
AI Opponent Implementation
Help implement or tune AI opponent logic per the game design.
AI Strategy (from design doc)
func chooseAcceleration(racer: Player, track: Track, opponents: [Player]) -> GridVector {
var bestScore = Int.min
var bestAccel = GridVector(0, 0)
for acceleration in allAccelerations {
let newPos = racer.position + racer.velocity + acceleration
let newVel = racer.velocity + acceleration
if wouldCrash(from: racer.position, to: newPos, track: track) {
score = -1000
} else {
score = progressTowardFinish(newPos, track.finishLine)
score -= distanceToTrackCenter(newPos, track) * 0.1
score -= speed(newVel) * 0.05 // Prefer control
}
if score > bestScore {
bestScore = score
bestAccel = acceleration
}
}
return bestAccel
}
Difficulty Levels
| Level | Behavior |
|---|---|
| Easy | Random valid moves, avoids crashes |
| Medium | Greedy progress toward finish |
| Hard | Looks 2-3 moves ahead, blocks opponents |
Implementation Tasks
- Basic AI: Avoid crashes, prefer forward progress
- Path scoring: Evaluate each of 9 options
- Lookahead: Simulate N turns ahead (Hard mode)
- Opponent awareness: Block or avoid collisions
- Track awareness: Prefer center of track
Testing
- AI should never choose crash moves when safe options exist
- Easy AI should lose to competent player
- Hard AI should provide challenge