博客 / 詳情

返回

《矮人要塞》AI系統

1. 系統概述與設計目標

系統定位與作用

AI與行為系統是《矮人要塞》中控制所有生物(主要是矮人)自主行為的核心繫統。與其他遊戲不同,矮人要塞的AI系統強調"自主性優先"的設計理念,玩家無法直接控制矮人,只能通過設定工作優先級、建造設施、管理資源等方式間接引導矮人的行為。

這個系統創造了一個獨特的遊戲體驗:玩家不是指揮官,而是世界的觀察者和引導者。矮人根據自身需求、情緒、技能、關係等因素自主做出決策,產生大量涌現性行為和意外事件,這正是遊戲的核心樂趣所在。

設計目標

  1. 自主性優先:矮人具有高度自主性,玩家無法直接控制,只能間接引導
  2. 需求驅動:行為基於需求層次系統,需求未滿足會影響行為選擇
  3. 情緒即玩法:情緒系統不是裝飾,而是核心玩法機制,管理情緒是重要挑戰
  4. 真實感:通過複雜的AI系統創造真實的模擬體驗
  5. 涌現性:通過系統交互產生意外和有趣的遊戲體驗

核心價值

  • 真實感:複雜的AI系統讓矮人感覺像真實存在的個體
  • 策略深度:玩家需要通過間接方式管理矮人,增加策略選擇
  • 敍事價值:矮人的自主行為創造獨特的敍事體驗
  • 重玩價值:不同的AI行為創造不同的遊戲體驗

系統架構概覽

AI與行為系統可以分為以下幾個核心模塊:

AI與行為系統
├── 需求層次模塊
│   ├── 需求類型定義
│   ├── 需求優先級
│   ├── 需求滿足度計算
│   └── 需求對行為的影響
├── 工作分配模塊
│   ├── 工作優先級系統
│   ├── 工作選擇算法
│   ├── 工作隊列管理
│   └── 工作分配優化
├── 情緒系統模塊
│   ├── 情緒狀態管理
│   ├── 情緒影響因素
│   ├── 情緒計算機制
│   └── 極端情緒處理
├── 社交關係模塊
│   ├── 關係網絡管理
│   ├── 關係形成機制
│   ├── 關係強度計算
│   └── 關係對行為的影響
├── 決策樹模塊
│   ├── 決策因素評估
│   ├── 決策算法
│   ├── 決策優先級計算
│   └── 決策衝突處理
├── 行為執行模塊
│   ├── 行為類型定義
│   ├── 行為執行流程
│   ├── 行為中斷機制
│   └── 行為完成檢測
└── 特殊行為模塊
    ├── 緊急行為處理
    ├── 社交行為生成
    ├── 創造性行為
    └── 異常行為處理

自主性優先的設計理念

傳統遊戲AI

  • 玩家直接控制單位
  • AI執行玩家指令
  • AI行為可預測

矮人要塞AI

  • 玩家無法直接控制
  • AI自主做出決策
  • AI行為有不確定性

設計優勢

  • 創造更真實的模擬體驗
  • 產生涌現性玩法
  • 增加遊戲挑戰性
  • 創造獨特的敍事體驗

2. 需求層次系統

需求層次理論的應用

馬斯洛需求層次理論

  • 生理需求:食物、水、睡眠、温度
  • 安全需求:安全、穩定、保護
  • 社交需求:友誼、愛情、歸屬感
  • 尊重需求:成就、認可、地位
  • 自我實現需求:創造力、藝術、個人成長

在遊戲中的應用

  • 矮人的需求按照層次組織
  • 低層次需求未滿足時,高層次需求優先級降低
  • 需求滿足度影響情緒和行為

需求類型詳解

生存需求(Survival Needs)

飢餓(Hunger)

  • 需求值:0-100,0為極度飢餓,100為飽腹
  • 消耗速度:隨時間自然消耗
  • 滿足方式:進食
  • 未滿足後果:工作效率降低、可能餓死

口渴(Thirst)

  • 需求值:0-100
  • 消耗速度:比飢餓更快
  • 滿足方式:飲水
  • 未滿足後果:工作效率降低、可能渴死

睡眠(Sleep)

  • 需求值:0-100,0為極度疲勞,100為充分休息
  • 消耗速度:活動時消耗
  • 滿足方式:睡覺
  • 未滿足後果:工作效率降低、可能昏倒

温度(Temperature)

  • 需求值:舒適温度範圍
  • 影響因素:環境温度、衣物
  • 滿足方式:調節環境、穿脱衣物
  • 未滿足後果:不適、可能凍傷或中暑

安全需求(Safety Needs)

安全感(Security)

  • 需求值:0-100
  • 影響因素:威脅、危險、防禦工事
  • 滿足方式:建造防禦、消除威脅
  • 未滿足後果:恐懼、壓力、可能逃跑

舒適需求(Comfort Needs)

住所質量(Housing Quality)

  • 需求值:基於房間價值
  • 影響因素:房間大小、裝飾、傢俱
  • 滿足方式:改善住所
  • 未滿足後果:不滿、壓力

娛樂(Entertainment)

  • 需求值:0-100
  • 消耗速度:隨時間消耗
  • 滿足方式:娛樂設施、社交活動
  • 未滿足後果:無聊、不滿

社交需求(Social Needs)

友誼(Friendship)

  • 需求值:基於朋友數量和質量
  • 影響因素:社交活動、共同經歷
  • 滿足方式:社交、交談
  • 未滿足後果:孤獨、不滿

家庭(Family)

  • 需求值:基於家庭成員關係
  • 影響因素:家庭成員存在、關係質量
  • 滿足方式:與家人互動
  • 未滿足後果:思念、悲傷

尊重需求(Esteem Needs)

成就(Achievement)

  • 需求值:基於工作成就
  • 影響因素:工作質量、技能提升
  • 滿足方式:完成高質量工作
  • 未滿足後果:挫敗感

認可(Recognition)

  • 需求值:基於他人認可
  • 影響因素:工作被認可、獲得榮譽
  • 滿足方式:獲得他人認可
  • 未滿足後果:不被重視的感覺

自我實現需求(Self-Actualization Needs)

創造力(Creativity)

  • 需求值:基於創造性活動
  • 影響因素:藝術創作、創新工作
  • 滿足方式:進行創造性工作
  • 未滿足後果:創造力受限的感覺

數據結構

class Need:
    need_type: NeedType
    current_value: float  # 0-100
    max_value: float  # 100
    decay_rate: float  # 消耗速度
    priority: float  # 優先級(基於需求層次和當前值)
    
    # 滿足方式
    satisfaction_methods: list  # 可以滿足該需求的方式
    
    # 未滿足後果
    unmet_effects: list  # 未滿足時的效果

