五子棋思路

一、首先我们先了解一下什么叫做博弈树: 博弈树是指由于动态博弈参与者的行动有先后次序,因此可以依次将参与者的行动展开成一个树状图形。

博弈树的几个特点:

    (1) 博弈的初始格局是初始节点。

  (2) 在博弈树中,"或"节点和"与"节点是逐层交替出现的。自己一方扩展的节点之间是"或"关系,对方扩展的节点之间是"与"关系。双方轮流地扩展节点。

  (3) 所有自己一方获胜的终局都是本原问题,相应的节点是可解节点;所有使对方获胜的终局都认为是不可解节点。


二、智能五子棋要怎么用到博弈树

首先何为智能呢?

按我的理解,就是尽量的往自己有利的位置下棋,并尽可能的让自己获胜。

可以通过什么来保证自己是有利的呢?

首先我们要设计估值函数:

    以刚落下棋子(x,y)的位置为中心,得到一个11乘11的正方形,即为(x-5,y-5),(x+5,y-5),(x-5,y+5),(x+5,y+5)这四个点所围成的正方形,我称这个正方形为得分区域;

    计算得分是逐个方向考虑:   横向得分+竖线得分+左斜线得分+右斜线得分

    得分规则:

    五:15625

    活四:3125

    单四:630

    活三:625

    单三:130

    活二:125

    单二:30

    活一:25

    单一:5

    死一、死二、死三、死四:0

    估值规则:AI方-玩家

    AI方=横向得分+竖线得分+左斜线得分+右斜线得分;

    玩家=横向得分+竖线得分+左斜线得分+右斜线得分;


有了估值函数后就可以计算出棋子所下位置的得分;


接下来就是对棋子所下位置进行判断,是否为当前所需要的最高得分,由于表达能力有限,就用我的代码来解释一下:

private Point PCTurn() {
            int PCScore = 0;
            int HumanScore = 0;
            int score = 0;
            int maxX = -1, maxY = -1, maxScore = -30000;
            int be = 0;
            int end = 19;
            if (pcFirstDown) {
                be = 7;
                end = 10;
                pcFirstDown = false;
            }
            for (int i = be; i < end; i++) {
                for (int j = be; j < end; j++)
                {
                    //初始化分数;
                    PCScore = 0;
                    HumanScore = 0;
                    score = 0;
                    if(qizi[i,j]!=0){
                        continue;
                    }
                    qizi[i, j] = pcColor;
                    score = PCScore = guzhi(pcColor,i,j);//得到分数;
                    //Console.WriteLine("x=" + i + "   y=" + j + "  score=" + score + "   maxScore=" + maxScore);
                    if (score >= 13000)
                    {
                        isComputerWin = true;
                    }
                    if (maxScore >= PCScore) {
                        //当maxScore值大于PCScore时剪枝
                        qizi[i, j] = 0;
                        continue;
                    }
                    for (int n = be; n < end; n++)
                    {
                        if (maxScore >= score) {
                            //当极大值层的极大值大于score时,剪枝
                            break;
                        }
                        for (int m = be; m < end; m++)
                        {
                            if (qizi[n, m] != 0) {
                                continue;
                            }
                            qizi[n, m] = humanColor;
                            HumanScore = guzhi(humanColor,n,m);
                            if (score > PCScore - HumanScore) {
                                score = PCScore - HumanScore;//不停的更新极小值层的极小值
                            }
                            qizi[n, m] = 0;
                        }
                    }
                    qizi[i, j] = 0;
                    if (score > maxScore) {
                        maxScore = score;
                        maxX = i;
                        maxY = j;
                    }
                }
            }
            //Console.WriteLine("PC:"+maxScore);
            return new Point(maxX, maxY);
        }

以上就是文章的主要内容。





转载于:https://my.oschina.net/swchenyuzhe/blog/261128

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值