Задание: Программист игр. Написать игру с использованием Windows Forms (Дистанционная работа)
Разработать интерактивную программу с использованием Windows Forms. Все задания требуют разработать поддержку игры человек – человек (разработка алгоритмов для игры человек – компьютер не требуется). Общие требования к программам:
• на экране должны отображаться сведения о том, чей сейчас ход;
• любые действия пользователя должны вызывать разумный отклик программы (например, при попытке выбрать мышью невыбираемый объект на экране можно выдать звуковой сигнал);
• программа не должна допускать ходы, не соответствующие правилам игры;
• программа должна отслеживать основные события в игре (как минимум выигрыш и проигрыш);
• программа не должна использовать никакие сторонние библиотеки, не входящие в состав стандартной установки Windows (например, OpenGL32.dll использовать можно, а библиотеку GLAUX или QT нельзя).
РЕКОМЕНДАЦИИ ПО ИСПОЛЬЗОВАНИЮ ГРАФИКИ В WINDOWS FORMS
Начиная с VisualStudio 2010, разработчики убрали возможность создания проектов Windows Forms на языке С++. В принципе, это разумное решение, поскольку реально под Windows Forms требовалось писать на специальном диалекте языка, Managed C++, который достаточно сильно отличается от классического С++. Создание же проектов Windows Forms на языке C# неудобно только тем, что подключение модулей на языке С++ выполнить не очень просто, а стандартной библиотеки работы с графикой OpenGL или DirectX на языке C# нет. Конечно, сторонние обертки для вызова функций OpenGL или DirectX на C# найти в Интернете можно, но, наверное, гораздо полезнее научиться делать их самому. Для связи С++ и C# используется создание на С++ динамически загружаемой библиотеки (dll). К сожалению, простой механизм вызова из библиотеки функций-членов классов отсутствует, поэтому вызов произво-дится только через статические функции. Для того чтобы функция была доступна для вызова из динамической библиотеки, она должна иметь опи-сание extern "C" __declspec(dllexport), например:
extern "C" __declspec(dllexport) void MyFunction(int arg1);
На языке C# для описания этой функции из динамически загружаемой библиотеки используется следующая конструкция:
[DllImport("file.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "MyFunction")] public static extern void MyFunction(int param);
где file.dll – имя файла динамически загружаемой библиотеки, ключ EntryPoint указывает имя функции из этой библиотеки, а описание функ-ции на C# должно перечислять параметры тех же типов и в том же порядке, что и в функции на С++. При этом допускается использование только скалярных типов, имеющих однозначное соответствие в языках (int, double).
Для передачи строк нужно использовать уже более сложную конструкцию, например, принимающая строку функция на С++ описывается extern "C" __declspec(dllexport) void MyFunction(wchar_t*txt);
а вызывающая её функция на C#:
[DllImport("file.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "MyFunction")] public static extern void MyFunction ([MarshalAs(UnmanagedType.LPWStr)]string text);