class NeedHierarchy:
    survival_needs: list  # 生存需求列表
    safety_needs: list  # 安全需求列表
    comfort_needs: list  # 舒適需求列表
    social_needs: list  # 社交需求列表
    esteem_needs: list  # 尊重需求列表
    self_actualization_needs: list  # 自我實現需求列表
    
    def get_priority_needs(self):
        # 獲取當前優先級最高的需求
        all_needs = (self.survival_needs + 
                    self.safety_needs + 
                    self.comfort_needs + 
                    self.social_needs + 
                    self.esteem_needs + 
                    self.self_actualization_needs)
        
        # 按優先級排序
        sorted_needs = sorted(all_needs, 
                            key=lambda n: n.priority, 
                            reverse=True)
        
        return sorted_needs

需求優先級機制

優先級計算

def calculate_need_priority(need):
    # 基礎優先級(基於需求層次)
    base_priority = get_base_priority(need.need_type)
    # 生存需求 > 安全需求 > 舒適需求 > 社交需求 > 尊重需求 > 自我實現需求
    
    # 當前值影響(值越低,優先級越高)
    value_factor = 1.0 - (need.current_value / need.max_value)
    
    # 未滿足後果嚴重性
    consequence_severity = get_consequence_severity(need)
    
    # 計算最終優先級
    priority = base_priority * (1.0 + value_factor * 2.0) * (1.0 + consequence_severity)
    
    return priority

優先級層次

  • 緊急(Critical):生存需求嚴重未滿足
  • 高(High):生存需求部分未滿足或安全需求未滿足
  • 中(Medium):舒適需求未滿足
  • 低(Low):社交或尊重需求未滿足
  • 極低(Very Low):自我實現需求未滿足

需求滿足度計算

滿足度計算

def calculate_need_satisfaction(need, action):
    # 檢查行動是否滿足需求
    if action.type not in need.satisfaction_methods:
        return 0.0
    
    # 計算滿足量
    satisfaction_amount = action.satisfaction_value
    
    # 應用滿足
    need.current_value = min(need.max_value, 
                            need.current_value + satisfaction_amount)
    
    # 返回滿足度(0-1)
    return need.current_value / need.max_value

滿足度影響

  • 高滿足度:提升情緒、提高工作效率
  • 低滿足度:降低情緒、降低工作效率
  • 極低滿足度:可能導致異常行為

需求對行為的影響

行為選擇影響

def select_behavior_based_on_needs(dwarf):
    # 獲取優先級最高的需求
    priority_needs = dwarf.need_hierarchy.get_priority_needs()
    
    # 選擇滿足最高優先級需求的行為
    for need in priority_needs:
        # 查找可以滿足該需求的行為
        available_behaviors = find_behaviors_for_need(need)
        
        if available_behaviors:
            # 選擇最優行為
            best_behavior = select_best_behavior(available_behaviors, dwarf)
            return best_behavior
    
    # 如果沒有緊急需求,選擇工作或其他行為
    return select_default_behavior(dwarf)

工作效率影響

def calculate_work_efficiency(dwarf, work):
    base_efficiency = 1.0
    
    # 需求滿足度影響效率
    for need in dwarf.need_hierarchy.survival_needs:
        if need.current_value < 50:  # 未充分滿足
            efficiency_penalty = (50 - need.current_value) / 50.0 * 0.3
            base_efficiency -= efficiency_penalty
    
    return max(0.1, base_efficiency)  # 最低10%效率

需求未滿足的後果

短期後果

  • 工作效率降低
  • 情緒下降
  • 行為異常

長期後果

  • 情緒崩潰
  • 健康問題
  • 可能死亡

後果處理

def process_unmet_needs(dwarf):
    for need in dwarf.need_hierarchy.get_all_needs():
        if need.current_value < need.critical_threshold:
            # 應用未滿足後果
            for effect in need.unmet_effects:
                apply_effect(dwarf, effect)
            
            # 觸發緊急行為
            if need.need_type in SURVIVAL_NEEDS:
                trigger_emergency_behavior(dwarf, need)

3. 工作分配機制

工作優先級系統

優先級層級

  • 禁止(Forbidden):-1,禁止執行
  • 低(Low):1-2,低優先級
  • 正常(Normal):3-5,正常優先級
  • 高(High):6-8,高優先級
  • 緊急(Urgent):9-10,緊急優先級

優先級設置

  • 玩家可以設置全局工作優先級
  • 玩家可以設置特定工作類型的優先級
  • 玩家可以設置特定矮人的工作優先級
  • 系統會根據需求自動調整優先級

優先級數據結構

class WorkPriority:
    work_type: WorkType
    priority_level: int  # 1-10,-1為禁止
    conditions: dict  # 優先級條件
    
    # 自動調整
    auto_adjust: bool  # 是否自動調整
    adjustment_factors: dict  # 調整因素

工作選擇算法

選擇因素

技能匹配度

def calculate_skill_match(dwarf, work):
    required_skill = work.required_skill
    dwarf_skill_level = dwarf.skills.get(required_skill, 0)
    
    # 技能等級越高,匹配度越高
    match_score = dwarf_skill_level / 20.0  # 0-1
    
    return match_score

距離因素

def calculate_distance_factor(dwarf_location, work_location):
    distance = calculate_distance(dwarf_location, work_location)
    
    # 距離越近,因子越高
    max_distance = 100  # 假設最大距離
    factor = 1.0 - (distance / max_distance) * 0.5  # 最多減少50%
    
    return max(0.5, factor)  # 最低0.5

需求因素

def calculate_need_factor(dwarf, work):
    # 檢查工作是否滿足矮人的需求
    need_satisfaction = 0.0
    
    for need in dwarf.need_hierarchy.get_priority_needs():
        if work.can_satisfy_need(need):
            need_satisfaction += need.priority
    
    # 歸一化
    max_possible_satisfaction = 10.0  # 假設最大優先級
    factor = min(1.0, need_satisfaction / max_possible_satisfaction)
    
    return factor

危險因素

def calculate_danger_factor(dwarf, work):
    # 檢查工作的危險程度
    danger_level = work.danger_level
    
    # 矮人的勇氣影響
    courage = dwarf.attributes.willpower / 1000.0
    
    # 危險因子(危險越高,因子越低,但勇氣可以抵消)
    factor = 1.0 - danger_level * (1.0 - courage) * 0.5
    
    return max(0.1, factor)  # 最低0.1

綜合選擇算法

def select_work_for_dwarf(dwarf, available_works):
    scored_works = []
    
    for work in available_works:
        # 檢查是否可以執行
        if not can_perform_work(dwarf, work):
            continue
        
        # 計算各項得分
        skill_score = calculate_skill_match(dwarf, work) * 0.4
        distance_score = calculate_distance_factor(dwarf.location, work.location) * 0.2
        need_score = calculate_need_factor(dwarf, work) * 0.3
        danger_score = calculate_danger_factor(dwarf, work) * 0.1
        
        # 優先級加成
        priority_bonus = work.priority / 10.0 * 0.2
        
        # 綜合得分
        total_score = (skill_score + distance_score + need_score + 
                      danger_score + priority_bonus)
        
        scored_works.append((work, total_score))
    
    # 選擇得分最高的工作
    if scored_works:
        scored_works.sort(key=lambda x: x[1], reverse=True)
        return scored_works[0][0]
    
    return None

