Опубликован: 23.04.2013 | Доступ: свободный | Студентов: 856 / 185 | Длительность: 12:54:00
Лекция 10:

Программные проекты на C#

Игра 15. Описание Решения Game15

Данное решение содержит всего один проект – WindowsFormsGame15. Это большой проект, который упоминался, но не рассматривался в учебном курсе. Он является хорошей иллюстрацией всех положений, рассмотренных в последней лекции учебника, посвященной описанию взаимодействия двух процессов – управляющего и управляемого. Управляющий процесс реализуется интерфейсным классом, а управляемый процесс отдельным классом. Оба процесса работают в разных потоках. Управляемый процесс в ходе работы выводит значения наблюдаемых параметров в соответствующие элементы интерфейса. Пользователь, управляющий процессом, задает управляющие воздействия, влияющие на ход управляемого процесса.

В главе 8 подробно описаны два способа организации взаимодействия таких процессов – взаимодействие, основанное на взаимных ссылках, и взаимодействие, основанное на обмене событиями. Оба способа взаимодействия иллюстрировались специальными учебными проектами. Данное решение рассматривает более интересный проект, обладающий чертами настоящего полноценного приложения.

Проект представляет реализацию известной игры в 15, где требуется упорядочить случайную перестановку из 15 элементов на поле из 4 * 4 клеток.

Помимо решения основной задачи - организации взаимодействия двух процессов, работающих в разных потоках, проект демонстрирует:

  • создание интерфейса с программным формированием элементов игрового поля;
  • создание меню;
  • генерирование случайных перестановок;
  • работу с файлами, позволяя сохранять перестановку в файле и получать перестановку из файла;
  • реализацию алгоритма игры компьютером;
  • многое другое.

Остановимся более подробно на организации взаимодействия двух процессов. Управляемый процесс, реализуемый классом Game15, в качестве наблюдаемых параметров выводит информацию о каждом сделанном компьютером ходе, и о числе упорядоченных элементов. Информация о сделанных компьютером ходах отображается в текстовом виде, в элементе управления ProgressBar и графически в игровом поле.

Какие действия, используя интерфейс проекта, может выполнять пользователь? Он может выбрать файл с заранее подготовленной конфигурацией исходной перестановки, получить новую случайную перестановку, может сохранить перестановку в файле. В ходе игры он может менять скорость визуального показа ходов, сделанных компьютером, он может остановить процесс игры, проанализировать запись ходов игры и при желании продолжить игру. Наконец он может заменить компьютер и сам выступить в роли игрока, соревнуясь с компьютером, стараясь для фиксированной перестановки упорядочить ее за меньшее число ходов, чем это делает компьютер.

Следует заметить, что обыграть компьютер в этом смысле не так уж трудно. Алгоритм, который я написал, близок к тому, как играет рядовой игрок. Он корректно работает, но не оптимизирован.

В интернете можно найти описание различных алгоритмов этой игры, более эффективных по числу ходов, требуемых для упорядочивания.

У программистов есть все возможности улучшения данного проекта. Конечно, наиболее интересно написание версии этого проекта, где взаимодействие основано на обмене событиями.

В данной версии взаимодействие основано на взаимных ссылках. Интерфейсный класс содержит ссылку и создает объект класса Game15. В интерфейсном классе создается дочерний поток, начинающий выполнять метод класса Game15, инициирующий игру. Класс Game15, в свою очередь, содержит ссылку на интерфейсный класс, что позволяет ему выводить наблюдаемый параметры в элементы интерфейса, используя безопасный метод Invoke для работы с элементами управления, представляющими общие ресурсы.

При организации взаимодействия, основанного на ссылках, как интерфейсный класс, так и управляемый класс должны быть классами одного проекта. Класс Game15 нельзя поместить в DLL, поскольку при работе в Dot Net, в частности при создании приложений на C#, запрещается создавать проекты, связанные циклическими ссылками ( проект А не может ссылаться на проект В, ссылающийся на проект А, что имело бы место в нашем случае, если класс Game15 поместить в другой проект - динамическую библиотеку классов).

В заключение приведу снимок экрана в процессе игры 15:

Прерывание пользователем процесса игры 15

Рис. 9.16. Прерывание пользователем процесса игры 15

Примеры проектов Вы можете скачать здесь.

Алексей Рыжков
Алексей Рыжков

не хватает одного параметра:

static void Main(string[] args)
        {
            x = new int[n];
            Print(Sample1,"original");
            Print(Sample1P, "paralel");
            Console.Read();
        }

Никита Белов
Никита Белов

Выставил оценки курса и заданий, начал писать замечания. После нажатия кнопки "Enter" окно отзыва пропало, открыть его снова не могу. Кнопка "Удалить комментарий" в разделе "Мнения" не работает. Как мне отредактировать недописанный отзыв?