Exemple #1
0
        /// <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;
            }
        }