Меню Рубрики

Windows forms c игра

Учебник 3. Создание игры «Подбери пару!» Tutorial 3: Create a matching game

В этом учебном руководстве вы создадите игру «Подбери пару!», в которой игрок должен подобрать пару скрытым значкам. In this tutorial, you build a matching game, where the player must match pairs of hidden icons.

В этом учебнике приведены примеры как на C#, так и на Visual Basic, поэтому обращайте внимание на информацию, которая относится к используемому вами языку программирования. This tutorial covers both C# and Visual Basic, so focus on the information that’s specific to the programming language that you’re using.

В этом учебнике выполняются перечисленные ниже задачи. This tutorial walks you through the following tasks:

сохранять объекты, например значки, в объекте List ; Store objects, such as icons, in a List object.

использовать цикл foreach в C# или цикл For Each в Visual Basic для перебора элементов в списке; Use a foreach loop in C# or a For Each loop in Visual Basic to iterate through items in a list.

отслеживать состояние формы с помощью ссылочных переменных; Keep track of a form’s state by using reference variables.

создавать обработчик событий, который можно использовать для нескольких объектов; Build an event handler to respond to events that you can use with multiple objects.

создавать таймер, который отсчитывает время и вызывает событие ровно один раз после запуска. Make a timer that counts down and then fires an event exactly once after being started.

По завершении приложение должно выглядеть следующим образом. When you finish, your app should look similar to the following image:

Ссылки на руководства Tutorial links

Заголовок Title Описание Description
Шаг 1. Создание проекта и добавление таблицы в форму Step 1: Create a project and add a table to your form Начните с создания проекта и добавления элемента управления TableLayoutPanel , чтобы все элементы управления были правильно выровнены. Begin by creating the project and adding a TableLayoutPanel control to keep the controls aligned properly.
Шаг 2. Добавление случайного объекта и списка значков Step 2: Add a random object and a list of icons Добавление объектов Random и List для создания списка значков. Add a Random object and a List object, to create a list of icons.
Шаг 3. Назначение каждому элементу управления Label случайного значка Step 3: Assign a random icon to each label Случайным образом назначьте значки элементам управления Label , чтобы каждая игра отличалась от остальных. Assign the icons randomly to the Label controls, so that each game is different.
Шаг 4. Добавление обработчика событий Click к каждому элементу управления Label Step 4: Add a click event handler to each label Добавление обработчика события Click , изменяющего цвет метки, которую щелкнули. Add a Click event handler that changes the color of the label that is clicked.
Шаг 5. Добавление ссылок на элементы управления Label Step 5: Add label references Добавление ссылочных переменных для отслеживания меток, которые щелкнули. Add reference variables to keep track of which labels are clicked.
Шаг 6. Добавление таймера Step 6: Add a timer Добавьте таймер в форму, чтобы отслеживать время, прошедшее с начала игры. Add a timer to the form to keep track of the time that has passed in the game.
Шаг 7. Отмена исчезновения пар значков Step 7: Keep pairs visible Отмена исчезновения пар значков, если выбрана одинаковая пара. Keep pairs of icons visible, if a matching pair is selected.
Шаг 8. Добавление метода для проверки того, выиграл ли игрок Step 8: Add a method to verify whether the player won Добавление метода CheckForWinner() для проверки, выиграл ли игрок. Add a CheckForWinner() method to verify whether the player won.
Шаг 9. Изучение других возможностей Step 9: Try other features Изучение других функций, таких как изменение значков и цветов, добавление сетки и добавление звуков. Try other features, such as changing icons and colors, adding a grid, and adding sounds. Увеличение игрового поля и изменение настроек таймера. Try making the board bigger and adjusting the timer.

Кроме того, вы можете найти отличные бесплатные учебные видеоматериалы. There are also great, free video learning resources available to you. Дополнительные сведения о программировании на языке C# см. в разделе Основы C#. Разработка для начинающих. To learn more about programming in C#, see C# fundamentals: Development for absolute beginners. Дополнительные сведения о программировании на Visual Basic см. в руководстве Основы Visual Basic. Разработка для начинающих. To learn more about programming in Visual Basic, see Visual Basic fundamentals: Development for absolute beginners.

Следующие шаги Next steps

Начните работу с руководством с шага 1: Создание проекта и добавление таблицы в форму . To begin the tutorial, start with Step 1: Create a project and add a table to your form.

Источник