工作隊列管理

隊列結構

class WorkQueue:
    works: list  # 工作列表
    priority_queue: PriorityQueue  # 優先級隊列
    
    def add_work(self, work):
        # 添加到隊列
        self.works.append(work)
        # 添加到優先級隊列
        priority = work.priority
        self.priority_queue.put((-priority, work.id, work))  # 負數因為優先級越高越小
    
    def get_next_work(self):
        # 獲取下一個工作
        if not self.priority_queue.empty():
            _, _, work = self.priority_queue.get()
            return work
        return None
    
    def remove_work(self, work_id):
        # 移除工作
        self.works = [w for w in self.works if w.id != work_id]

隊列優化

  • 合併相似工作
  • 批量處理相同類型工作
  • 優化工作順序

工作分配優化

全局優化

def optimize_work_assignment(dwarves, works):
    # 構建分配矩陣
    assignment_matrix = []
    
    for dwarf in dwarves:
        row = []
        for work in works:
            # 計算分配成本(成本越低越好)
            cost = calculate_assignment_cost(dwarf, work)
            row.append(cost)
        assignment_matrix.append(row)
    
    # 使用匈牙利算法或其他優化算法找到最優分配
    optimal_assignment = hungarian_algorithm(assignment_matrix)
    
    return optimal_assignment

動態調整

  • 根據情況動態調整工作分配
  • 處理緊急情況
  • 優化長期效率

玩家優先級設置的影響

玩家設置

  • 玩家設置的工作優先級直接影響工作選擇
  • 高優先級工作會被優先選擇
  • 禁止的工作不會被選擇

系統自動調整

  • 系統會根據需求自動調整優先級
  • 緊急需求會提升相關工作的優先級
  • 資源稀缺會提升相關工作的優先級

平衡機制

def calculate_final_priority(player_priority, auto_adjustment):
    # 玩家優先級為基礎
    base_priority = player_priority
    
    # 自動調整
    adjusted_priority = base_priority + auto_adjustment
    
    # 限制在合理範圍
    final_priority = max(1, min(10, adjusted_priority))
    
    return final_priority

4. 情緒系統

情緒狀態類型

情緒等級

  • 狂喜(Ecstatic):90-100,極度快樂
  • 快樂(Happy):70-89,快樂
  • 滿足(Content):50-69,滿足
  • 中性(Neutral):40-59,中性
  • 不滿(Unhappy):20-39,不滿
  • 痛苦(Miserable):10-19,痛苦
  • 崩潰(Stressed):0-9,精神崩潰

情緒數據結構

class EmotionState:
    current_value: float  # 0-100
    emotion_type: EmotionType
    
    # 情緒影響因素
    factors: dict  # 因素 -> 影響值
    
    # 情緒歷史
    history: list  # 情緒變化歷史
    
    # 極端情緒狀態
    is_stressed: bool  # 是否精神崩潰
    stress_level: float  # 壓力等級

情緒影響因素

工作滿意度

def calculate_work_satisfaction(dwarf, work):
    satisfaction = 0.0
    
    # 工作質量影響
    if work.quality > 3.0:  # 高質量工作
        satisfaction += 10.0
    elif work.quality < 2.0:  # 低質量工作
        satisfaction -= 5.0
    
    # 工作類型影響(某些矮人喜歡某些工作)
    if dwarf.preferences.likes_work_type(work.type):
        satisfaction += 5.0
    elif dwarf.preferences.dislikes_work_type(work.type):
        satisfaction -= 5.0
    
    # 工作環境影響
    if work.environment.is_comfortable():
        satisfaction += 3.0
    
    return satisfaction

居住環境

def calculate_housing_satisfaction(dwarf):
    room = dwarf.assigned_room
    
    if not room:
        return -10.0  # 沒有房間
    
    satisfaction = 0.0
    
    # 房間價值
    room_value = room.calculate_value()
    satisfaction += room_value / 100.0  # 每100價值+1滿意度
    
    # 房間大小
    room_size = room.size
    if room_size < 4:  # 太小
        satisfaction -= 5.0
    elif room_size > 20:  # 太大(可能浪費)
        satisfaction += 2.0
    
    # 房間裝飾
    decoration_value = room.decoration_value
    satisfaction += decoration_value / 50.0
    
    return satisfaction

社交關係

def calculate_social_satisfaction(dwarf):
    satisfaction = 0.0
    
    # 朋友數量
    friends = dwarf.relationships.get_friends()
    satisfaction += len(friends) * 2.0
    
    # 朋友質量(關係強度)
    for friend in friends:
        relationship_strength = dwarf.relationships.get_strength(friend)
        satisfaction += relationship_strength * 1.0
    
    # 家庭成員
    family = dwarf.relationships.get_family()
    satisfaction += len(family) * 3.0
    
    # 敵人數量(負面影響)
    enemies = dwarf.relationships.get_enemies()
    satisfaction -= len(enemies) * 5.0
    
    return satisfaction

創傷經歷

def calculate_trauma_impact(dwarf):
    impact = 0.0
    
    # 遍歷所有創傷經歷
    for trauma in dwarf.trauma_history:
        # 創傷嚴重性
        severity = trauma.severity
        
        # 時間衰減(越久遠影響越小)
        age = current_time - trauma.time
        decay_factor = 1.0 / (1.0 + age / 365.0)  # 每年衰減
        
        impact -= severity * decay_factor
    
    return impact

情緒計算機制

綜合情緒計算

def calculate_emotion(dwarf):
    base_emotion = 50.0  # 中性值
    
    # 工作滿意度
    work_satisfaction = calculate_work_satisfaction(dwarf, dwarf.current_work)
    base_emotion += work_satisfaction * 0.3
    
    # 居住環境
    housing_satisfaction = calculate_housing_satisfaction(dwarf)
    base_emotion += housing_satisfaction * 0.2
    
    # 社交關係
    social_satisfaction = calculate_social_satisfaction(dwarf)
    base_emotion += social_satisfaction * 0.2
    
    # 需求滿足度
    need_satisfaction = calculate_overall_need_satisfaction(dwarf)
    base_emotion += need_satisfaction * 0.2
    
    # 創傷經歷
    trauma_impact = calculate_trauma_impact(dwarf)
    base_emotion += trauma_impact * 0.1
    
    # 限制在合理範圍
    final_emotion = max(0, min(100, base_emotion))
    
    # 更新情緒狀態
    dwarf.emotion_state.current_value = final_emotion
    dwarf.emotion_state.emotion_type = determine_emotion_type(final_emotion)
    
    return final_emotion

情緒類型確定

