Exemplo n.º 1
0
        /// <summary>
        /// (x,y) に Mark をおいたときにひっくり返る座標のリストを返す。
        /// </summary>
        /// <returns>The when put.</returns>
        /// <param name="x">The x coordinate.</param>
        /// <param name="y">The y coordinate.</param>
        /// <param name="mark">Mark.</param>
        public List <Pos> ReverseWhenPut(int x, int y, ReversiMark mark)
        {
            List <Pos> poses = new List <Pos>();
            var        dx    = new int[] { -1, 0, 1, -1, 1, -1, 0, 1 };
            var        dy    = new int[] { -1, -1, -1, 0, 0, 1, 1, 1 };

            // 8近傍を探索
            for (int i = 0; i < dx.Length; i++)
            {
                if (!ReversiBoard.IsIn(x + dx [i], y + dy [i]))
                {
                    continue;
                }
                // 隣が反対の色であることが重要
                if ((int)this.At(x + dx [i], y + dy [i]) == -(int)mark)
                {
                    List <Pos> candidates = new List <Pos> ();
                    bool       flag       = false;         // その方向にひっくり返せるかのフラグ
                    for (int j = 1; true; j++)
                    {
                        var x2 = x + dx [i] * j;
                        var y2 = y + dy [i] * j;
                        if (!ReversiBoard.IsIn(x2, y2))
                        {
                            break;
                        }

                        if ((int)this.At(x2, y2) == -(int)mark)
                        {
                            candidates.Add(new Pos(x2, y2));
                        }
                        else if (this.At(x2, y2) == mark)
                        {
                            flag = true;
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                    if (flag)
                    {
                        poses.AddRange(candidates);
                    }
                }
            }
            return(poses);
        }
Exemplo n.º 2
0
 /// <summary>
 /// (x, y) に mark を置けるならtrueです
 /// </summary>
 /// <returns><c>true</c> if this instance is puttable at the specified x y mark; otherwise, <c>false</c>.</returns>
 /// <param name="x">The x coordinate.</param>
 /// <param name="y">The y coordinate.</param>
 /// <param name="mark">Mark.</param>
 public bool IsPuttableAt(int x, int y, ReversiMark mark)
 {
     if (!ReversiBoard.IsIn(x, y))
     {
         return(false);
     }
     if (this.At(x, y) != ReversiMark.EMPTY)
     {
         return(false);
     }
     if (this.ReverseWhenPut(x, y, mark).Count == 0)
     {
         return(false);
     }
     return(true);
 }