Игра на WinForms + C# в 16 лет (2 часть)

Предыстория

Прошло довольно много времени с момента написания предыдущей статьи. Как и обещал я написал вторую часть. Хотелось бы сказать спасибо всем тем, кто давал советы в комментариях, из всех их я смог узнать что-то новое. Ну а для тех кому хочется сразу посмотреть проект вот ссылка на GitHub проекта.

Сразу хочется отметить, что всё, что было добавлено и изменено в этой версии делалось с очень
большим трудом, большим количеством ошибок. мой гугл наполнился большим количеством запросов начиная от особенностей реализации MVP, до асинхронных методов.

Обновления

  1. Добавлен свой собственный редактор карт(как в оригинале игры).
  2. Реализован эхолот.
  3. Добавлена возможность ловить на донку и на спиннинг.
  4. Добавлено много видов рыбы.
  5. Сильно улучшена производительность проекта.
  6. Исправлено большое количество багов.
  7. Так же значительное улучшение архитектуры приложения(точнее её появление).
  8. Добавлено сохранение профиля игрока.
  9. Реализованы трофеи.
  10. Добавлена смена дня и ночи.
  11. Добавлены путешествия.
  12. Реализован продуктовый магазин.
  13. Реализован патерн MVP.
  14. Реализована система событий в игре
  15. Реализована прикормка, с возможностью миксования ингредиентов
  16. Добавлена озвучка
  17. Добавлены анимации
  18. Реализован износ удилищ, в зависимости от размера рыбы и времени вываживания

Больше изменений добавлю в README файл проекта Git.

Как чужой код ввёл в заблуждение.

Мы видим на скриншоте редактор карт для рыбалки, а именно сетку глубины для каждой локации (Это элементы Label с FormBorderStyle = 0, для того, чтобы показать рамку). Кстати скриншот сделан с использованием моих собственных ножниц. В чём заключалась проблема?

Здесь мы берем координаты курсора, кастим их в PointToClient, и передаём в конструктор Rectangle, размеры указываем 1 и 1. Потом мы используем стандартный метод IntersectsWith проверяем, пересечение курсора, и label. Также, мы не можем просто обработать клик по label, так как форма с ними не показывается.
Также, это позволило реализовать поддержку 3-х удилищ для ловли.

Генерация рыбы

Итак, основная часть игры это генерация рыбы. Она происходит в несколько этапов:
1.При заходе на локацию мы из строки типа:
Карась Золотой:25 250-400 [Сыр, Червь, Опарыш, Кукуруза] Где содержится размер рыбы в процентах от максимального, глубина минимальная, глубина максимальная, и список наживок получаем объект рыбы(Не забыв предварительно проверив строку через регулярные выражения). Для красоты кода я определил оператор который кастит строку к рыбе.

В итоге такой подход позволяет нам написать:

Код приведен для примера и не встречается в проекте в подобном виде.

2.Теперь нам надо дождаться, когда удочки будут закинуты, после этого мы запускаем таймер (свой для каждой удочки) со случайным временем поклёвки, дальше по тику таймера из нашего списка рыб размеров 1000 единиц, выбираем рыб, глубина обитания которых включает в себя глубину удочки.

3. Из этого списка случайно выбираем рыбу. Проверяем может ли съесть установленную наживку, и также проверяем, чтобы время суток активности рыбы соответствовало текущему времени в игре.

4. Если рыба может съесть наживку, производим атаку на приманку. Вычисляем, будет ли сход и через какое время, основываясь на шансе схода установленного крючка. Если рыба не может съесть наживку, то циклом проходимся по текущей прикормке(если она есть). Проверяем, нет ли рядом рыбы, которая может клюнуть на наживку, и повторяем всё тоже самое.

Благодаря процессу генерации, я стал уверенным пользователем LINQ.

Сама игра

Скриншот продуктового магазина.

Его исходник можно посмотреть в репозитории. Там довольно интересно выполнены обработчики MouseEnter и MouseLeft для изменения изображений еды.

Скриншот формы для путешествий. (Все водоёмы являются тестовыми и их названия не являются подлинными.)

Скриншот игрового мира

Планы

  1. Сделать клиент-сервер для игры
  2. Junior FPGA(ПЛИС) Developer
  3. Распознавание лиц через Веб камеру(Ищу литературу, которая может быть полезна)
  4. Замена обычных ListView на ObjectListView

