0 0

我这段Alpha-Beta剪枝的代码哪里出问题了?30

    public synchronized boolean thinkAndMove()
    {
        //AI开局先手,首先占天元
        if (engine.checkPoint(engine.getTotalCol() / 2, engine.getTotalRow() / 2))
            bestMove = RenjuChessman.getInstance(chessmanColor, engine.getTotalCol() / 2, engine.getTotalRow() / 2);
        //人类玩家先手,AI在天元周围8个位置随机应子
        else if (engine.getStep() == 1)
        {
            boolean canAdd = false;
            int a = -engine.getTotalCol();
            int b = -engine.getTotalRow();
            do
            {
                Random r = new Random();
                a = r.nextInt(3) - 1;
                b = r.nextInt(3) - 1;
                canAdd = engine.checkPoint(engine.getTotalCol() / 2 + a, engine.getTotalRow() / 2 + b);
            }
            while (!canAdd);
            bestMove = RenjuChessman.getInstance(chessmanColor, engine.getTotalCol() / 2 + a, engine.getTotalRow() / 2 + b);
        }
        //Alpha-Beta剪枝搜索最好的下子点
        else
        {
            //生成走法集合
            ArrayList<IChessman> moveCanGo = NearMovesGenerator.generateMove(engine);
            //由于ArrayList非线程安全,先转换为数组
            IChessman[] chessman = new IChessman[moveCanGo.size()];
            chessman = moveCanGo.toArray(chessman);
            int bestValue = Integer.MIN_VALUE + 1;
            //对走法集合中的每一个走法
            for (int i = 0; i < chessman.length; i++)
            {
                //在棋盘上虚拟下一子
                engine.virtualAddChessman(chessmanColor, chessman[i].getX(), chessman[i].getY());
                //递归Alpha-Beta剪枝搜索
                int value = alpha_beta(depth, new Integer(Integer.MIN_VALUE + 1), new Integer(Integer.MAX_VALUE - 1), true);
                //恢复棋盘
                engine.recoverVirtualAdded(chessman[i].getX(), chessman[i].getY());
                //若返回值大于之前的bestValue,bestValue = value,并标记此走法为当前最好的走法
                if (value > bestValue)
                {
                    bestValue = value;
                    bestMove = chessman[i];
                }
            }
        }
        //在棋盘上下子
        return putAChessman(chessmanColor, bestMove.getX(), bestMove.getY());
    }

    /**
     * Alpha-Beta Search
     * @param depth 搜索深度
     * @param alpha
     * @param beta
     * @param isMaxLayer 当前是否极大层
     * @return
     */
    private int alpha_beta(int depth, Integer alpha, Integer beta, boolean isMaxLayer)
    {
        int value = Integer.MIN_VALUE + 1, bestvalue = Integer.MIN_VALUE + 1;
        //获取上一个在棋盘上的虚拟下子
        IChessman latedAdd = engine.getLatestVirtualAdded();
        if (latedAdd != null)
        {
            //判断上一个虚拟下子造成的结果
            int winner = engine.getWinner(latedAdd.getChessmanColor(), latedAdd.getX(), latedAdd.getY());
            if (winner != IEngine.NO_WINNER)
                //上一个虚拟下子造成结果为AI玩家获胜
                if (winner == chessmanColor)
                    return SituationInfo.SureWinValue;
                //上一个虚拟下子造成的结果为人类玩家获胜
                else
                    return -SituationInfo.SureWinValue;
        }
        //达到搜索深度
        if (depth <= 0)
        {
            //评估上一个虚拟下子的价值(对自己的价值和对对手的价值)
            int vS = SituationInfo.analyze(chessmanColor, latedAdd.getX(), latedAdd.getY(), engine);
            int vO = SituationInfo.analyze(engine.getOpponentChessmanColor(), latedAdd.getX(), latedAdd.getY(), engine);

            if (isMaxLayer)
                return vS + vO;
            else
                return -(vS + vO);
        }

        //确定下一个将在棋盘上虚拟下子的棋子颜色
        int cColor = isMaxLayer ? engine.getOpponentChessmanColor() : chessmanColor;
        //生成走法集合
        ArrayList<IChessman> moveCanGo = NearMovesGenerator.generateMove(engine);
        IChessman[] chessman = new IChessman[moveCanGo.size()];
        chessman = moveCanGo.toArray(chessman);
        //对走法集合中的每一个走法
        for (int i = 0; i < chessman.length; i++)
        {
            //在棋盘上虚拟下一子
            engine.virtualAddChessman(cColor, chessman[i].getX(), chessman[i].getY());
            //递归Alpha-Beta剪枝搜索
            value = alpha_beta(depth - 1, new Integer(Integer.MIN_VALUE + 1), new Integer(Integer.MAX_VALUE - 1), !isMaxLayer);
            //恢复棋盘
            engine.recoverVirtualAdded(chessman[i].getX(), chessman[i].getY());
            if (isMaxLayer)
            {
                //取最大值
                if (value > alpha)
                {
                    alpha = value;
                    bestvalue = alpha;
                    //剪枝
                    if (alpha >= beta)
                        return beta;
                }
            }
            //取最小值
            else if (value < beta)
            {
                beta = value;
                bestvalue = beta;
                //剪枝
                if (alpha >= beta)
                    return alpha;
            }
        }
        return bestvalue;
    }
}