def determine_emotion_type(emotion_value):
    if emotion_value >= 90:
        return EmotionType.ECSTATIC
    elif emotion_value >= 70:
        return EmotionType.HAPPY
    elif emotion_value >= 50:
        return EmotionType.CONTENT
    elif emotion_value >= 40:
        return EmotionType.NEUTRAL
    elif emotion_value >= 20:
        return EmotionType.UNHAPPY
    elif emotion_value >= 10:
        return EmotionType.MISERABLE
    else:
        return EmotionType.STRESSED

情緒對行為的影響

工作效率影響

def calculate_emotion_work_modifier(emotion_value):
    if emotion_value >= 70:
        # 快樂提升效率
        modifier = 1.0 + (emotion_value - 70) / 30.0 * 0.2  # 最多20%加成
    elif emotion_value >= 50:
        # 滿足正常效率
        modifier = 1.0
    elif emotion_value >= 20:
        # 不滿降低效率
        modifier = 1.0 - (50 - emotion_value) / 30.0 * 0.3  # 最多30%懲罰
    else:
        # 痛苦大幅降低效率
        modifier = 0.5 - (20 - emotion_value) / 20.0 * 0.3  # 最低20%效率
    
    return modifier

行為選擇影響

def adjust_behavior_for_emotion(dwarf, behavior):
    emotion = dwarf.emotion_state.current_value
    
    if emotion < 20:  # 痛苦
        # 可能選擇逃避行為
        if random.random() < 0.3:
            return select_escape_behavior(dwarf)
    
    elif emotion < 40:  # 不滿
        # 可能選擇消極行為
        if random.random() < 0.2:
            return select_negative_behavior(dwarf)
    
    elif emotion > 80:  # 快樂
        # 可能選擇創造性行為
        if random.random() < 0.2:
            return select_creative_behavior(dwarf)
    
    return behavior

極端情緒的處理

精神崩潰(Stress)

def handle_stress_breakdown(dwarf):
    if dwarf.emotion_state.current_value < 10:
        # 觸發精神崩潰
        dwarf.emotion_state.is_stressed = True
        dwarf.emotion_state.stress_level = 1.0
        
        # 隨機選擇崩潰類型
        breakdown_type = random.choice([
            "tantrum",  # 發脾氣
            "violence",  # 暴力傾向
            "withdrawal",  # 退縮
            "destruction"  # 破壞
        ])
        
        # 應用崩潰效果
        apply_breakdown_effect(dwarf, breakdown_type)

崩潰類型

發脾氣(Tantrum)

  • 隨機破壞物品
  • 拒絕工作
  • 攻擊他人

暴力傾向(Violence)

  • 攻擊其他矮人
  • 使用武器
  • 可能致命

退縮(Withdrawal)

  • 停止所有活動
  • 躲藏
  • 拒絕交流

破壞(Destruction)

  • 破壞建築
  • 破壞物品
  • 可能造成重大損失

崩潰處理

def apply_breakdown_effect(dwarf, breakdown_type):
    if breakdown_type == "tantrum":
        # 隨機破壞附近物品
        nearby_items = get_nearby_items(dwarf.location, radius=5)
        for item in random.sample(nearby_items, min(3, len(nearby_items))):
            destroy_item(item)
        
        # 拒絕工作
        dwarf.refuse_work = True
        dwarf.refuse_duration = random.randint(100, 300)  # 時間單位
    
    elif breakdown_type == "violence":
        # 攻擊附近矮人
        nearby_dwarves = get_nearby_dwarves(dwarf.location, radius=5)
        if nearby_dwarves:
            target = random.choice(nearby_dwarves)
            attack_dwarf(dwarf, target)
    
    elif breakdown_type == "withdrawal":
        # 停止活動
        dwarf.current_behavior = None
        dwarf.refuse_all_work = True
        
        # 尋找隱藏地點
        hide_location = find_hiding_spot(dwarf)
        if hide_location:
            move_to(dwarf, hide_location)
    
    elif breakdown_type == "destruction":
        # 破壞附近建築
        nearby_buildings = get_nearby_buildings(dwarf.location, radius=5)
        for building in random.sample(nearby_buildings, min(2, len(nearby_buildings))):
            damage_building(building, random.randint(10, 50))

情緒恢復機制

自然恢復

def process_emotion_recovery(dwarf):
    current_emotion = dwarf.emotion_state.current_value
    
    # 如果情緒很低,自然恢復很慢
    if current_emotion < 20:
        recovery_rate = 0.1  # 每天恢復0.1
    elif current_emotion < 50:
        recovery_rate = 0.5  # 每天恢復0.5
    else:
        recovery_rate = 1.0  # 每天恢復1.0
    
    # 應用恢復
    new_emotion = min(100, current_emotion + recovery_rate)
    dwarf.emotion_state.current_value = new_emotion
    
    # 如果恢復到一定程度,解除崩潰狀態
    if new_emotion > 20 and dwarf.emotion_state.is_stressed:
        dwarf.emotion_state.is_stressed = False
        dwarf.emotion_state.stress_level = 0.0
        dwarf.refuse_work = False
        dwarf.refuse_all_work = False

積極事件恢復

def apply_positive_event(dwarf, event):
    emotion_boost = 0.0
    
    if event.type == "good_work":
        emotion_boost = 5.0
    elif event.type == "social_interaction":
        emotion_boost = 3.0
    elif event.type == "entertainment":
        emotion_boost = 4.0
    elif event.type == "comfort":
        emotion_boost = 2.0
    
    # 應用情緒提升
    dwarf.emotion_state.current_value = min(100, 
                                           dwarf.emotion_state.current_value + emotion_boost)

5. 社交關係網絡

關係類型

關係分類

積極關係

  • 友誼(Friendship):朋友關係
  • 愛情(Love):戀愛關係
  • 家庭(Family):家庭成員關係
  • 尊重(Respect):尊重關係

消極關係

  • 敵對(Hostility):敵對關係
  • 仇恨(Hatred):仇恨關係
  • 恐懼(Fear):恐懼關係

中性關係

  • 熟悉(Acquaintance):認識但不熟悉
  • 陌生(Stranger):不認識

關係數據結構

class Relationship:
    dwarf_a: Dwarf
    dwarf_b: Dwarf
    relationship_type: RelationshipType
    strength: float  # 0-100,關係強度
    
    # 關係歷史
    history: list  # 關係變化歷史
    
    # 關係影響因素
    factors: dict  # 因素 -> 影響值

關係形成機制

初次接觸

def form_initial_relationship(dwarf_a, dwarf_b):
    # 創建初始關係
    relationship = Relationship(
        dwarf_a=dwarf_a,
        dwarf_b=dwarf_b,
        relationship_type=RelationshipType.ACQUAINTANCE,
        strength=10.0  # 初始強度
    )
    
    # 性格兼容性影響
    compatibility = calculate_personality_compatibility(dwarf_a, dwarf_b)
    relationship.strength += compatibility * 5.0
    
    # 添加到關係網絡
    add_relationship(dwarf_a, dwarf_b, relationship)
    
    return relationship

