You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oware(Mangala)游戏基础AI行为异常问题排查求助

Oware(Mangala)AI 行为异常排查与修复方案

问题核心

开发Oware游戏基础AI时,预期实现以下行为逻辑:

  • 优先选择可捕获种子的落子点
  • 无捕获机会时,选择最右侧的有效坑
  • 玩家无种子时,优先选择能向玩家送种子的坑
    附加规则:
  • 若AI存在含2颗及以上种子的坑,禁止选择含1颗及以下种子的坑
  • 若AI所有坑仅含1颗种子,允许选择最右侧有种子的坑

当前AI行为不符合预期,无法定位问题,以下是针对性排查与修复思路:


排查方向与修复要点

1. 捕获逻辑准确性验证

  • 确认落子后种子分发的模拟逻辑是否正确,需严格遵循Oware规则:跳过对方的存储坑,种子循环分发
  • 捕获触发条件需仅针对对方的坑,且坑内种子数符合2或3颗的捕获要求
  • 遍历AI所有坑时,需确保没有遗漏可捕获的落子点,避免因循环顺序错误导致优先选择失效

2. 优先级规则执行顺序修正

  • 必须先执行规则约束筛选(如排除≤1颗种子的坑,当存在≥2颗种子的坑时),再进行捕获点筛选
  • 非捕获场景下,需从右往左遍历AI的坑,确保选中最右侧的有效坑,避免索引顺序判断错误

3. 送种子逻辑补全

  • 先准确判断玩家是否无种子:遍历玩家所有坑,确认种子数均为0
  • 送种子场景需优先选择能将种子分发到玩家区域的坑,确保玩家获得可继续游戏的种子

4. 边界场景处理优化

  • 单独判断AI所有坑是否均为1颗种子,若满足则跳过“禁止选≤1颗种子坑”的规则,直接选择最右侧坑

修复后核心代码示例

#include <stdio.h>

// 棋盘索引:AI侧为0-5,玩家侧为6-11,存储坑为12(AI)、13(玩家)
int selectAIpit(int board[], int aiSide) {
    int i, rightmostValid = -1;
    int hasTwoOrMore = 0;
    int allOne = 1;

    // 前置判断:检查是否有≥2颗种子的坑,及是否所有坑仅含1颗种子
    for (i = aiSide; i < aiSide + 6; i++) {
        if (board[i] >= 2) {
            hasTwoOrMore = 1;
            allOne = 0;
        } else if (board[i] != 1 && board[i] != 0) {
            allOne = 0;
        }
        if (board[i] > 0) {
            rightmostValid = i; // 记录最右侧有种子的坑
        }
    }

    // 第一步:优先筛选可捕获的落子点
    for (i = aiSide; i < aiSide + 6; i++) {
        // 跳过不符合规则的坑
        if (hasTwoOrMore && board[i] <= 1 && !allOne) continue;
        if (board[i] == 0) continue;

        // 复制棋盘避免修改原状态
        int tempBoard[14];
        for (int j = 0; j < 14; j++) tempBoard[j] = board[j];
        if (canCapture(tempBoard, i, aiSide)) {
            return i;
        }
    }

    // 第二步:判断玩家是否无种子,优先送种子
    int playerSide = (aiSide == 0) ? 6 : 0;
    int playerHasSeeds = 0;
    for (i = playerSide; i < playerSide + 6; i++) {
        if (board[i] > 0) {
            playerHasSeeds = 1;
            break;
        }
    }
    if (!playerHasSeeds) {
        // 从右往左找能送种子到玩家区域的坑
        for (i = aiSide + 5; i >= aiSide; i--) {
            if (board[i] == 0) continue;
            if (hasTwoOrMore && board[i] <= 1 && !allOne) continue;
            if (canSendToPlayer(board, i, aiSide)) {
                return i;
            }
        }
    }

    // 第三步:无捕获且玩家有种子,返回最右侧有效坑
    return rightmostValid;
}

// 辅助函数:模拟落子判断是否能捕获
int canCapture(int board[], int pit, int aiSide) {
    int seeds = board[pit];
    board[pit] = 0;
    int current = pit;
    int opponentSide = (aiSide == 0) ? 6 : 0;

    while (seeds > 0) {
        current = (current + 1) % 12;
        // 跳过双方存储坑
        if (current == 12 || current == 13) continue;
        board[current]++;
        seeds--;
    }

    // 最后一颗种子落在对方坑且种子数为2或3时触发捕获
    if (current >= opponentSide && current < opponentSide + 6) {
        if (board[current] == 2 || board[current] == 3) {
            return 1;
        }
    }
    return 0;
}

// 辅助函数:判断落子是否能将种子送到玩家区域
int canSendToPlayer(int board[], int pit, int aiSide) {
    int seeds = board[pit];
    int current = pit;
    int playerSide = (aiSide == 0) ? 6 : 0;

    while (seeds > 0) {
        current = (current + 1) % 12;
        if (current >= playerSide && current < playerSide + 6) {
            return 1;
        }
        seeds--;
    }
    return 0;
}

关键修复说明

  • 新增前置规则判断,确保“禁止选≤1颗种子坑”的规则优先执行
  • 模拟捕获时使用棋盘副本,避免修改原游戏状态导致逻辑混乱
  • 调整送种子场景的遍历顺序,优先选择最右侧的有效送种子坑
  • 明确边界场景判断,处理所有坑仅含1颗种子的特殊情况

内容的提问来源于stack exchange,提问作者Tiago Palaio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:20:05