Экономическая стратегия «Сахалинская колония»

Сахалинская колония — экономическая стратегия, цель которой, выжить. Игроку дается типовое, либо случайно сгенерированое игровое поле, поделенное на ячейки.
Каждая ячейка представляет собой определенный ресурс, либо чистое поле. В начале игры игроку дается здание администрации и 2 участка земли, на которых он может строить ресурсодобывающие строения. Все строения со временем разрушаются и требуют ремонта — за деньги вырученные от продажи ресурсов. Здание администрации является основным — невозможность его ремонта приводит к окончанию игры.
Выйти в плюс по доходам непросто, и редкий, но дорогой ремонт администрации часто ломает красиво выстроенные планы.





Когда-то давно, мне очень нравилась экономическая стратегия «Сахалинская колония» Григория Жмулевского. Сейчас именно с нее я решил написать свою первую доведенную до конца игру, и заодно изучить различные аспекты C#. Получив от автора лаконичное «Конечно» на вопрос о копировании его игры, я приступил к работе.
Исходники на C++ доступны на сайте автора, и я обращался к ним для копирования данных объектов — стоимость, сколько объект живет, в каких ситуациях разрушается сильнее или слабее и т.п. В остальном я старался полагаться только на себя.
Вместе с хромом размер оригинала — 640Х480. Я выбрал те же размеры приложения, но без хрома. За счет этого, а так же более оптимального использования пространства удалось увеличить размер ячейки карты на 2 пикселя. Немного, но тоже хорошо.
Внутренняя логика игры сохранена почти полностью. Добавлена краткая справка.

Краткая информация о ходе разработки.

Общее
Делать игру было решено на XNA в частности потому что для него у меня уже были наработки по gui.
Для реализации была выбрана довольно простая архитектура:
Игровые классы без использования специфических XNA классов, для простоты возможного порта на другой движок в будущем:
  • Класс игры со ссылкой на карту
  • Класс карты со ссылкой на массив ячеек
  • Ячейка со своими данными и ссылкой на строение
  • Строение со своими данными и индексом ячейки
  • Статичный класс содержащий все неизменные данные, в т.ч. перечисления.

Xna класс Game:
  • В update() — открытие / закрытие диалоговых форм, вызов update контролов.
  • В draw() — отрисовка игровых элементов, вызов draw контролов.

Класс event_handlers:
  • Класс-прослойка между Game и игровыми классами. Вызов игровых методов осуществляется только через него. Опять же для простоты возможного порта на другой движок. В нем же — работа с потоками.

Класс xml:
  • Работа по сохранению, чтению данных.


Сериализация
Сериализация в теории могла помочь отказаться от громоздкого класса сохранения / чтения данных с использованием XmlDocument.
Однако на практике при внедрении функционала сериализации я столкнулся с рядом задач без которых она не могла работать.
В частности пришлось большую часть статичных классов сделать публичными. В итоге получился статичный класс верхнего уровня, содержащий ссылку на публичный класс игры. Данный подход позволил с одной стороны сохранить простоту обращения к необходимым данным, с другой — использовать сериализацию. Во время программирования и промежуточных тестов я столкнулся со странным поведением программы при открытии и сохранении данных — на комьютере разработки все работало, но на другом игра все время вылетала на сериализации. Добавив в игру конструкции try catch удалось получить и вывести информацию о ошибках в файл. Выяснилось что сериализатор (только!) на клиентском компьютере не мог разобрать некие статичные классы. Выяснилось что проблема в полях — перечислениях, которые объявлены во вспомогательном статичном классе. После долгих поисков мне посоветовали исключить их из сериализации атрибутом [XmlIgnore]. Тем не менее эти поля необходимы в логике, поэтому было принято решение дублировать их в строковые поля, и после чтения xml сразу парсить строковое представление в соответствующее перечисление. Это сработало.

