示例#1
0
    //人工智能,使棋子下落更智能
    private List <int> AI()
    {
        //获取可投掷棋子的列的集合
        List <int> possibleMoves = GetPossibleCol();
        //最佳的投掷列的集合   最佳投掷列:连线的同色棋子数量最多
        List <int> AIMoves = new List <int>();
        //连线的同色棋子数
        int blocked;
        int bestBlocked = 0;

        for (int i = 0; i < possibleMoves.Count; i++)
        {
            //当前列第一个空闲格子的行的索引为currentRow+1
            int currentRow = -1;
            //遍历所有行数
            for (int j = 5; j >= 0; j--)
            {
                if (m_BoardField[j, possibleMoves[i]] != 0)
                {
                    currentRow = j;
                    break;
                }
            }
            if (currentRow + 1 != 6)
            {
                //假设在当前棋子上方放置一个棋子,记录其在水平方向同色棋子数的个数
                m_BoardField[currentRow + 1, possibleMoves[i]] = 1;
                blocked = GetAdj(currentRow + 1, possibleMoves[i], 0, 1) + GetAdj(currentRow + 1, possibleMoves[i], 0, -1);
                //判断水平方向和竖直方向同色棋子数的最大值
                blocked = Mathf.Max(blocked, GetAdj(currentRow + 1, possibleMoves[i], 1, 0) + GetAdj(currentRow + 1, possibleMoves[i], -1, 0));
                //判断上述最大值和两斜线同色棋子数最大值
                blocked = Mathf.Max(blocked, GetAdj(currentRow + 1, possibleMoves[i], -1, 1) + GetAdj(currentRow + 1, possibleMoves[i], 1, -1));
                blocked = Mathf.Max(blocked, GetAdj(currentRow + 1, possibleMoves[i], 1, 1) + GetAdj(currentRow + 1, possibleMoves[i], -1, -1));
                if (blocked >= bestBlocked)
                {
                    if (blocked > bestBlocked)
                    {
                        bestBlocked = blocked;
                        AIMoves     = new List <int>();
                    }
                    AIMoves.Add(possibleMoves[i]);
                }
            }
            m_BoardField[currentRow + 1, possibleMoves[i]] = 0;
        }
        return(AIMoves);
    }
示例#2
0
 ////////////////////////////////FROM INTERFACE STUFF.////////////////////////////////////////////
 public void doMove(Player p, Board b)
 {
     rule moveOfThisTurn = chooseMove();
     AIMoves goingTo = new AIMoves();
     switch (moveOfThisTurn.name)
     {
         case "moveRandom":
             Console.WriteLine("moveRandom");
             goingTo.moveRandom(p,b);
             break;
         case "moveHighest":
             Console.WriteLine("moveHighest");
             goingTo.moveHighest(p, b);
             break;
         case "moveClosestToGoal":
             Console.WriteLine("moveClosestToGoal");
             goingTo.moveClosestToGoal(p, b);
             break;
         case "moveStartPosition":
             Console.WriteLine("moveStartPosition");
             goingTo.moveStartPosition(p, b);
             break;
         /* Newly added rules must follow this rule:
         case "moveNew":
             Console.WriteLine("moveNew");
             goingTo.moveNew(p, b);
             break;
          */
     }
 }