// сделать ход, если этот приводит к решению, то вернуть true public bool Run(bool Optimize, bool Target) { TRuns Runs = Hanoi.GetMove(); // вернуть допустимые ходы // если задан режим отбора целевых ходов if (Target) { Select(Runs); // выбрать целевые ходы } // если задан режим оптимизации ходов if (Optimize) { THanoi Test; // создаем класс для пробного состояния for (int i = 0; i < Runs.Count; i++) { Test = Hanoi.Copy(); // создать копию Test.Move((Runs[i])[0], (Runs[i])[1]); // делаем пробный ход // если получаемое состояние не было ранее if (!IsPrev(Test)) { Hanoi = Test.Copy(); // сохраняем тестовое состояние Hanoi.Draw(); // рисуем новые состояние Prev.Add(Hanoi.Copy()); // сохраняем получаемое состояние // проверяем нет ли выигрыша if (Hanoi.IsWin()) { return(true); } else { return(false); } } } } // если не было хода, то делаем случайный ход int k = rnd.Next(Runs.Count); // выбираем случайный ход Hanoi.Move((Runs[k])[0], (Runs[k])[1]); // сделать ход Hanoi.Draw(); // рисуем новую ситуацию // проверить нет ли выигрыша if (Hanoi.IsWin()) { return(true); } else { return(false); } }
Random rnd; // генератор случайных чисел // конструктор класса public TRun(int N, Canvas g) { Hanoi = new THanoi(N, g); // создать класс для игры Hanoi.Draw(); // нарисовать начальную ситуацию Prev = new THanois(); // создать массив для пре rnd = new Random(); // инициализировать генератор слуайных чисел }
// создать копию public THanoi Copy() { THanoi Res = new THanoi(N, g); Res.Stalk[0] = Stalk[0].Copy(); Res.Stalk[1] = Stalk[1].Copy(); Res.Stalk[2] = Stalk[2].Copy(); return(Res); }
// проверить, есть ли данная ситуация в сохраненных bool IsPrev(THanoi R) { for (int i = 0; i < Prev.Count; i++) { if (Prev[i].IsEqual(R)) { return(true); } } return(false); }
// проверить на равенство public bool IsEqual(THanoi Hanoi) { for (int i = 0; i < 3; i++) { if (!Hanoi.Stalk[i].IsEqual(Stalk[i])) { return(false); } } return(true); }
// добавить новый элемент public void Add(THanoi Hanoi) { arr.Add(Hanoi); }