AIDecisionMaker: Utility-basiertes Entscheidungssystem #25

Open
opened 2026-04-16 20:41:38 +00:00 by sebastian · 0 comments
Owner

Problem: Die KI braucht eine Logik, die aus dem aktuellen Spielzustand eine sinnvolle Aktion ableitet.
Lösung:

// game/ai/AiDecisionMaker.h
struct AiAction {
    float utility;                   // 0.0 - 1.0
    std::string debugName;
    std::function<void()> execute;
};

class AiDecisionMaker {
public:
    AiAction decide(const GameWorldView&, GameMode&,
                    EntityManager&, const TurnState&, PlayerID);

private:
    // Gibt beste Bau-Aktion zurück (oder utility=0 wenn nicht möglich)
    AiAction evaluateBuild(const GameWorldView&, GameMode&,
                           EntityManager&, const TurnState&, PlayerID);

    // Gibt beste Upgrade-Aktion zurück
    AiAction evaluateUpgrade(const GameWorldView&, GameMode&,
                             EntityManager&, const TurnState&, PlayerID);

    float buildUtility(BuildingType, const TileInfo&, const PlayerInventory&);
    float upgradeUtility(const TileInfo&, const PlayerInventory&);
};

Utility-Formeln (Startpunkt):

  • Bauen: (resourceFit * 0.6) + (affordability * 0.4) – bevorzugt Gebäude die zum Tile-Ressourcentyp passen und die man sich leisten kann
  • Upgrade: (productionGain * 0.7) + (affordability * 0.3)
  • Nichts tun: immer 0.0
    Acceptance Criteria:
  • decide() gibt immer eine valide Aktion zurück (mindestens "nichts tun")
  • Utility-Berechnung ist ohne Seiteneffekte – reine Funktion
  • Unit Tests: bei vollen Ressourcen wird Bauen bevorzugt; bei niedrigen Ressourcen Nichts-tun
**Problem**: Die KI braucht eine Logik, die aus dem aktuellen Spielzustand eine sinnvolle Aktion ableitet. **Lösung**: ``` // game/ai/AiDecisionMaker.h struct AiAction { float utility; // 0.0 - 1.0 std::string debugName; std::function<void()> execute; }; class AiDecisionMaker { public: AiAction decide(const GameWorldView&, GameMode&, EntityManager&, const TurnState&, PlayerID); private: // Gibt beste Bau-Aktion zurück (oder utility=0 wenn nicht möglich) AiAction evaluateBuild(const GameWorldView&, GameMode&, EntityManager&, const TurnState&, PlayerID); // Gibt beste Upgrade-Aktion zurück AiAction evaluateUpgrade(const GameWorldView&, GameMode&, EntityManager&, const TurnState&, PlayerID); float buildUtility(BuildingType, const TileInfo&, const PlayerInventory&); float upgradeUtility(const TileInfo&, const PlayerInventory&); }; ``` Utility-Formeln (Startpunkt): - Bauen: (resourceFit * 0.6) + (affordability * 0.4) – bevorzugt Gebäude die zum Tile-Ressourcentyp passen und die man sich leisten kann - Upgrade: (productionGain * 0.7) + (affordability * 0.3) - Nichts tun: immer 0.0 Acceptance Criteria: - decide() gibt immer eine valide Aktion zurück (mindestens "nichts tun") - Utility-Berechnung ist ohne Seiteneffekte – reine Funktion - Unit Tests: bei vollen Ressourcen wird Bauen bevorzugt; bei niedrigen Ressourcen Nichts-tun
sebastian added this to the AI-System milestone 2026-04-16 20:41:38 +00:00
sebastian added the
enhancement
engine
labels 2026-04-16 20:41:38 +00:00
sebastian added this to the Dicewars project 2026-04-16 21:03:29 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: sebastian/Dicewars-Siedler#25
No description provided.