關係發展

def develop_relationship(dwarf_a, dwarf_b, interaction):
    relationship = get_relationship(dwarf_a, dwarf_b)
    
    if not relationship:
        relationship = form_initial_relationship(dwarf_a, dwarf_b)
    
    # 交互類型影響
    interaction_impact = get_interaction_impact(interaction.type)
    
    # 應用影響
    relationship.strength += interaction_impact
    
    # 更新關係類型
    update_relationship_type(relationship)
    
    # 記錄歷史
    relationship.history.append({
        "time": current_time,
        "interaction": interaction,
        "strength_change": interaction_impact
    })

關係強度計算

強度影響因素

共同經歷

def calculate_shared_experience_bonus(dwarf_a, dwarf_b):
    bonus = 0.0
    
    # 共同工作
    shared_work = get_shared_work_experiences(dwarf_a, dwarf_b)
    bonus += len(shared_work) * 2.0
    
    # 共同戰鬥
    shared_combat = get_shared_combat_experiences(dwarf_a, dwarf_b)
    bonus += len(shared_combat) * 5.0
    
    # 共同社交活動
    shared_social = get_shared_social_activities(dwarf_a, dwarf_b)
    bonus += len(shared_social) * 3.0
    
    return bonus

性格兼容性

def calculate_personality_compatibility(dwarf_a, dwarf_b):
    compatibility = 0.0
    
    # 性格相似度
    personality_similarity = calculate_personality_similarity(
        dwarf_a.personality, 
        dwarf_b.personality
    )
    compatibility += personality_similarity * 0.5
    
    # 興趣相似度
    interest_similarity = calculate_interest_similarity(
        dwarf_a.interests,
        dwarf_b.interests
    )
    compatibility += interest_similarity * 0.5
    
    return compatibility

綜合強度計算

def calculate_relationship_strength(relationship):
    base_strength = relationship.strength
    
    # 共同經歷加成
    shared_experience_bonus = calculate_shared_experience_bonus(
        relationship.dwarf_a,
        relationship.dwarf_b
    )
    
    # 性格兼容性加成
    compatibility_bonus = calculate_personality_compatibility(
        relationship.dwarf_a,
        relationship.dwarf_b
    ) * 10.0
    
    # 時間衰減(關係需要維護)
    age = current_time - relationship.formation_time
    decay_factor = 1.0 / (1.0 + age / 365.0)  # 每年衰減
    
    final_strength = (base_strength + shared_experience_bonus + compatibility_bonus) * decay_factor
    
    # 限制在合理範圍
    return max(0, min(100, final_strength))

關係對行為的影響

行為選擇影響

def adjust_behavior_for_relationships(dwarf, behavior):
    # 檢查行為是否涉及其他矮人
    if behavior.involves_other_dwarves():
        target_dwarves = behavior.get_target_dwarves()
        
        for target in target_dwarves:
            relationship = get_relationship(dwarf, target)
            
            if relationship:
                # 積極關係:更願意合作
                if relationship.relationship_type in POSITIVE_RELATIONSHIPS:
                    if relationship.strength > 50:
                        behavior.cooperation_bonus = 0.2  # 20%合作加成
                
                # 消極關係:可能拒絕或對抗
                elif relationship.relationship_type in NEGATIVE_RELATIONSHIPS:
                    if relationship.strength > 50:
                        if random.random() < 0.3:
                            return None  # 拒絕行為
                        else:
                            behavior.cooperation_penalty = 0.3  # 30%合作懲罰
    
    return behavior

工作效率影響

def calculate_relationship_work_modifier(dwarf, work):
    modifier = 1.0
    
    # 檢查工作是否涉及朋友
    if work.involves_other_dwarves():
        involved_dwarves = work.get_involved_dwarves()
        
        for other_dwarf in involved_dwarves:
            relationship = get_relationship(dwarf, other_dwarf)
            
            if relationship and relationship.relationship_type == RelationshipType.FRIENDSHIP:
                if relationship.strength > 70:
                    modifier += 0.1  # 10%效率加成
    
    return modifier

關係網絡的數據結構

網絡結構

class RelationshipNetwork:
    relationships: dict  # (dwarf_a_id, dwarf_b_id) -> Relationship
    
    # 索引
    dwarf_relationships: dict  # dwarf_id -> [Relationship]
    
    def add_relationship(self, dwarf_a, dwarf_b, relationship):
        key = (min(dwarf_a.id, dwarf_b.id), max(dwarf_a.id, dwarf_b.id))
        self.relationships[key] = relationship
        
        # 更新索引
        if dwarf_a.id not in self.dwarf_relationships:
            self.dwarf_relationships[dwarf_a.id] = []
        if dwarf_b.id not in self.dwarf_relationships:
            self.dwarf_relationships[dwarf_b.id] = []
        
        self.dwarf_relationships[dwarf_a.id].append(relationship)
        self.dwarf_relationships[dwarf_b.id].append(relationship)
    
    def get_relationships(self, dwarf):
        return self.dwarf_relationships.get(dwarf.id, [])
    
    def get_relationship(self, dwarf_a, dwarf_b):
        key = (min(dwarf_a.id, dwarf_b.id), max(dwarf_a.id, dwarf_b.id))
        return self.relationships.get(key)

社交活動的生成

活動類型

  • 交談(Conversation):日常交談
  • 聚會(Gathering):多人聚會
  • 合作(Cooperation):共同工作
  • 衝突(Conflict):爭吵或衝突

活動生成

def generate_social_activity(dwarves):
    # 選擇參與者
    participants = select_participants(dwarves, min_count=2, max_count=5)
    
    if len(participants) < 2:
        return None
    
    # 根據關係選擇活動類型
    relationship_strength = calculate_average_relationship_strength(participants)
    
    if relationship_strength > 60:
        # 積極關係:聚會或合作
        activity_type = random.choice(["gathering", "cooperation"])
    elif relationship_strength < 30:
        # 消極關係:可能衝突
        if random.random() < 0.3:
            activity_type = "conflict"
        else:
            activity_type = "conversation"
    else:
        # 中性關係:交談
        activity_type = "conversation"
    
    # 創建活動
    activity = SocialActivity(
        type=activity_type,
        participants=participants,
        location=select_activity_location(participants),
        duration=calculate_activity_duration(activity_type)
    )
    
    return activity

6. AI決策樹系統

決策樹結構設計

決策節點類型

條件節點

  • 檢查條件(需求、情緒、關係等)
  • 根據條件選擇分支

行為節點

  • 執行具體行為
  • 返回行為結果

優先級節點

  • 評估多個選項的優先級
  • 選擇最優選項

決策樹結構

class DecisionNode:
    node_type: NodeType  # CONDITION, BEHAVIOR, PRIORITY
    condition: Condition  # 條件(如果是條件節點)
    behavior: Behavior  # 行為(如果是行為節點)
    children: list  # 子節點
    priority: float  # 優先級(如果是優先級節點)