В конце предыдущей статьи, я писал, что хочу устроиться на работу. Ну что ж, в сентябре я закрыл своё первое ТЗ по SNMP, правда на языке C.

Вывод

Проект стал довольно большим, с хоть не идеальной, но очень достойной кодовой базой, удобной в сопровождении.Где-то могут нарушаться принципы SOLID, но это из-за того, что проект очень сильно затянулся. Также, если вы начинающий разработчик, и ищите проект, в котором можно поучаствовать, можете делать коммиты в данный репозиторий. Список ожидаемый изменений можно посмотреть в README файле проекта.

Также хочется отметить, что я не вижу перспектив в карьере C# разработчика, вернее мне бы хотелось чего-то более близкого к железу, поэтому пробую изучение более низкоуровневых языков.

Всем спасибо, кто прочитал до конца, любая критика исходного кода приветствуется и будет сразу рассмотрена.

Ой, у вас баннер убежал!

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Чему я научился у C#/.Net разработчиков на конференции Go#

На какую конференцию я как C#/.Net разработчик хотел бы пойти

C# .NET: Пять маленьких чудес, которые сделают ваш код лучше. Часть 1

Вакансии

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Комментарии 17

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

Ну и лэйбл очень маленький, и когда нажимаешь на ячейку «таблицы» там где нет текста обработчик не срабатывает

Но у вас ведь обработчик Click стоит именно на Label. И если он «не срабатывает» при клике мимо текста, то значит у вас и сейчас всё это не работает.

Наверное вы не поняли исходный вопрос. Событие Click возникает когда кликнули мышкой по Label-у. А это означает что курсор мышки находится внутри Label-а. Зачем ещё делать дополнительную проверку положения курсора?

Нажатие иногда происходит мимо лэйбла, и этот код вставлен и туда, чтобы определить его. Ну и конечно, его можно убрать с обработчика лэйбла. Спасибо))

Я думаю этот процесс можно было бы упростить. Вам не обязательно ставить клик на label, если важно именно отследить к какому label был ближе клик. Есть два способа — под label ставим глобальную panel, и ставим клик на неё, а после клика по координатам ищем самый близкий label. Если их генерация была в массиве и она имеет какой-то порядок, то искать можно не по всем, а только по области; способ два под каждый label ставим panel, так что бы он был прозрачен, т.е. виден он не будет и ставим на каждый из них один обработчик клик, в таком случае искать не придется, главное ставить их так, чтобы они были друг к другу вплотную. Нечто подобное применяется и в 2d-3d играх, т.к. отслеживать сложные формы дорого, поэтому простые контейнеры используются чаще всего.

Простите за банальный вопрос но почему Windows forms? Зачем над собой издеваться? Почему тот же unity не взяли?

Ну дело ваше. Главное чтобы было интересно, горящие глаза это ключевой фактор развития джуниора.
Но вы в самом начале пути, вам бы набрать опыта именно в программировании, архитектура, общие практики, мышление. Все это не особо зависит от инструмента. Специфика типа фишек winforms после этого набирается быстро. А вот если вы используете неудобные для задачи среды и инструменты вы становитесь ограничены в возможностях, и вынуждены обвешивать все это костылями или велосипедами, теряя время и фокус. Возможно я не прав, так как десктоп под винду совсем не моя область, и они в целом подходят под ваши задачи. Но если вы будете замечать что слишком много времени тратите чтобы подогнать неподходящий инструмент под задачу, что вместо удобной вам архитеруры и приёмов вы вынуждены придумывать костыли чтобы обойти недостатки инструмента — я бы советовал подумать над тем чтобы сменить инструмент. Это то что программисты делают, подбирают инструмент под задачу и используют его, а не наоборот. Благо счас достаточно инструментов чтобы извращаттся только в очень специфичных случаях и только если есть понимание что другие пути ещё хуже.

Ну и я бы не сказал что юнити прям отдельная область. Да есть специфика, да потребуется разобраться, но это всего лишь инструмент. Главное в нем все тот же код, на все том же с#, а все эти настройки, шаблоны и прочее упрощают жизнь позволяя не отвлекаться от бизнес логики. Я слышал что его счас даже в универах используют, для обучения. Этакая альтернатива делфи или js. Ну или чистому Net. В конце концов он создан для разработки игр, то есть оптимизирован под это.

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Windows forms c datagridview
  • Windows forms button click
  • Windows format fat32 windows 7
  • Windows form c учебник
  • Windows force gpupdate force