Контент
Поначалу я планировал заполнить игру изображениями с пометкой free из интернета, т.к. сам никогда рисовать не умел, однако поиски подходящих картинок
оказались на удивление сложными. В итоге попробовав нарисовать иконки самостоятельно я увидел что получается нормально (на мой взгляд), и по времени быстрее чем искать их в интернете. На данный момент в игре лишь три картинки из интернета — деньги, еда, золото. Остальные нарисованы в пайнте. Постобработки в более серьезном редакторе довольно мало. Все иконки земли и строений по факту вдвое больше чем отображаются в игре — так их было проще рисовать. К тому же иконки такого размера проще будет использовать в дальнейшем. Уменьшать проще чем увеличивать.



Текстурные карты
Изначально весь графический контент был разбит — каждой кнопке один файл. Причем встроенный механизм контента XNA не использовался — все текстуры загружались в игру стандартным для C# способом и затем конвертировались в Texture2d через Stream. Хранились текстуры в именованном массиве. Большое количество файлов и сложности с публикацией заставили задуматься о текстурных картах. Собрав (почти) все
текстуры в карты удалось уменьшить потребление памяти приложением почти на 10 мегабайт (Значение колонки «выделенная память» в диспетчере уменьшалось с 69 до 60 мб). Именованный массив так же был заменен на n отдельных переменных.

Интерфейс
К сожалению в XNA нет своего графического интерфейса. Подключение win form или wpf накладывает свои ограничения. Т.к. одна из целей проекта — обучение программированию в C# в целом и конкретно в игровой среде, было принято решение вспомнить относительно старый велосипед — гуи под XNA.
Изначально этот гуи задумывался как очень мощный механизм — конструктор интерфейсов. Его мощь обратилась огромными блоками кода с трудно находимыми ошибками и медленной работой. Пришлось обрезать очень много кода, упростить работу, сократить количество вызовов вспомогательных функций в update.
Так же был написан контрол edit — принимающий только цифры, десятичную точку, знаки плюс и минус (исключая плюс и минус на дополнительной клавиатуре — не нашел их в списке клавиш XNA). Средствами гуи при необходимости происходит создание дополнительных текстур — нажатия, наведения, недоступного состояния. Получился небольшой, но вполне рабочий gui.



Потоки
Приложение использует окна, в т.ч. модальные. Окна-вопросы, сообщения, а так же форма торговли, должны пересылать в программу некую информацию, которая будет обрабатываться.
В ходе работы было найдено следующее решение: при активизации окна в отдельном потоке происходит вызов целевого метода, например ремонт строения. Идет расчет стоимости ремонта, в статичный класс вопроса передается флаг активации окна, текст самого вопроса.
Метод ремонта строения (вызванный поток) входит в цикл по флагу — признаку получению ответа пользователя. Параллельно исполнению этого цикла, в методе Update (главный поток) происходит открытие окна — диалога, исполнение gui, по нажатию пользователем клавиши да или нет происходит установка соответствующих флагов в статичном классе вопроса. Дочерний поток выходит из цикла, и продолжает исполнение метода ремонта строения ориентируясь уже на полученный ответ пользователя.
Для того что бы не порождать много параллельных потоков и экранировать другие возможные проблемы, все игровые кнопки блокируются при активации вопроса. Системные кнопки не блокируются, в частности потому что они используют стандартные диалоги windows, которые и так полностью блокируют приложение.

Приложение
Написано под win 7, требует установленных компонентов XNA, фреймворк .net 4.0 — все необходимое скачивается автоматически в процессе установки.
Компоненты XNA можно скачать отдельно www.microsoft.com/en-us/download/details.aspx?id=27598

Exe: rusfolder.com/35736586

Setup: rusfolder.com/35736588

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Вам интересны игры этого жанра?

  • 42,4%Да230
  • 28,7%Скорее да156
  • 24,3%По настроению132
  • 9,4%Скорее нет51
  • 10,7%Нет58

Интересна ли вам возможность развития опубликованной игры?

  • 67,7%Да310
  • 35,6%Нет163

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

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