class DecisionTree:
    root: DecisionNode
    
    def evaluate(self, dwarf, context):
        return self._evaluate_node(self.root, dwarf, context)
    
    def _evaluate_node(self, node, dwarf, context):
        if node.node_type == NodeType.CONDITION:
            # 評估條件
            condition_result = evaluate_condition(node.condition, dwarf, context)
            
            # 選擇分支
            if condition_result:
                return self._evaluate_node(node.children[0], dwarf, context)
            else:
                return self._evaluate_node(node.children[1], dwarf, context)
        
        elif node.node_type == NodeType.BEHAVIOR:
            # 執行行為
            return node.behavior
        
        elif node.node_type == NodeType.PRIORITY:
            # 評估所有子節點,選擇優先級最高的
            best_node = None
            best_priority = -1
            
            for child in node.children:
                priority = evaluate_priority(child, dwarf, context)
                if priority > best_priority:
                    best_priority = priority
                    best_node = child
            
            return self._evaluate_node(best_node, dwarf, context)

決策因素

需求因素

def evaluate_need_factor(dwarf, behavior):
    # 檢查行為是否滿足需求
    satisfied_needs = behavior.get_satisfied_needs()
    
    if not satisfied_needs:
        return 0.0
    
    # 計算滿足的需求優先級總和
    total_priority = sum(need.priority for need in satisfied_needs)
    
    return total_priority

技能因素

def evaluate_skill_factor(dwarf, behavior):
    # 檢查行為所需的技能
    required_skills = behavior.get_required_skills()
    
    if not required_skills:
        return 1.0  # 不需要技能,中性
    
    # 計算技能匹配度
    total_match = 0.0
    for skill_type, required_level in required_skills.items():
        dwarf_skill = dwarf.skills.get(skill_type, 0)
        match = min(1.0, dwarf_skill / required_level)
        total_match += match
    
    average_match = total_match / len(required_skills)
    
    return average_match

距離因素

def evaluate_distance_factor(dwarf, behavior):
    behavior_location = behavior.get_location()
    dwarf_location = dwarf.location
    
    distance = calculate_distance(dwarf_location, behavior_location)
    
    # 距離越近,因子越高
    max_distance = 100
    factor = 1.0 - (distance / max_distance) * 0.5
    
    return max(0.5, factor)

危險因素

def evaluate_danger_factor(dwarf, behavior):
    danger_level = behavior.get_danger_level()
    
    # 矮人的勇氣影響
    courage = dwarf.attributes.willpower / 1000.0
    
    # 危險因子(危險越高,因子越低)
    factor = 1.0 - danger_level * (1.0 - courage) * 0.5
    
    return max(0.1, factor)

情緒因素

def evaluate_emotion_factor(dwarf, behavior):
    emotion = dwarf.emotion_state.current_value
    
    # 行為類型與情緒的匹配度
    behavior_emotion_match = behavior.get_emotion_match()
    
    # 如果行為需要積極情緒,但矮人情緒低落
    if behavior_emotion_match > 0 and emotion < 30:
        return 0.3  # 低匹配度
    
    # 如果行為需要消極情緒,但矮人情緒高漲
    elif behavior_emotion_match < 0 and emotion > 70:
        return 0.5  # 中等匹配度
    
    return 1.0  # 正常匹配度

關係因素

def evaluate_relationship_factor(dwarf, behavior):
    if not behavior.involves_other_dwarves():
        return 1.0  # 不涉及他人,中性
    
    involved_dwarves = behavior.get_involved_dwarves()
    
    total_factor = 0.0
    for other_dwarf in involved_dwarves:
        relationship = get_relationship(dwarf, other_dwarf)
        
        if relationship:
            if relationship.relationship_type in POSITIVE_RELATIONSHIPS:
                factor = 1.0 + relationship.strength / 100.0 * 0.3  # 最多30%加成
            elif relationship.relationship_type in NEGATIVE_RELATIONSHIPS:
                factor = 1.0 - relationship.strength / 100.0 * 0.5  # 最多50%懲罰
            else:
                factor = 1.0
        else:
            factor = 1.0
        
        total_factor += factor
    
    average_factor = total_factor / len(involved_dwarves)
    
    return average_factor

決策算法

綜合決策算法

def make_decision(dwarf, available_behaviors, context):
    scored_behaviors = []
    
    for behavior in available_behaviors:
        # 評估各項因素
        need_score = evaluate_need_factor(dwarf, behavior) * 0.3
        skill_score = evaluate_skill_factor(dwarf, behavior) * 0.2
        distance_score = evaluate_distance_factor(dwarf, behavior) * 0.15
        danger_score = evaluate_danger_factor(dwarf, behavior) * 0.1
        emotion_score = evaluate_emotion_factor(dwarf, behavior) * 0.15
        relationship_score = evaluate_relationship_factor(dwarf, behavior) * 0.1
        
        # 綜合得分
        total_score = (need_score + skill_score + distance_score + 
                      danger_score + emotion_score + relationship_score)
        
        scored_behaviors.append((behavior, total_score))
    
    # 選擇得分最高的行為
    if scored_behaviors:
        scored_behaviors.sort(key=lambda x: x[1], reverse=True)
        return scored_behaviors[0][0]
    
    return None

決策優先級計算

優先級計算

def calculate_decision_priority(dwarf, behavior):
    # 基礎優先級
    base_priority = behavior.base_priority
    
    # 需求緊急度
    need_urgency = calculate_need_urgency(dwarf, behavior)
    
    # 情緒影響
    emotion_modifier = calculate_emotion_modifier(dwarf.emotion_state)
    
    # 綜合優先級
    final_priority = base_priority * (1.0 + need_urgency) * emotion_modifier
    
    return final_priority

決策衝突處理

衝突類型

  • 需求衝突:多個需求同時需要滿足
  • 行為衝突:多個行為不能同時執行
  • 資源衝突:多個行為需要同一資源

衝突解決

def resolve_decision_conflicts(dwarf, behaviors):
    # 按優先級排序
    sorted_behaviors = sorted(behaviors, 
                            key=lambda b: calculate_decision_priority(dwarf, b),
                            reverse=True)
    
    selected_behaviors = []
    used_resources = set()
    
    for behavior in sorted_behaviors:
        # 檢查資源衝突
        required_resources = behavior.get_required_resources()
        
        if not required_resources.intersection(used_resources):
            # 無衝突,可以執行
            selected_behaviors.append(behavior)
            used_resources.update(required_resources)
        else:
            # 有衝突,跳過或延遲
            if behavior.can_be_delayed():
                delay_behavior(behavior)
            else:
                # 不能延遲,選擇更高優先級的行為
                pass
    
    return selected_behaviors

決策優化

優化策略

  • 緩存決策結果
  • 批量處理決策
  • 使用啓發式算法

優化算法

