余笔 2019-05-03 13:03 采纳率: 100%
浏览 1135
已结题

有没有更好的六子棋估值算法??

这个估值算法能用..但是有没有更好的方式去估值

class Evaluation
{
public:
    //我方路数和敌方路数
    int MyRoadNumber[7], EnemyRoadNumber[7];
    //评估函数
    int Evaluate(char CheckerBoard[ROUTES][ROUTES], char side)
    {
        for (int i = 0; i < 7; i++)
        {
            MyRoadNumber[i] = 0;
            EnemyRoadNumber[i] = 0;
        }
        //各路数的的价值
        int ScoreOfRoad[7] = { 0,20,80,150,800,1000,100000 };
        //估值分数
        int score = 0;
        //初始化敌我双方的路数信息!(是否有必要进行初始化?)
        for (int i = 0; i < 7; i++)
        {
            MyRoadNumber[i] = 0;
            EnemyRoadNumber[i] = 0;
        }
        //各个方向进行路数的计算
        AnalysisHorizon(CheckerBoard, side);
        AnalysisLeft(CheckerBoard, side);
        AnalysisRight(CheckerBoard, side);
        AnalysisVertical(CheckerBoard, side);
        /*
        for(int i = 0; i < 7 ; i++)
        {
            cout<<i<<"myroad"<<MyRoadNumber[i]<<endl;
            cout<<i<<"enemyroad"<<EnemyRoadNumber[i]<<endl;
        }
        */
        //MyRoadNumber[1] /= 4;
        //EnemyRoadNumber[1] /= 4;
        //分数统计

        for (int i = 1; i < 7; i++)
        {
            //cout<<i<<":"<<MyRoadNumber[i]<<"  "<<EnemyRoadNumber[i]<<endl;
            score += MyRoadNumber[i] * ScoreOfRoad[i] - EnemyRoadNumber[i] * ScoreOfRoad[i];
        }

        if (side == BLACKSIDE)
            return score;
        else
            return -score;
    }
private:
    //计算水平方向双方每路具有的条数
    int AnalysisHorizon(char CheckerBoard[ROUTES][ROUTES], char side)
    {
        for (int i = 0; i < ROUTES; i++)
        {
            for (int j = 0; j < ROUTES - 5; j++)
            {
                int number = CheckerBoard[i][j] + CheckerBoard[i][j + 1]
                    + CheckerBoard[i][j + 2] + CheckerBoard[i][j + 3]
                    + CheckerBoard[i][j + 4] + CheckerBoard[i][j + 5];
                //cout<<"AnalysisHorizon number:"<<number<<endl;
                if (number == 0 || (number > 6 && number % 7 != 0))
                {
                    continue;
                }
                if (number < 7)
                {
                    //如果side相反的话会在Evaluate上进行反转
                    //白棋的相应路数增加
                    EnemyRoadNumber[number]++;
                }
                else
                {
                    //黑棋的相应路数增加
                    MyRoadNumber[number / 7]++;
                }
            }
        }
        //如果敌我双方四路和五路的数量大约0 返回1
        if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
            return 1;
        if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
            return 1;
        return 0;

    }
    //计算垂直方向双方每路具有的条数
    int AnalysisVertical(char CheckerBoard[ROUTES][ROUTES], char side)
    {
        for (int i = 0; i < ROUTES - 5; i++)
        {
            for (int j = 0; j < ROUTES; j++)
            {
                //考虑的类型不周全 需要更改
                int number = CheckerBoard[i][j] + CheckerBoard[i + 1][j]
                    + CheckerBoard[i + 2][j] + CheckerBoard[i + 3][j]
                    + CheckerBoard[i + 4][j] + CheckerBoard[i + 5][j];
                //cout<<"AnalysisVertical number:"<<number<<endl;
                if (number == 0 || (number > 6 && number % 7 != 0))
                {
                    continue;
                }
                if (number < 7)
                {
                    //如果side相反的话会在Evaluate上进行反转
                    //白棋的相应路数增加
                    EnemyRoadNumber[number]++;
                }
                else
                {
                    //黑棋的相应路数增加
                    MyRoadNumber[number / 7]++;
                }
            }
        }
        //如果敌我双方四路和五路的数量大约0 返回1
        if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
            return 1;
        if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
            return 1;
        return 0;

    }
    //计算左斜方向双方每路具有的条数
    int AnalysisLeft(char CheckerBoard[ROUTES][ROUTES], char side)
    {
        for (int i = 0; i < ROUTES - 5; i++)
        {
            for (int j = 0; j < ROUTES - 5; j++)
            {
                //考虑的类型不周全 需要更改
                int number = CheckerBoard[i][j] + CheckerBoard[i + 1][j + 1]
                    + CheckerBoard[i + 2][j + 2] + CheckerBoard[i + 3][j + 3]
                    + CheckerBoard[i + 4][j + 4] + CheckerBoard[i + 5][j + 5];
                //cout<<"AnalysisLeft number:"<<number<<endl;
                if (number == 0 || (number > 6 && number % 7 != 0))
                {
                    continue;
                }
                if (number < 7)
                {
                    //如果side相反的话会在Evaluate上进行反转
                    //白棋的相应路数增加
                    EnemyRoadNumber[number]++;
                }
                else
                {
                    //黑棋的相应路数增加
                    MyRoadNumber[number / 7]++;
                }
            }
        }
        //如果敌我双方四路和五路的数量大约0 返回1
        if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
            return 1;
        if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
            return 1;
        return 0;
    }
    //计算右斜方向双方每路具有的条数
    int AnalysisRight(char CheckerBoard[ROUTES][ROUTES], char side)
    {
        for (int i = 0; i < ROUTES; i++)
        {
            for (int j = 0; j < ROUTES - 5; j++)
            {
                //考虑的类型不周全 需要更改
                int number = CheckerBoard[ROUTES - j - 1][j] + CheckerBoard[ROUTES - j - 2][j + 1]
                    + CheckerBoard[ROUTES - j - 3][j + 2] + CheckerBoard[ROUTES - j - 4][j + 3]
                    + CheckerBoard[ROUTES - j - 5][j + 4] + CheckerBoard[ROUTES - j - 6][j + 5];
                //cout<<"AnalysisRight number:"<<number<<endl;
                if (number == 0 || (number > 6 && number % 7 != 0))
                {
                    continue;
                }
                if (number < 7)
                {
                    //如果side相反的话会在Evaluate上进行反转
                    //白棋的相应路数增加
                    EnemyRoadNumber[number]++;
                }
                else
                {
                    //黑棋的相应路数增加
                    MyRoadNumber[number / 7]++;
                }
            }
        }
        //如果敌我双方四路和五路的数量大约0 返回1
        if (side == BLACKSIDE && MyRoadNumber[4] + MyRoadNumber[5] > 0)
            return 1;
        if (side == WHITESIDE && EnemyRoadNumber[4] + EnemyRoadNumber[5] > 0)
            return 1;
        return 0;
    }

};
  • 写回答

1条回答 默认 最新

  • zhangPC 2019-05-04 10:58
    关注

    drawWhiteChess 或drawBlackChess 函数 是否有局部变量越界的情况?可以把这两个函数注释后再运行

    评论

报告相同问题?

悬赏问题

  • ¥20 ARKts悬浮窗和快捷方式问题
  • ¥15 comparecluster没有办法kegg
  • ¥15 远程访问linux主机超时
  • ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES