Exemple #1
0
 /// <summary>
 /// 设置异步执行落子操作的参数
 /// </summary>
 /// <param name="position"></param>
 /// <param name="movePiece_Confirmed"></param>
 /// <param name="movePiece_Completed"></param>
 public void SetPieceMoveArgs(ReversiPiecePosition position, WhenMovePiece_Confirmed movePiece_Confirmed, WhenMovePiece_Completed movePiece_Completed)
 {
     MovePiece_Position  = position;
     MovePiece_Confirmed = movePiece_Confirmed;
     MovePiece_Completed = movePiece_Completed;
     MovePieceHandled    = false;
 }
Exemple #2
0
 /// <summary>
 /// 检查落子的绝对合法性
 /// </summary>
 /// <param position="x">落子的坐标</param>
 private void CheckpieceValid(ReversiPiecePosition position)
 {
     if ((position.X < 0 || position.X >= BoardSize) || (position.Y < 0 || position.Y >= BoardSize))
     {
         throw new Exception("棋子已超出棋盘外! (" + position.X + ", " + position.Y + ")");
     }
 }
Exemple #3
0
        /// <summary>
        /// 初始化一个黑白棋棋盘, 大小为 8*8. 中间 4 个初始棋子为白黑白黑.
        /// </summary>
        private ReversiGame()
        {
            CurrentBoard = new ReversiPiece[BoardSize, BoardSize];
            for (int i = 0; i < BoardSize; i++)
            {
                for (int j = 0; j < BoardSize; j++)
                {
                    CurrentBoard[i, j] = ReversiPiece.Empty;
                }
            }
            CurrentBoard[BoardSize / 2 - 1, BoardSize / 2 - 1] = ReversiPiece.White;
            CurrentBoard[BoardSize / 2, BoardSize / 2 - 1]     = ReversiPiece.Black;
            CurrentBoard[BoardSize / 2 - 1, BoardSize / 2]     = ReversiPiece.Black;
            CurrentBoard[BoardSize / 2, BoardSize / 2]         = ReversiPiece.White;
            // TODO: 删除用于调试的初始棋局

            /*CurrentBoard[0, 0] = ReversiPiece.Black;
            *  CurrentBoard[0, 1] = ReversiPiece.Black;
            *  CurrentBoard[1, 0] = ReversiPiece.White;
            *  CurrentBoard[1, 1] = ReversiPiece.White;*/
            CurrentGame     = this;
            CurrentPiece    = ReversiPiece.Black;
            LastPiece       = ReversiPiece.White;
            LastPosition    = new ReversiPiecePosition(4, 4);
            TotalSteps      = 0;
            reversiBuffer   = new ReversiBuffer();
            IsBusy          = false;
            isRegretEnabled = false;
            MaxRegretSteps  = 0;
            gameStateStack  = new RecersiGameStateStack();
            UpdateState();
            ResetBuffer();
        }
        /// <summary>
        /// A区域可下棋子当中,找出一个适合的棋子,结果保存在result中
        /// </summary>
        /// <param name="result"></param>
        /// <returns>0表示可下棋子当中无A位的,1表示可下棋子中有A位但会被占角,2表示下后会被翻转,3表示可下</returns>
        private byte AArea(ReversiPiecePosition result)
        {
            if (positionsA.Count == 0)
            {
                return(0);
            }
            bool changedA = false;

            for (int i = 0; i < positionsA.Count; i++)
            {
                byte tmp = ConsiderA(positionsA[i]);
                if (tmp == 0)
                {
                    continue;
                }
                else if (tmp == 1)
                {
                    result.X = positionsA[i].X;
                    result.Y = positionsA[i].Y;
                    changedA = true;
                    continue;
                }
                result.X = positionsA[i].X;
                result.Y = positionsA[i].Y;
                return(3);
            }
            if (changedA)
            {
                return(2);
            }
            return(1);
        }
        /// <summary>
        /// C区域可下棋子当中,找出一个适合的棋子,结果保存在result中
        /// </summary>
        /// <param name="result"></param>
        /// <returns>0表示可下棋子当中无C位的,1表示可下棋子中有C位但会被立即占角或者将被占角,2表示可下并且result为最优</returns>
        private byte CArea(ReversiPiecePosition result)
        {
            if (positionsC.Count == 0)
            {
                return(0);
            }
            CPrority();
            int Max      = -1;
            int MaxIndex = -1;

            for (int i = 0; i < positionsCPriority.Count; i++)
            {
                if (positionsCPriority[i] > Max)
                {
                    Max      = positionsCPriority[i];
                    MaxIndex = i;
                }
            }
            if (Max > 1)
            {
                result.X = positionsC[MaxIndex].X;
                result.Y = positionsC[MaxIndex].Y;
                return(2);
            }
            else
            {
                result.X = positionsC[MaxIndex].X;
                result.Y = positionsC[MaxIndex].Y;
                return(1);
            }
        }
 /// <summary>
 /// 判断棋子是否在倒数第二圈,如果在并且判断其是否在角
 /// </summary>
 /// <param name="position">棋子的位置</param>
 /// <returns>0代表不在,1表示在角,2表示在边</returns>
 private byte IsInSecondRect(ReversiPiecePosition position)
 {
     if ((position.X == 2 || position.X == 5) && position.Y > 1 && position.Y < 6)
     {
         int tmp = position.X + position.Y;
         if (tmp == 4 || tmp == 7 || tmp == 10)
         {
             return(1);
         }
         else
         {
             return(2);
         }
     }
     else if ((position.Y == 2 || position.Y == 5) && position.X > 1 && position.X < 6)
     {
         int tmp = position.X + position.Y;
         if (tmp == 4 || tmp == 7 || tmp == 10)
         {
             return(1);
         }
         else
         {
             return(2);
         }
     }
     return(0);
 }
        private List <ReversiPiecePosition> positionsNext;   //下一步棋子

        public override ReversiPiecePosition GetNextpiece()
        {
            //获得可下棋子
            this.enabledPositionList = reversiGame.GetEnabledPositions();

            if (enabledPositionList == null)
            {
                throw new Exception("计算AI下一步棋子时,棋盘上无AI可下棋子");
            }

            //声明一个即将作为返回结果的棋子
            ReversiPiecePosition result;

            //划分区域
            DivideArea();

            //安全区域
            if ((result = SafeArea()) != null)
            {
                return(result);
            }

            //B区域
            if ((result = BArea()) != null)
            {
                return(result);
            }

            //Region--安全区域和B区域均无子可下
            result = new ReversiPiecePosition();
            ReversiPiecePosition resultA = new ReversiPiecePosition();
            byte tmpA = AArea(result);

            //A区域
            if (tmpA == 3)
            {
                return(result);
            }
            else if (tmpA == 2)
            {
                resultA.X = result.X; //如果下A位出现被翻转,记下此A位的位置
                resultA.Y = result.Y;
            }
            //C区域
            if ((CArea(result)) == 2)
            {
                return(result);
            }
            //A区域
            if (tmpA == 2)
            {
                return(resultA);
            }
            //EndRegion--安全区域和B区域均无子可下

            return(null);
        }
        /// <summary>
        /// 判断C位是否可下
        /// </summary>
        /// <param name="position">c位的棋子</param>
        /// <returns>0表示会被占角,1表示将会被占角,2不会被占角,3表示不会被占角且会占到其同边上的非附近的角</returns>
        private byte ConsiderC(ReversiPiecePosition position)
        {
            if (IsInEdgeOrCorner(position) != 2)
            {
                throw new Exception("使用ConsiderC方法是,参数为非C位");
            }
            TryMoveOne(position);
            List <ReversiPiecePosition> tmp1       = reversiGame.GetEnabledPositions();
            ReversiPiecePosition        tmpA       = ANearC(position);
            ReversiPiecePosition        tmpCorner1 = CornerNearC(position);
            ReversiPiecePosition        tmpCorner2 = RemoteSameEdgeCornerOfC(position);

            for (int i = 0; i < tmp1.Count; i++)
            {
                //判断是否立即与其同边的丢角
                if ((tmp1[i].X == tmpCorner1.X && tmp1[i].Y == tmpCorner1.Y) ||
                    (tmp1[i].X == tmpCorner2.X && tmp1[i].Y == tmpCorner2.Y))
                {
                    RegretOne();
                    return(0);
                }
                //判断是否将要丢失其附近的角
                else if (tmpA.X == tmp1[i].X && tmpA.Y == tmp1[i].Y)
                {
                    TryMoveOne(tmpA);
                    List <ReversiPiecePosition> tmp2 = reversiGame.GetEnabledPositions();
                    for (int j = 0; j < tmp2.Count; j++)
                    {
                        if (tmp2[i].X == tmpCorner2.X && tmp2[i].Y == tmpCorner2.Y)
                        {
                            RegretOne();
                            RegretOne();
                            return(1);
                        }
                    }
                    RegretOne();
                }
            }
            if (reversiGame.CurrentBoard[tmpCorner1.X, tmpCorner1.Y] != ReversiPiece.Empty)
            {
                TryMoveOne(tmp1[new Random().Next(tmp1.Count)]);
                List <ReversiPiecePosition> tmp2 = reversiGame.GetEnabledPositions();
                for (int i = 0; i < tmp2.Count; i++)
                {
                    //判断是否可以占其同边上非附近的角
                    if (tmp2[i].X == tmpCorner2.X && tmp2[i].Y == tmpCorner2.Y)
                    {
                        RegretOne();
                        RegretOne();
                        return(3);
                    }
                }
                RegretOne();
            }
            RegretOne();
            return(2);
        }
 /// <summary>
 /// 判断两个位置是否相等
 /// </summary>
 /// <param name="position">另一个位置</param>
 /// <returns>如果相等, 则返回 true.</returns>
 public bool Equals(ReversiPiecePosition position)
 {
     if (x == position.X && y == position.Y)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #10
0
 private ReversiPiecePosition MostRemoteChangedpiece(ReversiPiecePosition location, int directionX, int directionY)
 {
     while (location.X + directionX < ReversiGame.BoardSize && location.X + directionX > -1 &&
            location.Y + directionY < ReversiGame.BoardSize && location.Y + directionY > -1 &&
            reversiGame.CurrentBoard[location.X + directionX, location.Y + directionY] != ReversiPiece.Empty &&
            reversiGame.CurrentBoard[location.X + directionX, location.Y + directionY] != this.AIColor)
     {
         if (directionX > 0)
         {
             directionX = directionX + 1;
         }
         else if (directionX < 0)
         {
             directionX = directionX - 1;
         }
         if (directionY > 0)
         {
             directionY = directionY + 1;
         }
         else if (directionY < 0)
         {
             directionY = directionY - 1;
         }
     }
     if (location.X + directionX == ReversiGame.BoardSize || location.X + directionX == -1 ||
         location.Y + directionY == ReversiGame.BoardSize || location.Y + directionY == -1)
     {
         return(new ReversiPiecePosition(location.X, location.Y));
     }
     else if (reversiGame.CurrentBoard[location.X + directionX, location.Y + directionY] == ReversiPiece.Empty)
     {
         return(new ReversiPiecePosition(location.X, location.Y));
     }
     else
     {
         if (directionX > 0)
         {
             directionX = directionX - 1;
         }
         else if (directionX < 0)
         {
             directionX = directionX + 1;
         }
         if (directionY > 0)
         {
             directionY = directionY - 1;
         }
         else if (directionY < 0)
         {
             directionY = directionY + 1;
         }
         return(new ReversiPiecePosition(location.X + directionX, location.Y + directionY));
     }
 }
 public List <ReversiPiecePosition> GetReversePositions(ReversiPiecePosition setPosition)
 {
     foreach (ReversiBufferPosition rbp in AllBufferPositions)
     {
         if (rbp.Position.Equals(setPosition))
         {
             return(rbp.AllReversePositions);
         }
     }
     return(null);
 }
 /// <summary>
 /// 判断是否为角
 /// </summary>
 /// <param name="position">棋子的位置</param>
 /// <returns>布尔值</returns>
 private bool IsCorner(ReversiPiecePosition position)
 {
     if ((position.X == 0 && position.Y == 0) || (position.X == 7 && position.Y == 7) ||
         (position.X == 0 && position.Y == 7) || (position.X == 7 && position.Y == 0))
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemple #13
0
 /// <summary>
 /// 初始化一个有特定棋局的黑白棋棋盘, 其棋局由参数确定.
 /// </summary>
 /// <param name="initialReversiBoard">是一个二维数组, 指定黑白棋棋局.</param>
 private ReversiGame(ReversiPiece[,] initialReversiBoard)
 {
     CurrentBoard  = initialReversiBoard;
     CurrentGame   = this;
     CurrentPiece  = ReversiPiece.Black;
     LastPiece     = ReversiPiece.White;
     LastPosition  = new ReversiPiecePosition(4, 4);
     reversiBuffer = new ReversiBuffer();
     IsBusy        = false;
     UpdateState();
     ResetBuffer();
 }
Exemple #14
0
        /// <summary>
        /// 开始执行落子操作
        /// </summary>
        public void PieceMoves()
        {
            if (MovePieceHandled || !IspieceEnabled(MovePiece_Position))
            {
                MovePiece_Confirmed(false, CurrentPiece, null, null);
                MovePiece_Completed(false, false, CurrentPiece);
                return;
            }
            // 保存缓冲区当中的当前落子信息
            ReversiPiece                thisPiece           = CurrentPiece;
            ReversiPiecePosition        thisMovePosition    = MovePiece_Position;
            List <ReversiPiecePosition> thisReversePosition = reversiBuffer.GetReversePositions(thisMovePosition);

            if (IsBusy || thisReversePosition == null)
            {
                MovePiece_Confirmed(false, CurrentPiece, null, null);
                MovePiece_Completed(false, false, CurrentPiece);
                return;
            }
            IsBusy = true;
            // 开始落子, 更新棋盘.
            PushState();
            CurrentBoard[thisMovePosition.X, thisMovePosition.Y] = CurrentPiece;
            foreach (ReversiPiecePosition rpp in thisReversePosition)
            {
                CurrentBoard[rpp.X, rpp.Y] = CurrentPiece;
            }
            UpdateState();
            LastPiece    = thisPiece;
            LastPosition = thisMovePosition;
            MovePiece_Confirmed(true, thisPiece, thisMovePosition, thisReversePosition);
            // 重建缓冲区
            CurrentPiece = GetReversepiece(CurrentPiece);
            ResetBuffer();
            if (GetEnabledPositions().Count <= 0)
            {
                CurrentPiece = GetReversepiece(CurrentPiece);
                ResetBuffer();
                if (GetEnabledPositions().Count <= 0)
                {
                    IsGameOver = true;
                }
            }
            // 落子完成, 对外宣布并重置落子参数
            IsBusy = false;
            MovePiece_Completed(true, IsGameOver, CurrentPiece);
            MovePiece_Position  = null;
            MovePiece_Confirmed = null;
            MovePiece_Completed = null;
            MovePieceHandled    = true;
        }
Exemple #15
0
 public ReversiGameState(ReversiPiece[,] board, ReversiPiece piece, ReversiPiece lastPiece, ReversiPiecePosition lastPosition)
 {
     CurrentBoard = new ReversiPiece[ReversiGame.BoardSize, ReversiGame.BoardSize];
     for (int i = 0; i < ReversiGame.BoardSize; i++)
     {
         for (int j = 0; j < ReversiGame.BoardSize; j++)
         {
             CurrentBoard[i, j] = board[i, j];
         }
     }
     CurrentPiece = piece;
     LastPiece    = lastPiece;
     LastPosition = new ReversiPiecePosition(lastPosition.X, lastPosition.Y);
 }
Exemple #16
0
        private int NumberOfChangedPieces(ReversiPiecePosition location)
        {
            int number = 0;

            number += MostRemoteChangedpiece(location, 1, 0).X - location.X;
            number += MostRemoteChangedpiece(location, 1, -1).X - location.X;
            number += location.Y - MostRemoteChangedpiece(location, 0, -1).Y;
            number += location.Y - MostRemoteChangedpiece(location, -1, -1).Y;
            number += location.X - MostRemoteChangedpiece(location, -1, 0).X;
            number += MostRemoteChangedpiece(location, -1, 1).Y - location.Y;
            number += MostRemoteChangedpiece(location, 0, 1).Y - location.Y;
            number += MostRemoteChangedpiece(location, 1, 1).Y - location.Y;
            return(number);
        }
Exemple #17
0
 /// <summary>
 /// 判断是否可以在指定的点落子
 /// </summary>
 /// <param name="location">落子的坐标</param>
 /// <returns>如果可以在此处落子, 则返回 true.</returns>
 public bool IspieceEnabled(ReversiPiecePosition position)
 {
     try
     {
         foreach (ReversiBufferPosition rbp in reversiBuffer.AllBufferPositions)
         {
             if (position.Equals(rbp.Position))
             {
                 return(true);
             }
         }
     }
     catch
     {
     }
     return(false);
 }
        /// <summary>
        /// 判断下子后是否丢角
        /// </summary>
        /// <param name="position">棋子的位置</param>
        /// <returns>布尔值</returns>
        private bool CornerLost(ReversiPiecePosition position)
        {
            reversiGame.SetPieceMoveArgs(position, MovePieceConfirmed, MovePieceCompleted);
            reversiGame.PieceMoves();
            List <ReversiPiecePosition> tmp = reversiGame.GetEnabledPositions();

            foreach (ReversiPiecePosition p in tmp)
            {
                if (IsCorner(p))
                {
                    reversiGame.RegretPieceMove();
                    return(true);
                }
            }
            reversiGame.RegretPieceMove();
            return(false);
        }
        /// <summary>
        /// 判断下A位棋子是否合适
        /// </summary>
        /// <param name="position">A位棋子</param>
        /// <returns>0表示立马丢角,1表示会被同边上C位翻转,2表示不被占角也不会被翻转</returns>
        private byte ConsiderA(ReversiPiecePosition position)
        {
            if (IsInEdgeOrCorner(position) != 3)
            {
                throw new Exception("调用ConsiderA方法时,使用非A位的参数");
            }
            TryMoveOne(position);
            List <ReversiPiecePosition> tmp1       = reversiGame.GetEnabledPositions();
            ReversiPiecePosition        tmpC1      = CNearA(position); //其同边上附近的C位
            ReversiPiecePosition        tmpCorner1 = CornerNearC(tmpC1);
            ReversiPiecePosition        tmpCorner2 = RemoteSameEdgeCornerOfC(tmpC1);

            for (int i = 0; i < tmp1.Count; i++)
            {
                //判断是否丢失同边上的角
                if ((tmp1[i].X == tmpCorner1.X && tmp1[i].Y == tmpCorner1.Y) ||
                    (tmp1[i].X == tmpCorner2.X && tmp1[i].Y == tmpCorner2.Y))
                {
                    RegretOne();
                    return(0);
                }
            }
            //判断是否会被其同边上的C位翻转
            ReversiPiecePosition        tmpC2 = SameEdgeCOfC(tmpC1); //其同边上的另一个C位
            List <ReversiPiecePosition> tmp2  = reversiGame.GetEnabledPositions();

            for (int i = 0; i < tmp2.Count; i++)
            {
                if ((tmp2[i].X == tmpC1.X && tmp2[i].Y == tmpC1.Y) ||
                    (tmp2[i].X == tmpC2.X && tmp2[i].Y == tmpC2.Y))
                {
                    TryMoveOne(tmp2[i]);
                    if (reversiGame.CurrentBoard[position.X, position.Y] != this.AIColor)
                    {
                        RegretOne();
                        RegretOne();
                        return(1);
                    }
                    RegretOne();
                }
            }

            RegretOne();
            return(2);
        }
 /// <summary>
 /// 判断是否在边角上
 /// </summary>
 /// <param name="position"></param>
 /// <returns>0代表不在,1代表角,2代表c,3代表a,4代表b</returns>
 private byte IsInEdgeOrCorner(ReversiPiecePosition position)
 {
     if ((position.X == 0 || position.X == 7) && position.Y > -1 && position.Y < 8)
     {
         int tmp = position.X + position.Y;
         if (tmp == 0 || tmp == 14 || tmp == 7)
         {
             return(1);
         }
         else if (tmp == 1 || tmp == 6 || tmp == 8 || tmp == 13)
         {
             return(2);
         }
         else if (tmp == 2 || tmp == 5 || tmp == 9 || tmp == 12)
         {
             return(3);
         }
         else
         {
             return(4);
         }
     }
     else if ((position.Y == 0 || position.Y == 7) && position.X > -1 && position.X < 8)
     {
         int tmp = position.X + position.Y;
         if (tmp == 0 || tmp == 14 || tmp == 7)
         {
             return(1);
         }
         else if (tmp == 1 || tmp == 6 || tmp == 8 || tmp == 13)
         {
             return(2);
         }
         else if (tmp == 2 || tmp == 5 || tmp == 9 || tmp == 12)
         {
             return(3);
         }
         else
         {
             return(4);
         }
     }
     return(0);
 }
        /// <summary>
        /// 找出c位附近的A位
        /// </summary>
        /// <param name="positon">c位的位置</param>
        /// <returns></returns>
        private ReversiPiecePosition CNearA(ReversiPiecePosition positon)
        {
            ReversiPiecePosition result = new ReversiPiecePosition();

            if (positon.X == 2 && positon.Y == 0)
            {
                return(new ReversiPiecePosition(1, 0));
            }
            else if (positon.X == 0 && positon.Y == 2)
            {
                return(new ReversiPiecePosition(0, 1));
            }
            else if (positon.X == 5 && positon.Y == 0)
            {
                return(new ReversiPiecePosition(6, 0));
            }
            else if (positon.X == 0 && positon.Y == 5)
            {
                return(new ReversiPiecePosition(0, 6));
            }
            else if (positon.X == 2 && positon.Y == 7)
            {
                return(new ReversiPiecePosition(1, 7));
            }
            else if (positon.X == 7 && positon.Y == 2)
            {
                return(new ReversiPiecePosition(7, 1));
            }
            else if (positon.X == 7 && positon.Y == 5)
            {
                return(new ReversiPiecePosition(7, 6));
            }
            else if (positon.X == 5 && positon.Y == 7)
            {
                return(new ReversiPiecePosition(6, 7));
            }
            else
            {
                return(null);
            }
        }
 private ReversiPiecePosition ANearC(ReversiPiecePosition p)
 {
     if (p.X == 1 && p.Y == 0)
     {
         return(new ReversiPiecePosition(2, 0));
     }
     else if (p.X == 6 && p.Y == 0)
     {
         return(new ReversiPiecePosition(5, 0));
     }
     else if (p.X == 0 && p.Y == 1)
     {
         return(new ReversiPiecePosition(0, 2));
     }
     else if (p.X == 0 && p.Y == 6)
     {
         return(new ReversiPiecePosition(0, 5));
     }
     else if (p.X == 1 && p.Y == 7)
     {
         return(new ReversiPiecePosition(2, 7));
     }
     else if (p.X == 6 && p.Y == 7)
     {
         return(new ReversiPiecePosition(5, 7));
     }
     else if (p.X == 7 && p.Y == 1)
     {
         return(new ReversiPiecePosition(7, 2));
     }
     else if (p.X == 7 && p.Y == 6)
     {
         return(new ReversiPiecePosition(7, 5));
     }
     else
     {
         return(null);
     }
 }
 /// <summary>
 /// 找出C位位置的同边C位位置
 /// </summary>
 /// <param name="p">C位位置 </param>
 /// <returns>同边C位位置</returns>
 private ReversiPiecePosition SameEdgeCOfC(ReversiPiecePosition p)
 {
     if (p.X == 1 && p.Y == 0)
     {
         return(new ReversiPiecePosition(6, 0));
     }
     else if (p.X == 6 && p.Y == 0)
     {
         return(new ReversiPiecePosition(1, 0));
     }
     else if (p.X == 0 && p.Y == 1)
     {
         return(new ReversiPiecePosition(0, 6));
     }
     else if (p.X == 0 && p.Y == 6)
     {
         return(new ReversiPiecePosition(0, 1));
     }
     else if (p.X == 1 && p.Y == 7)
     {
         return(new ReversiPiecePosition(6, 7));
     }
     else if (p.X == 6 && p.Y == 7)
     {
         return(new ReversiPiecePosition(1, 7));
     }
     else if (p.X == 7 && p.Y == 1)
     {
         return(new ReversiPiecePosition(7, 6));
     }
     else if (p.X == 7 && p.Y == 6)
     {
         return(new ReversiPiecePosition(7, 1));
     }
     else
     {
         return(null);
     }
 }
 /// <summary>
 /// 找出C位棋子同边上非附近的角位棋子
 /// </summary>
 /// <param name="p">C位棋子的位置</param>
 /// <returns>传入非C位则返回空</returns>
 private ReversiPiecePosition RemoteSameEdgeCornerOfC(ReversiPiecePosition p)
 {
     if (p.X == 1 && p.Y == 0)
     {
         return(new ReversiPiecePosition(7, 0));
     }
     else if (p.X == 6 && p.Y == 0)
     {
         return(new ReversiPiecePosition(0, 0));
     }
     else if (p.X == 0 && p.Y == 1)
     {
         return(new ReversiPiecePosition(0, 7));
     }
     else if (p.X == 0 && p.Y == 6)
     {
         return(new ReversiPiecePosition(0, 0));
     }
     else if (p.X == 1 && p.Y == 7)
     {
         return(new ReversiPiecePosition(7, 7));
     }
     else if (p.X == 6 && p.Y == 7)
     {
         return(new ReversiPiecePosition(0, 7));
     }
     else if (p.X == 7 && p.Y == 1)
     {
         return(new ReversiPiecePosition(7, 7));
     }
     else if (p.X == 7 && p.Y == 6)
     {
         return(new ReversiPiecePosition(7, 0));
     }
     else
     {
         return(null);
     }
 }
 /// <summary>
 /// 找出C位棋子附近的角位棋子
 /// </summary>
 /// <param name="p">C位棋子的位置</param>
 /// <returns>传入非C位则返回空</returns>
 private ReversiPiecePosition CornerNearC(ReversiPiecePosition p)
 {
     if (p.X == 1 && p.Y == 0)
     {
         return(new ReversiPiecePosition(0, 0));
     }
     else if (p.X == 6 && p.Y == 0)
     {
         return(new ReversiPiecePosition(7, 0));
     }
     else if (p.X == 0 && p.Y == 1)
     {
         return(new ReversiPiecePosition(0, 0));
     }
     else if (p.X == 0 && p.Y == 6)
     {
         return(new ReversiPiecePosition(0, 7));
     }
     else if (p.X == 1 && p.Y == 7)
     {
         return(new ReversiPiecePosition(0, 7));
     }
     else if (p.X == 6 && p.Y == 7)
     {
         return(new ReversiPiecePosition(7, 7));
     }
     else if (p.X == 7 && p.Y == 1)
     {
         return(new ReversiPiecePosition(7, 0));
     }
     else if (p.X == 7 && p.Y == 6)
     {
         return(new ReversiPiecePosition(7, 7));
     }
     else
     {
         return(null);
     }
 }
 /// <summary>
 /// 找出B位棋子附近的A位棋子
 /// </summary>
 /// <param name="p">B位棋子的位置</param>
 /// <returns>传入非B位则返回空</returns>
 private ReversiPiecePosition CNearA(ReversiPiecePosition p)
 {
     if (p.X == 2 && p.Y == 0)
     {
         return(new ReversiPiecePosition(1, 0));
     }
     else if (p.X == 5 && p.Y == 0)
     {
         return(new ReversiPiecePosition(6, 0));
     }
     else if (p.X == 0 && p.Y == 2)
     {
         return(new ReversiPiecePosition(0, 1));
     }
     else if (p.X == 0 && p.Y == 5)
     {
         return(new ReversiPiecePosition(0, 6));
     }
     else if (p.X == 2 && p.Y == 7)
     {
         return(new ReversiPiecePosition(1, 7));
     }
     else if (p.X == 5 && p.Y == 7)
     {
         return(new ReversiPiecePosition(6, 7));
     }
     else if (p.X == 7 && p.Y == 2)
     {
         return(new ReversiPiecePosition(7, 1));
     }
     else if (p.X == 7 && p.Y == 5)
     {
         return(new ReversiPiecePosition(7, 6));
     }
     else
     {
         return(null);
     }
 }
 /// <summary>
 /// 判断棋子是否在x位
 /// </summary>
 /// <param name="position">棋子位置</param>
 /// <returns>0表示否, 1表示1,1 2表示6,1 3表示1,6 4表示6,6</returns>
 private byte IsX(ReversiPiecePosition position)
 {
     if (position.X == 1 && position.Y == 1)
     {
         return(1);
     }
     else if (position.X == 6 && position.Y == 6)
     {
         return(4);
     }
     else if (position.X == 1 && position.Y == 6)
     {
         return(3);
     }
     else if (position.X == 6 && position.Y == 1)
     {
         return(2);
     }
     else
     {
         return(0);
     }
 }
 /// <summary>
 /// 判读棋子是否在倒数第三圈,如果在并且判断其是否在角
 /// </summary>
 /// <param name="position">棋子的位置</param>
 /// <returns>0代表不在,1代表在角,2代表在a1,3代表在边</returns>
 private byte IsInThirdRect(ReversiPiecePosition position)
 {
     if ((position.X == 1 || position.X == 6) && position.Y > 0 && position.Y < 7)
     {
         int tmp = position.X + position.Y;
         if (tmp == 2 || tmp == 7 || tmp == 12)
         {
             return(1);
         }
         else if (tmp == 3 || tmp == 6 || tmp == 8 || tmp == 11)
         {
             return(2);
         }
         else
         {
             return(3);
         }
     }
     else if ((position.Y == 1 || position.Y == 6) && position.X > 0 && position.X < 7)
     {
         int tmp = position.X + position.Y;
         if (tmp == 2 || tmp == 7 || tmp == 12)
         {
             return(1);
         }
         else if (tmp == 3 || tmp == 6 || tmp == 8 || tmp == 11)
         {
             return(2);
         }
         else
         {
             return(3);
         }
     }
     return(0);
 }
        /// <summary>
        /// 判断下A是否合适,禁止传入A位
        /// </summary>
        /// <param name="position">棋子的位置</param>
        /// <returns>0表示合适,1表示会被占角,2表示会丢A附近的C,3表示会丢A附近的C</returns>
        private byte IsAOK(ReversiPiecePosition position)
        {
            bool cornerLost           = false;
            bool cLost                = false;
            ReversiPiecePosition tmpC = CNearA(position);

            reversiGame.SetPieceMoveArgs(position, MovePieceConfirmed, MovePieceCompleted);
            reversiGame.PieceMoves();
            List <ReversiPiecePosition> tmp = reversiGame.GetEnabledPositions();

            foreach (ReversiPiecePosition p in tmp)
            {
                if (IsCorner(p))
                {
                    cornerLost = true;
                }
                if (tmpC.X == p.X && tmpC.Y == p.Y)
                {
                    cLost = true;
                }
            }
            reversiGame.RegretPieceMove();
            if (cornerLost && (!cLost))
            {
                return(1);
            }
            else if ((!cornerLost) && cLost)
            {
                return(2);
            }
            else if (cornerLost && cLost)
            {
                return(3);
            }
            return(0);
        }
 private void MovePieceConfirmed(bool confirmed, ReversiPiece piece, ReversiPiecePosition position, List <ReversiPiecePosition> positions)
 {
 }