class DecisionCache:
    cache: dict
    
    def get_cached_decision(self, dwarf, context):
        cache_key = (dwarf.id, hash_context(context))
        
        if cache_key in self.cache:
            cached_decision, timestamp = self.cache[cache_key]
            
            # 檢查緩存是否過期
            if current_time - timestamp < CACHE_TTL:
                return cached_decision
        
        return None
    
    def cache_decision(self, dwarf, context, decision):
        cache_key = (dwarf.id, hash_context(context))
        self.cache[cache_key] = (decision, current_time)

7. 行為執行系統

行為類型分類

行為分類

生存行為

  • 進食
  • 飲水
  • 睡眠
  • 尋找安全

工作行為

  • 採礦
  • 鍛造
  • 建造
  • 農業

社交行為

  • 交談
  • 聚會
  • 合作

娛樂行為

  • 娛樂
  • 藝術創作
  • 閲讀

緊急行為

  • 戰鬥
  • 醫療
  • 逃跑

數據結構

class Behavior:
    behavior_type: BehaviorType
    target: object  # 行為目標
    location: Location  # 行為位置
    duration: int  # 預計持續時間
    required_resources: set  # 所需資源
    required_skills: dict  # 所需技能
    
    # 行為狀態
    status: BehaviorStatus  # PENDING, EXECUTING, COMPLETED, FAILED, INTERRUPTED
    progress: float  # 0-1,完成進度
    
    # 行為效果
    effects: list  # 行為效果列表

行為執行流程

執行流程

def execute_behavior(dwarf, behavior):
    # 1. 檢查前置條件
    if not check_prerequisites(dwarf, behavior):
        behavior.status = BehaviorStatus.FAILED
        return False
    
    # 2. 移動到行為位置
    if not move_to_location(dwarf, behavior.location):
        behavior.status = BehaviorStatus.FAILED
        return False
    
    # 3. 開始執行
    behavior.status = BehaviorStatus.EXECUTING
    behavior.start_time = current_time
    
    # 4. 執行循環
    while behavior.status == BehaviorStatus.EXECUTING:
        # 檢查中斷條件
        if check_interrupt_conditions(dwarf, behavior):
            interrupt_behavior(dwarf, behavior)
            break
        
        # 執行行為步驟
        execute_behavior_step(dwarf, behavior)
        
        # 更新進度
        update_behavior_progress(behavior)
        
        # 檢查完成條件
        if check_completion_conditions(behavior):
            complete_behavior(dwarf, behavior)
            break
        
        # 等待下一幀
        yield
    
    return behavior.status == BehaviorStatus.COMPLETED

行為中斷機制

中斷條件

  • 緊急需求(如生命危險)
  • 更高優先級行為
  • 資源不足
  • 目標消失

中斷處理

def interrupt_behavior(dwarf, behavior):
    # 設置中斷狀態
    behavior.status = BehaviorStatus.INTERRUPTED
    behavior.interrupt_time = current_time
    behavior.interrupt_reason = determine_interrupt_reason(dwarf, behavior)
    
    # 保存進度(某些行為可以恢復)
    if behavior.can_resume():
        behavior.saved_progress = behavior.progress
    
    # 清理資源
    release_behavior_resources(behavior)
    
    # 觸發中斷事件
    trigger_interrupt_event(dwarf, behavior)

行為完成檢測

完成條件

def check_completion_conditions(behavior):
    # 檢查進度
    if behavior.progress >= 1.0:
        return True
    
    # 檢查時間
    if behavior.duration > 0:
        elapsed_time = current_time - behavior.start_time
        if elapsed_time >= behavior.duration:
            return True
    
    # 檢查目標狀態
    if behavior.target and behavior.target.is_completed():
        return True
    
    return False

完成處理

def complete_behavior(dwarf, behavior):
    # 設置完成狀態
    behavior.status = BehaviorStatus.COMPLETED
    behavior.completion_time = current_time
    
    # 應用行為效果
    apply_behavior_effects(dwarf, behavior)
    
    # 更新需求
    update_needs_from_behavior(dwarf, behavior)
    
    # 更新情緒
    update_emotion_from_behavior(dwarf, behavior)
    
    # 更新技能經驗
    update_skill_experience(dwarf, behavior)
    
    # 觸發完成事件
    trigger_completion_event(dwarf, behavior)

行為失敗處理

失敗原因

  • 前置條件不滿足
  • 資源不足
  • 技能不足
  • 目標不可達

失敗處理

def handle_behavior_failure(dwarf, behavior, reason):
    # 設置失敗狀態
    behavior.status = BehaviorStatus.FAILED
    behavior.failure_reason = reason
    
    # 應用失敗效果
    apply_failure_effects(dwarf, behavior)
    
    # 降低情緒
    dwarf.emotion_state.current_value -= 2.0
    
    # 觸發失敗事件
    trigger_failure_event(dwarf, behavior)
    
    # 選擇替代行為
    alternative_behavior = find_alternative_behavior(dwarf, behavior)
    if alternative_behavior:
        schedule_behavior(dwarf, alternative_behavior)

8. 特殊行為系統

緊急行為

戰鬥行為

def execute_combat_behavior(dwarf, enemy):
    # 戰鬥是最高優先級行為
    behavior = CombatBehavior(
        target=enemy,
        priority=10  # 最高優先級
    )
    
    # 立即中斷當前行為
    interrupt_current_behavior(dwarf)
    
    # 執行戰鬥
    execute_behavior(dwarf, behavior)

醫療行為

def execute_medical_behavior(dwarf, patient):
    # 檢查醫療技能
    if dwarf.skills.get("medical", 0) < 1:
        return False  # 無醫療技能
    
    behavior = MedicalBehavior(
        target=patient,
        priority=9  # 高優先級
    )
    
    # 中斷當前行為(如果不是緊急)
    if dwarf.current_behavior.priority < 9:
        interrupt_current_behavior(dwarf)
    
    execute_behavior(dwarf, behavior)

逃跑行為

def execute_escape_behavior(dwarf, threat):
    behavior = EscapeBehavior(
        threat=threat,
        priority=8  # 高優先級
    )
    
    # 中斷當前行為
    interrupt_current_behavior(dwarf)
    
    # 尋找安全地點
    safe_location = find_safe_location(dwarf, threat)
    behavior.target_location = safe_location
    
    execute_behavior(dwarf, behavior)

社交行為

交談行為

def execute_conversation_behavior(dwarf_a, dwarf_b):
    behavior = ConversationBehavior(
        participants=[dwarf_a, dwarf_b],
        duration=random.randint(50, 150),
        priority=3  # 中等優先級
    )
    
    # 雙方都執行交談行為
    schedule_behavior(dwarf_a, behavior)
    schedule_behavior(dwarf_b, behavior)
    
    # 更新關係
    develop_relationship(dwarf_a, dwarf_b, interaction={
        "type": "conversation",
        "quality": calculate_conversation_quality(dwarf_a, dwarf_b)
    })