Подробнее
Реклама

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

    +1
    требует установленных компонентов XNA, фреймворк .net

    А можно уточнить какой .NET Framework требуется?

    P.S. Попробовал под mono запустить свалилось:
    nhandled Exception: System.TypeLoadException: Could not load type 'colony.Game1' from assembly 'colony, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
    [ERROR] FATAL UNHANDLED EXCEPTION: System.TypeLoadException: Could not load type 'colony.Game1' from assembly 'colony, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.
    
      +1
      Используется 4.0
      На mono к сожалению у меня не было возможности протестировать. На 3х разных машинах с вин 7 работало.
        0
        Для запуска игр на xna нужно это: www.microsoft.com/en-us/download/details.aspx?id=27598 и net framework 4.0
          0
          Благодарю, добавлю в описание. Думал что установщика с автоскачиванием будет достаточно.
        +19
        Здание администрации является основным — невозможность его ремонта приводит к окончанию игры

        Вся Россия в этом:)
        • НЛО прилетело и опубликовало эту надпись здесь
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Старый теплый сайт ) Мне знаком, но он не мой.
            0
            Сама игра вообще не впечатлила. Ничего интересного, ничего нового.

            К сожалению в XNA нет своего графического интерфейса. Подключение win form или wpf накладывает свои ограничения.

            Есть много готовых и красивых решений.
              0
              > Сама игра вообще не впечатлила. Ничего интересного, ничего нового.
              Все зависит от вкуса не правда ли? Игра и не должна была быть концептуально новой.

              > Есть много готовых и красивых решений.
              Да, я о них знаю. Но как я указал выше, я хотел лучше изучить C#.
                –1
                Я имел в виду что написанное у вас делается за вечер. Не видно тут какой то идеи и работы. Весь код на пару тысяч строчек.
                  +1
                  Дело личного опыта. Мне потребовалось значительно больше вечера, да и строк кода минимум втрое больше чем пара тысяч. Не думаю что вы можете говорить что мне это не стоило никакой работы.
              +1
              Ох, сколько я вечеров на «Сахалинскую колонию» потратил. Хорошая игра. Развивающая. :)
                0
                «Приход»? «Элетричество»?

                Насчет переписывания игры — я бы писал на JS или Flex, это снимает ограничения по платфомам де факто.
                  +1
                  И налагает массу других :))
                    0
                    Опечатка :) Но «приход» считаю верным экономическим термином.
                    Насчет других языков все неоднозначно. Не думаю что есть идеальный язык.
                      +1
                      Доход и расход. «Приход» — это узкобухгалтерское в лучшем случае.
                    0
                    Так вышло, что первая же моя система полностью окупала себя + полный ремонт, да ещё и прибыль приносила. Перестал играть т.к. заколебался каждые 15 секунд лезть на «рынок» закупать/продавать ресурсы.
                      0
                      А вы дошли до ремонта здания администрации? Обычно на этом этапе возникают сложности.
                      Да, стоило ввести автопродажу. В следующий раз предусмотрю это.
                        0
                        Само собой. Регулярный ремонт всех зданий по необходимости, этот момент отвлекает даже чаще чем регулярная продажа/покупка.
                        Т.к. у рынка растут объёмы продажи/покупки, и это всё таки становится пореже
                      +1
                      История колоний начиналась с игры Кожевникова Евгения Колония на downloads.ru.
                      Игра была прикольная, но очень сырая, в частности, нельзя было сохраняться. Из-за этого у Колонии появились клоны. Первым клоном была моя игра Новая Колония, которая была почти точной копией Колонии, но с сохранением.
                      Потом с небольшой разницей во времени вышли три игры — Сахалинская Колония от Григория Жмулевского, Night Fairy от меня, и Колония2 от Евгения Кожевникова, каждая по разному развивающая идею. Григорий ее развил с экономической стороны, я добавил военные действия, а Евгений оставил классическую идею, но в этот раз реализовал ее качественно.
                      Вот по такой ссылке даже можно увидеть все колонии рядом — тогда через downloads.ru распространять было самое простое, все остальные архивы давали статистику хуже:
                      http://download.ru/categories/voennye/products?page=4&order=1
                      Скриншоты:

                      Колония 2
                      <img src="" alt=«image»/>

                      NightFairy
                      image


                      А скриншот Сахалинской Колонии есть в посте.

                      Вообще тогда были прикольные времена.
                        0
                        Благодарю за пост — не знал что у колонии такая интересная история.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое