// выбрать целевые ходы void Select(TRuns Runs) { int NeedDisk = Hanoi.Stalk[2].ForNeed(); // проверить нет ли необходимого диска // если есть необходимый диск, то ищем его if (NeedDisk > -1) { int[] forrun = new int[2]; // создем новй ход forrun[0] = -1; // показатель, что хода нет forrun[1] = 2; // проверяем нет ли необходимого диска на 0 штыре if (Hanoi.Stalk[0].GetTop() == NeedDisk) { forrun[0] = 0; } // проверяем нет ли необходимого диска на 1 штыре if (Hanoi.Stalk[1].GetTop() == NeedDisk) { forrun[0] = 1; } // если был найден нужный диск, то делаем ход if (forrun[0] != -1) { Runs.arr.Clear(); // очищяем возможные ходы Runs.Add(forrun); // добавляем только один необходимый ход return; } } // проверяем, нет ли среди возможных ходов, которые будут шагом назад for (int i = 0; i < Runs.Count; i++) { int[] run = (Runs[i]); if (run[0] == 2) { if ((Hanoi.Stalk[2].Disks[0] == 3) && (Hanoi.Stalk[2].Disks[1] != 1)) { Runs.arr.RemoveAt(i); i--; } } } }
// найти допустимые ходы public TRuns GetMove() { TRuns Runs = new TRuns(); int[] res = new int[2]; ArrayList arr = new ArrayList(); Random rnd = new Random(); res = new int[2]; res[0] = 0; res[1] = 1; if (Can(res[0], res[1])) { arr.Add(res); } res = new int[2]; res[0] = 0; res[1] = 2; if (Can(res[0], res[1])) { arr.Add(res); } res = new int[2]; res[0] = 1; res[1] = 0; if (Can(res[0], res[1])) { arr.Add(res); } res = new int[2]; res[0] = 1; res[1] = 2; if (Can(res[0], res[1])) { arr.Add(res); } res = new int[2]; res[0] = 2; res[1] = 0; if (Can(res[0], res[1])) { arr.Add(res); } res = new int[2]; res[0] = 2; res[1] = 1; if (Can(res[0], res[1])) { arr.Add(res); } while (arr.Count > 0) { int k = rnd.Next(arr.Count); Runs.Add((int[])arr[k]); arr.RemoveAt(k); } return(Runs); }