结果这样的AI傻乎乎的,就连我之前写的SimpleAI都比不上。
完整的源代码http://files.blogbus.com/dsharp.blogbus.com/files/12140501640.rar
OO 
2008年6月21日 20:11
目前还没有答案

相关推荐

    一篇讲alpha-beta 剪枝及其算法分析的论文

    这篇论文主要目的是分析Alpha-Beta剪枝算法,提供对其性能特征的定量估计,并在各种随机数据上获得其运行时间的界限。在介绍Alpha-Beta剪枝之前,文章首先介绍了Minimax算法和它的基本原理,这为后续的剪枝技术提供...

    五子棋alphabeta

    《五子棋 alphabeta 算法详解与应用》 五子棋,作为一种深受人们喜爱的智力游戏,其挑战性和策略性使得它在人工智能领域也有着广泛的研究。本项目中,开发者借鉴了网络上的开源资源,实现了基于 alphabeta 算法的...

    alphabeta搜索五子棋

    AlphaBeta搜索是基于经典的Minimax算法的一种优化策略,主要用于解决二人零和博弈问题,如棋类游戏。五子棋作为此类游戏的一员,通过AlphaBeta搜索,计算机能够高效地进行深度优先搜索,以预测对手可能的走法并作出...

    Java实现基于Α-β剪枝树的智能五子棋.zip

    5. **优化策略**:为了进一步提升效率,可以使用一些优化策略,如 alpha-beta delta pruning(仅考虑差值的变化)、动态剪枝、迭代加深搜索等。 6. **缓存与开局库**:利用棋局历史记录,可以构建一个缓存表存储已...

    wuziqi-beta.rar_beta

    这可能涉及搜索策略,如Minimax算法或Alpha-Beta剪枝,以优化计算机的决策过程。 5. **界面显示**:虽然C语言本身不支持图形用户界面,但开发者可能使用了如ncurses库来创建文本界面,或者与特定的图形库(如SDL、...

    VC实现的中国象棋游戏

    alpha-beta剪枝是A*搜索算法的优化版本,特别适用于两玩家的零和博弈问题,如象棋游戏。在搜索过程中,alpha代表当前已知的最小收益(对于玩家而言),而beta代表已知的最大收益。通过比较alpha和beta值,可以提前剪...

    Gobang-ai:极大极小搜索和α-β剪枝的无禁手ai

    本文将深入探讨一个专门针对五子棋(Gobang)游戏开发的AI系统,该系统运用了极大极小搜索(Minimax Search)和α-β剪枝(Alpha-Beta Pruning)策略,实现了无禁手规则,并且具有一定的深度学习能力,能够进行8层深...

    没调试出来的五子棋

    总结来说,尽管“没调试出来的五子棋”遇到了挑战,但借助VS2010和EasyX,我们可以构建出五子棋的图形界面,再结合Alpha-Beta剪枝算法,有望实现一个高效且智能的游戏AI。调试是软件开发的重要环节,通过逐步排查和...

    北京工业大学人工智能五子棋报告.docx

    通过这个项目,我们可以深入理解人工智能在游戏策略中的应用,以及alpha-beta剪枝算法如何提高搜索效率。同时,Python编程能力得到锻炼,理解了如何利用面向对象的方法来构建复杂系统。此外,游戏设计也让我们体会到...

    五子棋alphabeta--数棋改进

    在这个项目中,开发者进一步对原有的五子棋 alphabeta 算法进行了优化,特别是在数棋阶段引入了有限状态机(Finite State Machine, FSM)模型,从而增强了程序的智能表现。 首先,我们来理解 alphabeta 算法的基本...

    Gobang.rar

    A-B剪枝算法是Alpha-Beta剪枝的变种,由Alpha(α)和Beta(β)两个参数定义。在五子棋的上下文中,Alpha表示当前节点所有可能的最佳结果的下界,而Beta则表示所有可能的最差结果的上界。当搜索过程中发现某个分支...

    博弈树搜索的算法改进论文.pdf

    Alpha-Beta剪枝是对最小最大策略的重要改进,其核心思想在于减少不必要的节点评估,通过动态调整搜索边界来避免无效计算。在搜索过程中,对于每一个节点,算法会设定上下界(alpha和beta),当下界大于等于上界时,...

    五子棋--java代码在eclipse中运行

    【五子棋--Java代码在Eclipse中运行】 在计算机编程的世界里,Java是一种广泛使用的高级编程语言,尤其在开发桌面应用和...通过分析和理解这段代码,我们可以深入学习Java的GUI编程,同时提升逻辑思维和问题解决能力。

    mathorcup数学建模挑战赛获奖论文-第四届A题_10302A.doc

    该论文提出了几种不同的算法和技术组合,包括Random-Max-Trees算法、Alpha-Beta剪枝算法、Monte Carlo评估和UCT(Upper Confidence Bound applied to Trees)算法,以解决2048游戏中的策略制定问题。 #### 二、...

    象棋 代码代码代码

    在象棋程序开发中,常见的技术关键词可能有:算法设计、数据结构(如棋盘状态的存储)、用户界面设计、游戏逻辑实现、人工智能(如Minimax算法或Alpha-Beta剪枝)等。 【标签】:“代码” 这个标签明确了我们要讨论...

    国际象棋AI

    Alpha-Beta剪枝则是在Minimax基础上优化的一种策略,它通过设置两个边界值(Alpha和Beta)来提前排除无效的分支,大大减少了搜索空间,提高了效率。 首先,我们需要设计一个棋盘和棋子的数据结构。这通常用二维数组...

    五子棋 mfc vc

    通过理解MFC的组件和事件处理机制,以及掌握Minimax和Alpha-Beta剪枝的原理,开发者可以构建出具有挑战性和趣味性的五子棋应用。在实际开发过程中,不断优化和调整AI策略,将使游戏更具吸引力。

    Chess-Engine-master.rar

    象棋引擎是基于搜索算法的,最常用的是Alpha-Beta剪枝和PVS(Principal Variation Search)算法,这两种算法能够在有限的时间内寻找最佳走法。Alpha-Beta剪枝通过排除无用的分支,极大地减少了搜索空间;PVS则专注于...

    五子棋源代码(带ai)

    通过学习和理解这段源代码,开发者不仅可以掌握MFC的基本用法,还能了解如何将AI技术融入到实际项目中,提升软件的智能化水平。对于想要深入研究游戏编程或AI算法的程序员来说,这是一个宝贵的实践案例。

    matlab-基于MATLAB的智能五子棋的仿真实现,带GUI操作界面-源码

    5. **Alpha-Beta剪枝**:为了提高MiniMax算法的效率,通常会结合Alpha-Beta剪枝技术,通过排除不会影响最终结果的分支来减少搜索空间,从而在保持智能性的同时降低计算复杂度。 6. **事件处理函数**:在MATLAB GUI...

Global site tag (gtag.js) - Google Analytics