как создать игровое поле в с
Как нарисовать игровое поле?
Это тема моей курсовой работы. Надо сделать на WindowsForms c#.
Очень сильно прошу помочь, может статья, видосик есть. Уроки, ещё что-то.
Надо делать с графикой и ИИ. Сам не понимаю даже как оно будет выглядеть приблизительно. На парах выучили только основы ООП. Кароч, помогите, а то паунс в окно.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как реализовать игровое поле, например, как в шашках?
Подскажите пожалуйста, с помощью чего или как можно создать игровое поле чем-то похожее на шашки.
Игровое поле для Lines или для шашек
Помогите пожалуйста с реализацией. Объясните, прошу, как мне нарисовать поле квадратов, по которым.
Как расчертить игровое поле в Swing?
Пишу банальную для новичков игру «крестики-нолики». В данном отрезке кода создается игровое поле.
ну, для начала создайте поле скажем 10х10, состоящее из серых прямоугольников, только не «вручную накидать», чтобы в конструкторе формировалось.
Если полезете создавать тему и для этого, то либо ищите добродеятеля что сделает все за вас (маловероятно что найдете), либо во фриланс (уже больше шансов, но зависит от цены).
Как сделать поле с «|», #, «-» и цифрами
Добавлено через 11 минут
Не могу в массиве сделать рамки. И можете подсказать второе поле сделано верно?
Добавлено через 2 часа 15 минут
ап!
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Для каждой строки найти слова, которые не имеют ни одного из букв: «l», «k», «r», «s» i «j»
Задано символьные строки. Строка состоит из нескольких слов (наборов символов), которые разделяются.
Реализовать классы «Воин», «Пехотинец», «Винтовка», «Матрос», «Кортик» (наследование)
Разработать программу с использованием наследования классов, реализующую классы: − воин;.
Из данной строки сделать новую строку, заменив в ней все слова: «один», «два», «три» и т.д на соответствующие цифры
Из данной строки сделать новую строку, заменив в ней все слова: «один», «два», «три» и т.д на.
Поясните?
Смысл такой что надо сделать два игровых поля.
Одним управляю я. Как это написано в коде.
Другим управляет искусственный интелект. Сейчас на данной стадии я не могу понять как сделать два игровых поля.
Книжку читаю, точнее сайт и вот там задание для меня не понятное, посмотрев на структуру кода я смогу разобраться в дальнейшем его использовании
Добавлено через 2 минуты
Вот так надо или как? Я честно не могу на данный момент разобраться
В общем два массива и должны быть границы массива обозначены |,-, а по углам #.
И если что можете объяснить как сделать рядом еще массив.
Добавлено через 7 минут
В общем смысл такой, пока я учусь и у меня символ Т передвигается по области заданного массива с ограничениями. Вот и нужны границы этого массива сделать символами. Так же надо сделать второй справа массив для компьютера аналогичный дизайну этого
Как я понял вы взяли пример из сайта Шаталов.ру (или както там. )
Там создавали игру «Морской бой»
Так вот я понимаю хотите, воссоздать этот пример, (или следуя инструкции сделать свой).
Что вам сообщу, примеры преведенные на этом сайте хорошие, но есть одно но консоль (незнаю почему) выдает странности даже откомпилировав готовый пример этой программы.
Вывод:
Консоль не предназначенна для постоянных и частых обновлений, и вывода так сказать таблиц, которыми так манипулируют.
Выше мнение, имхо, но приведу доводы:
1)Даже сделав простой каркас танчиков.(просто вырисовка поля и «хождения» танка по нему, будут появляться баги консоли)(в приложении выложил)
2) я заметил, что консоль умеет копировать текст в конце столбцов.
Короче, я лично не сталбороться с этой фигней и стану учить directX или OpenGl, всеравно смысл построения игры одинаков.
Добавлено через 2 минуты
Если хотите убедиться в этом, то попробуйте просто сделать пустое поле.
Карта 10х10.
«игрок» =’X’;
Отслеживать стрелки вниз и вверх.
при нажатии таковых менять расположение «игрока» вниз и верх
После этого вы увидите, что справа в консоле будет копироваться наш игрок!
Создание игры «Сапер» на С++/SFML
Обновл. 22 Фев 2021 |
Игра «Сапер» (англ. «Minesweeper») — это простая, но в то же время очень интересная игра-головоломка. В начале игры открывается поле, разделенное на ровные клетки, на котором спрятаны мины. Когда игрок кликает мышкой по произвольной клетке на поле, то в этой клетке появляется цифра, показывающая сколько мин спрятано по соседству. Анализируя эти цифры, можно понять, где спрятаны следующие мины. Затем на клетке (в которой игрок предполагает, что спрятана мина) ставится флажок для наглядного обозначения мины.
Таким образом, задача игрока — найти все мины, спрятанные на игровом поле, и при этом постараться не подорваться на них. А наша задача — разработать игру «Сапер» средствами графической библиотеки SFML и языка программирования С++.
Модель игрового поля
Начнем с графики. Для обозначения элементов игрового поля нам потребуются картинки закрытой клетки, открытой пустой клетки, флажка, мины и цифр от 1 до 8. Т.к. отдельными изображениями пользоваться не очень удобно, то будет лучше, если мы соединим их все в единую текстуру, а уже из нее по мере необходимости вырежем нужный элемент:
Размеры одного квадратного элемента текстуры составляют 32×32 пикселя. Размеры игрового поля — 10×10 квадратов.
Теперь перейдем непосредственно к написанию кода. Как вы уже наверняка знаете, минимальный каркас SFML-приложения имеет примерно следующий вид:
int gridLogic[12][12] — представляет логическую часть игрового поля;
int gridView[12][12] — отображает графическую составляющую игрового поля.
В коде это выглядит следующим образом:
Далее нужно создать спрайт из заготовленной текстуры и сформировать первоначальный вид игрового поля. Для этого, мы всем элементам массива gridView[i][j] присваиваем значение ( 10 ) соответствующего порядкового номера квадратика текстуры:
Добавим функцию отрисовки игрового поля:
И в результате получим вот такую заготовку:
Примечание: Если у вас ничего не отображается, то попробуйте прописать полный путь до файла текстуры. Например, вместо:
Расстановка и подсчет мин
Дальше реализуем подсчет мин, окружающих каждую клетку. Для этого в двойном цикле for поочередно пройдемся по каждой клетке. Если в текущей клетке уже стоит мина, то просто переходим к новому шагу итерации. Если же в текущей клетке мины нет, то с помощью девяти условий if поочередно проверяем все примыкающие к ней клетки. Если там есть мины, то на каждом сработавшем if увеличиваем счетчик количества мин на 1 :
Результат выполнения программы:
Примечание: Учитывайте, что расстановка мин генерируется случайным образом. Поэтому ваш результат запуска программы наверняка будет отличаться от того, что изображено на вышеприведенной картинке.
Обработка нажатий кнопок мыши
Теперь добавим функции обработки нажатия левой клавиши мыши (далее — ЛКМ) и установки флажка по щелчку правой клавиши мыши (далее — ПКМ). Если по нажатию ЛКМ мы открыли клетку, а там находится мина, то следом открываем всё поле — игра окончена:
Настало время запустить приложение «Сапер» и посмотреть на готовый игровой процесс:
Заключение
Вот такое небольшое и довольно-таки простое приложение можно написать, используя C++ и SFML. Конечно, наша игра далека от идеала и не лишена недостатков. Например, алгоритм игры не исключает ситуации, когда игрок может проиграть уже на первом ходу. Также отсутствуют такие элементы игрового процесса, как: таймер обратного отсчета, кнопки перезапуска и паузы игры, подсчет уже отмеченных игроком мин и т.д. Возможно, мы рассмотрим реализацию подобных механизмов в следующих статьях, но ничего не мешает и вам самим попробовать добавить данный функционал. Как говорится, дорога в тысячу миль начинается с первого шага. Этот первый шаг мы сделали вместе, а дальше — дело за вами.
Примечание: Статья написана по мотивам одноименного видеоролика за авторством FamTrinli.
Поделиться в социальных сетях:
Часть №3: Создание игры «Тетрис» на С++/SFML
Комментариев: 4
Спасибо за урок! Сбылась мечта переписать эту игрушку. Получилось её немного добработать и прописать дополнительный функционал: окошко об окончании игры с количеством отмеченных мин, возможно снимать флажок по повторному нажатию на поле правой кнопкой и тд. Свой код прилагаю 🙂
https://pastebin.com/FmxbAW3i
Надеюсь на новые уроки по SFML и C++. Очень интересно и мотивирующе — сразу видно результат изучения языка на практике.
Спасибо, в детстве все мечтали сами переписать эти игры самому — мечта сбылась!
У меня есть вопрос: вот эта конструкция, которая гоняет главный игровой цикл приложения
вешает проц на 100%. Ну, 1 ядро, но будь ей доступны оба, повесила бы оба. Наверняка в реальных играх устроено иначе. Очень хотелось бы узнать как.
P.S. Немножко не получилось у меня, буду искать причину 🙂 вот так вышло https://skr.sh/s5wvsyM3KIH
По поводу загрузки уже примерно нашел:
Вторая ссылка вроде четче. Кратко: тоже используется while (true), но код большую часть времени «спит» и просыпается только тогда, когда возникает событие. Именно так работает стандартный Сапёр из Windows: загрузка проца держится на 0 и изредка подпрыгивает до 1%.
Используя эти идеи, сумел заварганить! Теперь проца кушает ровно 0 – event-driven подход в действии!
Кратко – просто заменил функцию pollEvent() на waitEvent() и немного переставил часть кода. Ф-я waitEvent() блокирует поток и ждет события — то, что нам в данном случае нужно. Также добавил: при взрыве все игровое поле открывается.
Жаль только, что при проверке, есть ли рядом мина, мы выходим за границы массива. Это не есть хорошо.
Пишем игры на C++, Часть 1/3 — Написание мини-фреймворка
На хабре не очень много уроков по созданию игр, почему бы не поддержать отечественных девелоперов?
Представляю вам свои уроки, которые учат создавать игры на C++ с использованием SDL!
Что нужно знать
О чем эта часть?
В следующих постах будет больше экшена, это лишь подготовка 🙂
Почему SDL?
Я выбрал эту библиотеку как наиболее легкую и быструю в освоении. Действительно, от первой прочитанной статьи по OpenGL или DirectX до стотысячного переиздания змейки пройдет немало времени.
Теперь можно стартовать.
1.1. Начало начал
Скачиваем SDL с официального сайта.
Создаем проект Win32 в Visual Studio, подключаем lib’ы и includ’ы SDL (если вы не умеете этого делать, то гугл вам в помощь!)
Также необходимо использовать многобайтную кодировку символов. Для этого идем в Проект->Свойства->Свойства конфигурации->Набор символов->Использовать многобайтную кодировку.
Создаем файл main.cpp
Пока что он ничего не делает.
Царь и бог каркаса — класс Game
Game.h
Создаем файл Project.h, он нам очень пригодится в будущем
Уже чуточку получше, но все равно как-то не густо.
1.2. Графика
Создаем аж 2 класса — Graphics для отрисовки графики и Image для отрисовки картинок
SDL_Surface — класс из SDL для хранения информации об картинке
Рассмотрим Graphics
NewImage — есть 2 варианта загрузки картинки. Первый вариант просто грузит картинку, а второй после этого еще и дает прозрачность картинке. Если у нас красный фон в картинке, то вводим r=255,g=0,b=0
DrawImage — тоже 2 варианта отрисовки картинки. Первый рисует всю картинку целиком, второй только часть картинки. startX, startY — координаты начала части картинки. endX, endY — конечные координаты части картинки. Этот метод рисования применяется, если используются атласы картинок. Вот пример атласа:
(изображение взято из веб-ресурса interesnoe.info)
Рассмотрим Image
Он просто держит свой сурфейс и дает право доступа к своим закрытым членам классу Graphics, а он изменяет сурфейс.
По сути, это обертка над SDL_Surface. Также он дает размер картинки
В конструкторе инициализируется SDL и создается экран.
Функция Flip должна вызываться каждый раз после отрисовки картинок, она представляет получившееся на экран и чистит экран в черный цвет для дальнешней отрисовки.
Остальные функции малоинтересны, рекомендую разобраться в них самому
Нет, вы все правильно делаете, этот файл и должен быть таким 🙂
Надо изменить Game.h, Game.cpp и main.cpp
Game.h
Тут мы добавляем указатель на Graphics и в Execute добавляем размер экрана
Ничего особенного, разве что не пропустите функцию SDL_Quit для очистки SDL
Тут мы создаем экран размером 500 на 350.
1.3. Ввод
Надо поработать со вводом с клавиатуры
SDL_Event — класс какого-нибудь события, его мы держим в Input’е для того, чтобы не создавать объект этого класса каждый цикл
Ниже расположены методы, не представляющие особого интереса. Примечание: методы с окончанием Down вызываются, когда клавиша была нажата, а с окончанием Up — когда опущена.
Здесь мы обрабатываем наш объект событий в функции Update, а остальные функции просто проверяют тип события и его значения.
Изменяем теперь Game.h и Game.cpp
Как видно, мы добавили указатель на Input и создали методы-возвращатели Graphics и Input
1.4. Итоги
Это был первый урок. Если вы дошли до этого места, я вас поздравляю! У вас есть воля, присущая программисту 🙂 Смотрите ссылки в начале статьи на последующие уроки для того, чтобы узнать еще много нового!
Пишем игровую логику на C#. Часть 1/2
Всем привет. В связи с выходом моей игры SpaceLab на GreenLight я решил начать серию статей о разработке игры на C#/Unity. Она будет основываться на реальном опыте её разработки и немного отличаться от стандартных гайдов для новичков:
Во-первых, я не буду повторять документацию иными словами.
Во-вторых, необходимо знание программирования, чтобы понять о чем я пишу.
К сожалению, эта статья не сможет вам помочь, если вы хотите создать свою казуальную игру используя лишь мышь.
Зато я шаг за шагом расскажу о создании движка, на котором будет работать игровая логика нашей экономической стратегии.
Для тех, кто любит спойлеры или просто хочет почитать код — в конце есть ссылка не репозиторий, где каждый пункт добавлен отдельным коммитом.
Кого заинтересовало узнать, что за игра — внизу есть видео и ссылка на бесплатное скачивание.
Сразу предупрежу — у меня нету цели идеально применить огромное количество паттернов или описать подход к методологии TTD. В статье я стараюсь писать читабельный, поддерживаемый и безбажный код, как он писался бы в жизни. Возможно, людям имеющим огромный скилл в C# и написании игр данная статья покажется очевидной. Тем не менее, вопрос о том, как писать гейм-логику я слышал довольно часто и эта статья прекрасно подойдет и тем, кому интересно написание сервера и тем, кому интересно написание клиента на Unity.
Краткое описание GD, которого мы хотим достичь
1. Игрок управляет кораблем. В корабле можно выстраивать комнаты, в комнатах можно добавлять в слоты модули.
2. Для постройки чего-либо необходимо потратить ресурсы и подождать время.
Через полгода разработки результат должен выглядеть как-то так)
План работы
1. Настраиваем проекты
2. Создаем ядро — базовые сооружения
3. Добавляем и тестируем первые команды — построить строение и модуль
4. Выносим настройки строений и модулей в отдельный файл
5. Добавляем течение времени
6. Добавляем Constructible, строения теперь строятся некоторое время
7. Добавляем ресурсы, для постройки необходимы ресурсы
8. Добавляем цикл производства — модуль потребляет и выдает ресурсы
Статья получилась очень объемной, потому пришлось разделить ее на две части. В данной части мы сделаем первые пять пунктов, а во второй части закончим
1. Настраиваем проекты
На первых порах Unity Editor нам не понадобится — мы пишем ГеймЛогику. Открываем VS и создаем два проекта: GаameLogic и LogicTests (Unit Tests Project). В первом мы будем писать собственно логику игры на чистом C# не используя namespace Unity, второй будет тестить нашу логику встроенной тест-тулзой. Добавим в GameLogic первый класс Core и напишем первый тест, чтобы проверить нашу связку:
2. Создаем ядро — базовые сооружения
Что ж, это указывает, что настроили мы корректно и можно переходить к программированию логики.
Итак, разберемся с нашим гейм-дизайном. У нас есть корабль (Ship), в нем комнаты (Room), в каждую комнату может быть построено строение (Building), а в каждом строении могут быть модули (Module). Конечно, Room и Building можно было бы объединить в одну сущность, но далее такое разделение нам только поможет.
Для всех этих сооружений я создам отдельный namespace Architecture и базовые классы. А так же enum для индексов комнат. Многие вещи, которые мы сейчас делаем — временные и необходимы, чтобы запустить первый тест гейм-логики.
3. Добавляем и тестируем первые команды — построить строение и модуль
Теперь мы сможем написать первую «фичу» — постройка строения и постройка модуля в нем. Все подобные действия я буду описывать отдельным классом, который будет наследоваться от класса Command:
И хотя сейчас даже такая маленькая структура излишня — чуть позже благодаря ей мы прикрутим необходимые нам события. А существование каждого атомарного действия в отдельной команде позволит нам их комбинировать. Напишем наши первые два действия:
Пришло время посмотреть, работает ли наш движок. В тестах создаем ядро, пробуем построить комнату, а в нее пытаемся построить модуль. Кроме этого стоит добавить проверку, что нельзя построить то, чего гейм-логика не должна позволять строить:
4. Выносим настройки строений и модулей в отдельный файл
К счастью, наши тесты прекрасно проходятся. Теперь нам необходима возможность линейно расширять количество строений и модулей — для этого необходимо сделать следующее:
Как можно понять, теперь наш код нерабочий. Для того, чтобы не таскать каждый раз с собой конфиги создадим фабрику, которая будет выпускать наши сооружения зная только их тип. Я знаю, что название пока слишком общее, но мы всегда с легкостью можем его переименовать благодаря IDE, так же, как и разделить на две фабрики:
Я сразу добавил несколько строений и модулей, чтобы можно было покрыть тестами. И сразу скажу — да, хранить все эти настройки в фабрике нету никакого смысла. Они будут лежать отдельно в JSON файлах, по одному на структуру, парсится и передаваться в фабрику. К счастью, у нас движок даже не заметит этого изменения. Ну а пока нам не так критично вынести их в ЖСОНы, как запустить тесты и проверить все ли корректно работает. К счастью, да. Заодно допишем тесты, что нельзя построить модуль не в той комнате, например, Furnace в PowerPlant.
Увы, как вы можете догадаться, никто логику проверки не писал. Добавим условие валидации в команду постройки модуля и после этого успешно пройдем тест:
Что ж, теперь все корректно. Заодно добавим тесты на корректную работу лимитов и пойдем дальше.
5. Добавляем течение времени
Компьютеры дискретны. И все игры дискретны. Если говорить просто, то представим, что все игры — пошаговые. У большинства игр шаги пропускаются автоматически и 60 раз в секунду. Такие игры называются риалтайм. Я понимаю, что это очень грубо, но для реализации гейм-логики довольно удобно представлять, что ваша игра — пошаговая и мыслить такими категориями. А потом уже на клиенте можно запустить tween между двумя состояниями и юзеру будет красиво и игра будет работать быстро. Для начала введем понятие хода:
А также введем команду, которая позволяет переключать хода. Я сразу добавил команду, которая позволяет переключить несколько ходов — будет довольно удобно во время тестирования. В тестах одним выстрелом покроем сразу двух зайцев.
Забегая далеко вперед напишу, как сделать переключалку скоростей в игру, которая позволит нам запускаться с разной скоростью:
Теперь в Unity достаточно будет подвесится на любой Update и передавать дельта время в наш TimeWarp:
Продолжение следует.
В следующей статье мы закончим создание работоспособной основы для нашего движка, реализовав следующие пункты:
6. Добавляем Constructible, строения теперь строятся некоторое время
7. Добавляем ресурсы, для постройки необходимы ресурсы
8. Добавляем цикл производства — модуль потребляет и выдает ресурсы
Для тех, кто просто любит код — есть отдельный репозиторий на ГитХаб
Кроме этого, если вас интересуют вопросы по разработке SpaceLab — задавайте, отвечу на них в комментариях или в отдельной статье
Скачать для Windows, Linux, Mac бесплатно и без СМС можно со страницы SpaceLab на GreenLight