LG.BALUKATION's Weblog

Ничего, это тоже кое-что… А при желании из него можно сделать что угодно

MiniGame

Posted by LG.BALUKATION на 2011/09/21

Я тут недавно по-программировал чутка. Ну да, с кем не бывает — как в студенческие времена, написал мини-игрушку за день.

Просто общался вот с одной конторой, а там тестовое задание

Написать миниигру «Перемешанная картинка». Миниигра берет заданную картинку, бьет ее на заданное количество прямоугольников и перемешивает их. Задача игрока – составить исходную картинку, попарно меняя эти прямоугольники местами.

При написании необходимо использовать следующие интерфейсы базового класса миниигры:

  • Initialize вызывается один раз при запуске игры
  • Click вызывается при клике мышью с заданием экранных координат
  • IsComplete вызывается для проверки условия окончания игры (true – игра завершена)
  • Render вызывается для отрисовки (на каждом кадре)

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

Интерфейс пользователя: первый клик выбирает первый кусок картинки, второй выбирает второй кусок картинки, после чего куски меняются местами. Когда все куски картинки встают на свое место, клики должны перестать работать.

Я кстати весьма обрадовался, т. к. иные фирмы шлют странные задания вроде «написать функцию, которая принимает строку и…» или что-нить вроде программы, читающий текстовый файл и как-нить обрабатывающей написанное там — это уже вообще какое-то спортивное программирование, а не тестовое задание.

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

Впервые попробовал юзать для таких целей Qt. Это конечно большая и универсальная библиотека, но в последние годы в неё с каждым релизом добавляют что-нить из мультимедии. Я правда ничего такого не пользовал — просто окошко с OpenGL да чтение картинки из файла, но зато это писалось быстро и просто.

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

Из вещей, что мне не понравились, но были сделаны потому что «это быстро и просто» отмечу получение случайного числа и отрисовку куска. Мне кажется, любой нормальный игровой движёк должен включать в себя функции вроде «псевдослучайное число с плавающей точкой [0..1]» и «псевдослучайное целое число [0..параметр)», а rand()/random()/urandom() должно быть скрыто от игрового программиста. Тут правда есть подстава, что игры часто хотят запускать под Windows и собирать в Visual Studio — а ведь там нет C99, да и вообще многое сделано «иначе». Что же касается отрисовки, то задавать «вручную» каждую вершину это конечно дооо… Красивей былоб написать через трансформации и массивы например, но для 100 вершин на экране это не критичный нюанс.

«Игра» писалась под MacOS X Leopard в Qt Creator 2.0.1 + Qt 4.7.0 (Qt SDK за лето 2010). Так что собирается оно g++ на маке, прочие юниксы должны быть без проблем, а вот про Windows и VisualStudio я даже не знаю. Исходный код будет жить здесь: GitHub или BitBucket

Реклама

комментария 4 to “MiniGame”

  1. tchnts said

    Еее еще один юзер в социалке github )

  2. Та я давно там, даж ценил что-то чужое, просто своего показать особо нечего, решил вот хоть что-то пусть будет.

  3. safebuster2 said

    под винду тоже собралось после коментирования асертов и добавления #include для srand

  4. попробовал в студии 2010 — srand нашлось, а вот time/assert и впрямь нет. Добавил нужные хидеры и запушил на гитхаб

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s