/// <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); } }
/// <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); }
/// <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); }
/// <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); }
public void SetMark(ReversiMark mark) { this.mark = mark; }
/// <summary> /// Count the specified mark. /// </summary> /// <param name="mark">Mark.</param> public int Count(ReversiMark mark) { return(this.board.Where(a => a == mark).Count()); }
/// <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; }