Example #1
0
        /// <summary>
        /// (x, y) に mark を置く
        /// </summary>
        /// <param name="x">The x coordinate.</param>
        /// <param name="y">The y coordinate.</param>
        /// <param name="mark">Mark.</param>
        public void PutAt(int x, int y, ReversiMark mark)
        {
            if (!this.IsPuttableAt(x, y, mark))
            {
                throw new ReversiException(string.Format("({0}, {1}) is not puttable for {2}", x, y, Enum.GetName(typeof(ReversiMark), mark)));
            }
            var rev = this.ReverseWhenPut(x, y, mark);

            this.Set(x, y, mark);
            foreach (Pos p in rev)
            {
                this.Set(p.X, p.Y, mark);
            }
        }
Example #2
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);
        }
Example #3
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);
 }
Example #4
0
        /// <summary>
        /// mark を置ける場所の一覧を返す
        /// </summary>
        /// <returns>The puttables.</returns>
        /// <param name="mark">Mark.</param>
        public List <Pos> ListupPuttables(ReversiMark mark)
        {
            List <Pos> poses = new List <Pos> ();

            for (int x = 0; x < size; x++)
            {
                for (int y = 0; y < size; y++)
                {
                    if (this.IsPuttableAt(x, y, mark))
                    {
                        poses.Add(new Pos(x, y));
                    }
                }
            }
            return(poses);
        }
Example #5
0
 public void SetMark(ReversiMark mark)
 {
     this.mark = mark;
 }
Example #6
0
 /// <summary>
 /// Count the specified mark.
 /// </summary>
 /// <param name="mark">Mark.</param>
 public int Count(ReversiMark mark)
 {
     return(this.board.Where(a => a == mark).Count());
 }
Example #7
0
 /// <summary>
 /// (x,y) を mark にする。ひっくり返すとかしません
 /// </summary>
 /// <param name="x">x座標( 0 <= x <= 7 )</param>
 /// <param name="y">y座標( 0 <= x <= 7 )</param>
 /// <param name="mark">Mark.</param>
 public void Set(int x, int y, ReversiMark mark)
 {
     ReversiBoard.AssertIsIn(x, y);
     this.board [size * y + x] = mark;
 }