예제 #1
0
    /// <summary>
    /// 裁剪可赢矩阵
    /// </summary>
    /// <param name="p"></param>
    /// <returns></returns>
    public int[][] GetWinMatraix(Pos p)
    {
        if (Wuziqi.indexOf(p.x, p.y) == -1)
        {
            return(null);
        }
        int[][] win = getWinPos(p);
        byte    q   = 4;

        indexOf(indexOf(p.x, p.y), ref q);
        for (int i = 0; i < win.GetLength(0); i++)
        {
            for (int j = 0; j < win[i].Length; j++)
            {
                if (win[i][j] == -1)
                {
                    continue;
                }
                byte b = 3;
                indexOf(win[i][j], ref b);
                if (b == 0)
                {
                    continue;
                }
                if (b != q)
                {
                    win[i][j] = -1;
                }
            }
        }
        return(win);
    }
예제 #2
0
    bool XiaQi(Pos p, Wuziqi.qiType qtype)
    {
        if (wzq.AddQi(p, qtype))
        {
            GameObject oo = null;
            if (qtype == Wuziqi.qiType.white)
            {
                oo = GameObject.Instantiate(whiteQ) as GameObject;
            }
            else
            {
                oo = GameObject.Instantiate(blackQ) as GameObject;
            }
            int idx = Wuziqi.indexOf(p.x, p.y);
            if (idx == -1)
            {
                return(false);
            }
            oo.transform.SetParent(qiTrans);

            oo.transform.localPosition = zero + new Vector2((idx % 9) * 60, (idx / 9) * 60);
            return(true);
        }
        return(false);
    }
예제 #3
0
    IEnumerator delayXiaqi(int idx)
    {
        int z = WzqAI.GetIns().t(Wuziqi.indexOf(idx));

        yield return(new WaitForSeconds(1.5f));

        PrintQizi(z);
    }
예제 #4
0
파일: WzqAI.cs 프로젝트: freedomWind/wuziqi
    /// <summary>
    /// 1,获取落子点的可赢矩阵
    /// 2,获取可赢矩阵中有效落子点
    /// 3,计算有效落子点的可赢权值
    /// 4,排序
    /// 5,取最大权值落子
    /// </summary>

    //分析有效落子点的可赢权值

    /*
     * 1, 试探性落子
     * 2,计算这个落子的可赢矩阵
     * 3,计算矩阵每个序列上的连续值情况
     * 4,统计=5个数;统计=4个数;统计=3个数;统计=2个数
     * 5,如果存在统计=5或者=4
     */
    public int t(Pos p)
    {
        #region  //计算有效落子点
        int[][]    matraix = wzq.GetWinMatraix(p);
        List <int> plist   = new List <int>();
        for (int i = 0; i < matraix.GetLength(0); i++)
        {
            for (int j = 0; j < matraix[i].Length; j++)
            {
                byte r = 3;
                wzq.indexOf(matraix[i][j], ref r);
                if (r == 0)
                {
                    plist.Add(matraix[i][j]);
                }
            }
        }
        #endregion

        #region 计算有效落子点的所有矩阵
        Dictionary <int, int[][]> totalMatriaxDic = new Dictionary <int, int[][]>();
        plist.ForEach(_ => {
            wzq.XiaQi(_, false);                                  //试探性落子矩阵
            int[][] tempM = wzq.GetWinMatraix(Wuziqi.indexOf(_)); //获取该点的可赢
            totalMatriaxDic.Add(_, tempM);
        });
        #endregion
        #region
        byte b = 3;
        wzq.indexOf(Wuziqi.indexOf(p.x, p.y), ref b);
        List <KeyValuePair <int, int> > totalPointValueList = new List <KeyValuePair <int, int> >();
        foreach (KeyValuePair <int, int[][]> kp in totalMatriaxDic)
        {
            if (kp.Key == -1)
            {
                continue;
            }
            totalPointValueList.Add(new KeyValuePair <int, int>(kp.Key, caculateQ(matraixValue(kp.Value, 1, 5, b))));
            wzq.BackQi(kp.Key);  //恢复棋子
        }
        #endregion
        #region  排序权值
        totalPointValueList.Sort((x, y) => {
            if (x.Value < y.Value)
            {
                return(1);
            }
            else if (x.Value > y.Value)
            {
                return(-1);
            }
            return(0);
        });
        return(totalPointValueList[0].Key);

        #endregion
    }
예제 #5
0
    // Use this for initialization
    void Start()
    {
        wzq = new Wuziqi();
        Debug.Log("why");
        int k = 4;
        int p = k++;

        Debug.Log(p);
    }
예제 #6
0
    int getIndexByClick()
    {
        Vector2 dPos = Vector2.one;

        RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform,
                                                                Input.mousePosition, canvas.worldCamera, out dPos);
        if (dPos.x < zero.x || dPos.x > final.x || dPos.y < zero.y || dPos.y > final.y)
        {
            return(-1);
        }
        int x = (int)((dPos.x - zero.x) / 60);

        if ((int)(dPos.x - zero.x) % 60 > 30)
        {
            x++;
        }
        int y = (int)(dPos.y - zero.y) / 60;

        if ((int)(dPos.y - zero.y) % 60 > 30)
        {
            y++;
        }
        return(Wuziqi.indexOf(x, y));
    }
예제 #7
0
 public bool XiaQi(int index, bool flag = true)
 {
     return(XiaQi(Wuziqi.indexOf(index), flag));
 }
예제 #8
0
    Vector2 getDropPointByIndex(int idx)
    {
        Pos p = Wuziqi.indexOf(idx);

        return(zero + new Vector2(p.x * 60, p.y * 60));
    }