/// <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); }