не хватает одного параметра: static void Main(string[] args) |
Программные проекты на C#
Игра 15. Описание Решения Game15
Данное решение содержит всего один проект – WindowsFormsGame15. Это большой проект, который упоминался, но не рассматривался в учебном курсе. Он является хорошей иллюстрацией всех положений, рассмотренных в последней лекции учебника, посвященной описанию взаимодействия двух процессов – управляющего и управляемого. Управляющий процесс реализуется интерфейсным классом, а управляемый процесс отдельным классом. Оба процесса работают в разных потоках. Управляемый процесс в ходе работы выводит значения наблюдаемых параметров в соответствующие элементы интерфейса. Пользователь, управляющий процессом, задает управляющие воздействия, влияющие на ход управляемого процесса.
В главе 8 подробно описаны два способа организации взаимодействия таких процессов – взаимодействие, основанное на взаимных ссылках, и взаимодействие, основанное на обмене событиями. Оба способа взаимодействия иллюстрировались специальными учебными проектами. Данное решение рассматривает более интересный проект, обладающий чертами настоящего полноценного приложения.
Проект представляет реализацию известной игры в 15, где требуется упорядочить случайную перестановку из 15 элементов на поле из 4 * 4 клеток.
Помимо решения основной задачи - организации взаимодействия двух процессов, работающих в разных потоках, проект демонстрирует:
- создание интерфейса с программным формированием элементов игрового поля;
- создание меню;
- генерирование случайных перестановок;
- работу с файлами, позволяя сохранять перестановку в файле и получать перестановку из файла;
- реализацию алгоритма игры компьютером;
- многое другое.
Остановимся более подробно на организации взаимодействия двух процессов. Управляемый процесс, реализуемый классом Game15, в качестве наблюдаемых параметров выводит информацию о каждом сделанном компьютером ходе, и о числе упорядоченных элементов. Информация о сделанных компьютером ходах отображается в текстовом виде, в элементе управления ProgressBar и графически в игровом поле.
Какие действия, используя интерфейс проекта, может выполнять пользователь? Он может выбрать файл с заранее подготовленной конфигурацией исходной перестановки, получить новую случайную перестановку, может сохранить перестановку в файле. В ходе игры он может менять скорость визуального показа ходов, сделанных компьютером, он может остановить процесс игры, проанализировать запись ходов игры и при желании продолжить игру. Наконец он может заменить компьютер и сам выступить в роли игрока, соревнуясь с компьютером, стараясь для фиксированной перестановки упорядочить ее за меньшее число ходов, чем это делает компьютер.
Следует заметить, что обыграть компьютер в этом смысле не так уж трудно. Алгоритм, который я написал, близок к тому, как играет рядовой игрок. Он корректно работает, но не оптимизирован.
В интернете можно найти описание различных алгоритмов этой игры, более эффективных по числу ходов, требуемых для упорядочивания.
У программистов есть все возможности улучшения данного проекта. Конечно, наиболее интересно написание версии этого проекта, где взаимодействие основано на обмене событиями.
В данной версии взаимодействие основано на взаимных ссылках. Интерфейсный класс содержит ссылку и создает объект класса Game15. В интерфейсном классе создается дочерний поток, начинающий выполнять метод класса Game15, инициирующий игру. Класс Game15, в свою очередь, содержит ссылку на интерфейсный класс, что позволяет ему выводить наблюдаемый параметры в элементы интерфейса, используя безопасный метод Invoke для работы с элементами управления, представляющими общие ресурсы.
При организации взаимодействия, основанного на ссылках, как интерфейсный класс, так и управляемый класс должны быть классами одного проекта. Класс Game15 нельзя поместить в DLL, поскольку при работе в Dot Net, в частности при создании приложений на C#, запрещается создавать проекты, связанные циклическими ссылками ( проект А не может ссылаться на проект В, ссылающийся на проект А, что имело бы место в нашем случае, если класс Game15 поместить в другой проект - динамическую библиотеку классов).
В заключение приведу снимок экрана в процессе игры 15:
Примеры проектов Вы можете скачать здесь.