/// <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); }
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); }
IEnumerator delayXiaqi(int idx) { int z = WzqAI.GetIns().t(Wuziqi.indexOf(idx)); yield return(new WaitForSeconds(1.5f)); PrintQizi(z); }
/// <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 }
// Use this for initialization void Start() { wzq = new Wuziqi(); Debug.Log("why"); int k = 4; int p = k++; Debug.Log(p); }
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)); }
public bool XiaQi(int index, bool flag = true) { return(XiaQi(Wuziqi.indexOf(index), flag)); }
Vector2 getDropPointByIndex(int idx) { Pos p = Wuziqi.indexOf(idx); return(zero + new Vector2(p.x * 60, p.y * 60)); }