聚會行為

def execute_gathering_behavior(participants):
    behavior = GatheringBehavior(
        participants=participants,
        location=select_gathering_location(participants),
        duration=random.randint(100, 300),
        priority=4  # 中等偏高優先級
    )
    
    # 所有參與者執行聚會行為
    for participant in participants:
        schedule_behavior(participant, behavior)
    
    # 更新所有參與者之間的關係
    for i, dwarf_a in enumerate(participants):
        for dwarf_b in participants[i+1:]:
            develop_relationship(dwarf_a, dwarf_b, interaction={
                "type": "gathering",
                "quality": calculate_gathering_quality(participants)
            })

創造性行為

藝術創作行為

def execute_art_creation_behavior(dwarf, art_type):
    # 檢查創造需求
    if not dwarf.need_hierarchy.has_need("creativity"):
        return False
    
    behavior = ArtCreationBehavior(
        art_type=art_type,
        priority=5  # 中等優先級
    )
    
    # 需要材料和工具
    behavior.required_resources = get_art_resources(art_type)
    behavior.required_tools = get_art_tools(art_type)
    
    execute_behavior(dwarf, behavior)
    
    # 完成後創建藝術品
    if behavior.status == BehaviorStatus.COMPLETED:
        artwork = create_artwork(dwarf, art_type, behavior.quality)
        add_item_to_world(artwork)

異常行為

精神崩潰行為

def execute_stress_breakdown_behavior(dwarf):
    breakdown_type = determine_breakdown_type(dwarf)
    
    if breakdown_type == "tantrum":
        behavior = TantrumBehavior(
            priority=7  # 高優先級(會中斷其他行為)
        )
    elif breakdown_type == "violence":
        behavior = ViolenceBehavior(
            priority=8  # 高優先級
        )
    elif breakdown_type == "withdrawal":
        behavior = WithdrawalBehavior(
            priority=6  # 中等高優先級
        )
    elif breakdown_type == "destruction":
        behavior = DestructionBehavior(
            priority=7  # 高優先級
        )
    
    # 中斷所有當前行為
    interrupt_all_behaviors(dwarf)
    
    execute_behavior(dwarf, behavior)

9. 系統交互與影響

AI系統與其他系統的交互

與經濟系統的交互

  • 需求驅動生產
  • 工作選擇影響生產效率
  • 情緒影響工作效率

與數值系統的交互

  • 技能影響行為選擇
  • 屬性影響行為執行
  • 行為影響技能經驗

與文明演進系統的交互

  • 矮人行為成為歷史事件
  • 歷史事件影響矮人情緒
  • 關係網絡影響派系關係

行為對遊戲世界的影響

直接影響

  • 改變世界狀態(建造、挖掘、破壞)
  • 創造物品(製作、藝術創作)
  • 影響其他生物(戰鬥、醫療、社交)

間接影響

  • 影響資源分佈
  • 影響建築佈局
  • 影響社會關係

玩家干預機制

間接控制

  • 設置工作優先級
  • 建造設施
  • 管理資源
  • 分配任務

直接干預

  • 緊急情況下可以強制行為
  • 可以禁止特定行為
  • 可以指定特定矮人執行任務

干預限制

  • 不能直接控制矮人移動
  • 不能強制違反需求的行為
  • 干預有成本(如降低情緒)

系統平衡設計

平衡原則

  • 需求與滿足的平衡
  • 工作與休息的平衡
  • 個人與集體的平衡
  • 自主性與控制的平衡

平衡機制

def maintain_system_balance():
    # 檢查系統狀態
    system_health = calculate_system_health()
    
    if system_health < 0.5:
        # 系統不平衡,進行調整
        adjust_priorities()
        adjust_resource_allocation()
        trigger_balancing_events()

10. 設計思路總結

自主性優先的設計原理

核心思想

  • 矮人具有高度自主性
  • 玩家通過間接方式引導
  • 創造真實的模擬體驗

實現方式

  • 需求驅動行為選擇
  • 情緒影響決策
  • 關係影響合作
  • 技能影響能力

設計優勢

  • 創造真實感
  • 產生涌現性玩法
  • 增加遊戲挑戰
  • 創造獨特敍事

情緒即玩法的設計創新

創新點

  • 情緒不是裝飾,而是核心機制
  • 情緒影響所有方面
  • 管理情緒是重要挑戰

設計意義

  • 創造獨特的遊戲體驗
  • 增加策略深度
  • 產生豐富敍事

可借鑑性

  • 適用於需要角色管理的遊戲
  • 適用於需要敍事深度的遊戲
  • 適用於需要策略選擇的遊戲

需求驅動的行為系統

核心思想

  • 行為基於需求層次
  • 需求未滿足影響行為
  • 創造自然的遊戲節奏

實現方式

  • 馬斯洛需求層次理論的應用
  • 需求優先級機制
  • 需求滿足度計算
  • 需求對行為的影響

設計優勢

  • 創造真實感
  • 減少玩家負擔
  • 產生自然行為
  • 支持涌現性玩法

可借鑑的設計模式

狀態機模式

  • 行為狀態使用狀態機管理
  • 情緒狀態使用狀態機管理
  • 簡化複雜狀態管理

觀察者模式

  • 需求變化通知行為系統
  • 情緒變化通知相關係統
  • 支持解耦的事件處理

策略模式

  • 不同行為使用不同策略
  • 不同決策使用不同算法
  • 支持靈活的策略切換

命令模式

  • 行為使用命令模式
  • 支持行為撤銷和重做
  • 支持行為隊列管理

技術實現建議

數據結構

  • 使用高效的數據結構存儲關係網絡
  • 使用優先級隊列管理工作
  • 使用索引優化查詢

算法優化

  • 使用緩存優化決策計算
  • 使用批量處理減少開銷
  • 使用空間分區優化地理查詢

性能優化

  • 延遲計算非關鍵數據
  • 批量更新減少開銷
  • 使用對象池減少內存分配

可擴展性

  • 使用插件系統支持擴展
  • 使用配置系統支持定製
  • 預留擴展點支持未來功能

總結

AI與行為系統是《矮人要塞》最核心的創新之一,它通過需求驅動、情緒系統、社交關係網絡等設計,創造了一個真實而複雜的AI系統。特別是"自主性優先"和"情緒即玩法"的設計理念,為遊戲設計提供了寶貴的參考。

通過深入分析這個系統的設計原理和實現思路,我們可以學習到:

  1. 如何通過需求驅動創造自然的遊戲節奏
  2. 如何設計情緒系統作為核心玩法機制
  3. 如何實現複雜的AI決策系統
  4. 如何管理大量AI實體的行為
  5. 如何平衡自主性和玩家控制

這些設計思路不僅適用於類似遊戲,也可以應用於其他需要複雜AI系統的遊戲類型。通過學習和借鑑這些設計理念,我們可以創造出更加豐富和有趣的遊戲體驗。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.