public virtual bool PutPoint(Pos point, PlayerColor player) { if (point.X < 1 || point.X > Width || point.Y < 1 || point.Y > Height) { return(false); } if (!Points[point.X, point.Y].PuttingAllow()) { return(false); } // Добавляем новый список изменений поля. MainState.AddNewBase(); // Запоминаем захваченные точки и поля игроков. MainState.AddCaptureCount(CaptureCountRed, CaptureCountBlack); // Запоминаем игрока, чей ход сейчас должен быть. MainState.AddPlayer(CurPlayer); MainState.AddPosPoint(point, Points[point.X, point.Y]); Points[point.X, point.Y].Putted = true; Points[point.X, point.Y].Color = player; PointsSeq.Add(point); CheckClosure(point); return(true); }
public virtual void BackMove() { CaptureCountRed = MainState.States[MainState.States.Count - 1].CaptureCountsRed; CaptureCountBlack = MainState.States[MainState.States.Count - 1].CaptureCountsBlack; for (var i = MainState.States[MainState.States.Count - 1].PointPoses.Count - 1; i >= 0; i--) // Делаем отмену обязательно в обратном порядке, так как возможны дублирования позции (в частности, когда происходит окружение, точка, приведшая к окружению будет в изменениях 2 раза). // Стоит подумать над откатом поставленной точки отдельно. Но проблема - посталенная точка в свою пустую базу. { Points[MainState.States[MainState.States.Count - 1].PointPoses[i].Pos.X, MainState.States[MainState.States.Count - 1].PointPoses[i].Pos.Y] = MainState.States[MainState.States.Count - 1].PointPoses[i].Point; } CurPlayer = MainState.States[MainState.States.Count - 1].Player; MainState.DeleteLastState(); PointsSeq.RemoveAt(PointsCount - 1); }