/// <summary> /// Функция обновления формы, тут же происходит анализ текущего этапа, и при необходимости переключение на следующий /// </summary> private void UpdateFormFields() { if (label7.InvokeRequired) { label7.Invoke(new MyUpdate(UpdateFormFields)); return; } ticksLabel.Text = "Тики : " + sw.Elapsed.ToString(); // Выводим в правую панель фрагменты изображений. Они должны содержать только цифры в чёрно-белом формате for (int r = 0; r < 4; ++r) { for (int c = 0; c < 4; ++c) { if (processor.arrayPics[r, c] != null) { pics[r, c].Image = processor.finalPics[r, c].ToManagedImage(); } } } // Если статус ожидание, то просто выходим - меняется он не тут if (currentState == Stage.Idle) { label7.Text = "Статус: ожидание"; return; } // Если происходит анализ позиции и поиск хода if (currentState == Stage.Thinking) { label7.Text = "Статус: поиск хода"; if (sage.workDone()) { if (processor.stopByErrors) { errorsLabel.Text = "Остановка!"; errorsLabel.ForeColor = Color.Red; if (RobotPlaying) { button2_Click(null, null); } currentState = Stage.Idle; return; } // Позиция обработана, ход найден currentState = Stage.Moving; string s = "Сдвиг : "; switch (sage.suggestedMove) { case 0: s = "Ничего не понял!"; break; case 1: s = " Вверх!"; break; case 2: s = " Вправо!"; break; case 3: s = " Вниз!"; break; case 4: s = " Влево!"; break; } label6.Text = s; // Если робот готов к работе, то делаем ход, иначе ничего не меняется - состояние остаётся таким же // это плохо, строго говоря - строчки эти постоянно переписывать в форму, ну да ладно if (RobotPlaying && rbt != null && rbt.Ready()) { score += sage.getScore(); scoreLabel.Text = "Счёт : " + score.ToString(); moves++; movesLabel.Text = "Ходы : " + moves.ToString(); errorsLabel.Text = "Ошибки : " + processor.errorCount.ToString(); processor.setExpectedState(sage.buffer); int speed = int.Parse(speedBox.Text); currentState = Stage.Moving; switch (sage.suggestedMove) { case 1: rbt.RotateLeft(LegoRobot.mtr.MotorA, speed); break; case 2: rbt.RotateLeft(LegoRobot.mtr.MotorB, speed); break; case 3: rbt.RotateRight(LegoRobot.mtr.MotorA, speed); break; case 4: rbt.RotateRight(LegoRobot.mtr.MotorB, speed); break; } } } return; } if (currentState == Stage.Moving) { label7.Text = "Статус: выполняю ход"; if (rbt.Ready()) { currentState = Stage.WaitingForFrame; } return; } }