• ↓
  • ↑
  • ⇑
 
Записи с темой: хроники панды (список заголовков)
22:53 

Хроники Панды: значение и цвет карт

Надо же, новости появились быстрее, чем я думал.

Хочу рассказать про генерацию игрового поля.

Требовалось заполнить поле из 54 ячеек случайным картами со значениями в промежутке [2; 15] (валет - 11, дама - 12, король - 13, туз - 14, джокер - 15) черного и красного цвета. Причем карты в отрезке [2; 14] должны быть представлены в количестве 4 штуки каждая (по 2 карты красного и черного цвета), а джокеров должно быть только 2. Именно они и доставляли больше всего хлопот в самом начале.

Решил в первую очередь разобраться со значениями карт, оставив цвета на потом.
Вот так это выглядело (первоначально я делал все для поля в 16 ячеек, поэтому здесь MAXCELL = 16):


Однако я быстро понял, что цвета тут распределяются неправильно, а когда вспомнил, что джокеров в колоде не 4, а 2, стало ясно - надо все менять.

Пришлось отвлечься от своих изысканий на 2 недели, ибо сессия неумолимо приближается. Видимо, все это время подсознательно я продолжал думать о проблеме, т.к. стоило мне вернуться к работе, как решение было найдено очень быстро. Зачем генерировать случайные числа в промежутке [2;14] при заполнении массива? Я ведь точно знаю, какие значения и в каком количестве должны в нем быть. Гораздо проще будет изначально забить массив нужным содержимым, а потом просто перемешать его.
Дабы не возиться, отсчитывая нужное количество нулей (черный цвет карты) и единиц (красный цвет карт), решил просто ставить их попеременно. В конце-концов это не имеет никакого значения, главное, чтобы обычные карты имели по две красные и две черные карты, а при перемешивании мы перемещаем не только значение ячейки, но и соответствующую ему ячейку с цветом, так что цвета не сбиваются.
(в данном варианте MAXCELL = 54)


Если интересно, про алгоритм тасования можно почитать здесь


Также я добавил возможность выбирать количество игроков (напомню, что автором было задумано от 2 до 4 игроков).



А еще вывел в отдельную функцию запрос на бросок кубика



Так что класс Main теперь выглядит очень опрятно, ничего лишнего нет.

Пока это все изменения. Следующим шагом будет добавление триггеров.

@музыка: Malukah - The Dragonborn Comes

@темы: хроники панды, программирование

17:50 

Хроники Панды: level up

Да уж, пропал я надолго, что лишний раз напоминает, что сессия близко. Времени на Панду остается совсем мало, но я не собираюсь это дело бросать.

Я решил последовать совету Pashtet.s2lan и перешел на объектно-ориентированный язык, и мой выбор пал на Java.

В принципе, тут все шло аналогично: классы с методами заменили собой структуры с их функциями. Разница кроется в мелких деталях.

Сейчас передо мной стоит задача довести игру до состояния версии 0.0.2, то есть, грубо говоря, восстановить весь тот функционал, которого мне удалось добиться, используя язык Си. Пока что мне удалось только одно - заставить фишки бегать наперегонки по броску кубика.

На этом я вас оставлю, ждите обновлений.

P.S. Все исходники лежат в репозитории github.com/the-elf/panda

@темы: хроники панды, программирование

16:58 

Хроники Панды: первые трудности

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

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

Например, сама структура Token не полностью отражает все характеристики фишки:

Нет никакой информации о значении в текущей ячейке (напомню, что поле представляет собой целочисленный массив, значения которого являются "картами", по которым ходит игрок), о номере игрока, о триггерах.

Я планировал для начала на триггеры забить и просто реализовывать функции, однако опытным путем выяснил, что на такие вещи лучше не забивать, а то потом придется сильно менять всю структуру. Могу привести пример, но, думаю, стоит напомнить функции карт:

  • Десятка
    • Черная: игрок пропускает ход

    • Красная: игрок делает дополнительный ход

  • Валет
    • Черный: игрок меняет направление движения

    • Красный: выбранный оппонент меняет направление движения

  • Дама
    • Черная: игрок открывает любую закрытую карту, находящуюся позади него; если открытая карта активная, то игрок должен использовать ее в СЛЕДУЮЩИЙ ХОД

    • Красная: игрок открывает любую закрытую карту, находящуюся позади него; выбранный оппонент в свой СЛЕДУЮЩИЙ ход не сможет использовать карты такого же цвета

  • Король
    • Черный: игрок поворачивает любые две карты, превращая их в препятствие, которое можно только "перепрыгнуть"

    • Красный: игрок меняет местами 2 открытые и закрытые карты

  • Туз
    • Черный: усиливает следующую черную карту игрока или ослабляет красную карту выбранного оппонента

    • Красный: усиливает следующую красную карту игрока или ослабляет черную карту выбранного оппонента

  • Джокер
    • Черный: в свой следующий ход игрок разыгрывает любую открытую черную карту

    • Красный: в свой следующий ход игрок разыгрывает любую открытую красную карту



К тому времени, как я начал реализовывать смену направления движения (т.е. Валет) и пропуск хода (т.е. Десятку), структура Token выглядела уже следующим образом:



Поле из обычного целочисленного массива превратилось в структуру Board:



Так что, мне кажется придется несколько повременить с переходом на объектно-ориентированный язык. Лучше для начала досконально продумать реализацию функций.

@темы: хроники панды, программирование

01:06 

Хроники Панды: начало

Я не был тут очень давно (посты про сессию не в счет), однако думаю с этим что-то делать. Этим объясняется небольшой редизайн и, собственно, эта запись. О чем же она будет? Я отвечу - об игре.
После того, как UnL1M рассказал мне про свою карточную игру (почитать о ней можно тут: первая часть и вторая часть), я подумал, что ее вполне реально перенести на компьютер, и решил этим заняться. Так как более-менее хорошо я знаю только Си, на нем и буду все это дело реализовывать. Паша пока не придумал название для игры, поэтому я дал проекту рабочее название "Panda". Спасибо фишке, которую он использовал во время первого теста.

Вот как я это себе представляю:

  • игровое поле - это массив из 54 ячеек

  • фишки представлены в виде структуры, имеющей следующие поля:

    • текущее положение

    • направление (положительное/отрицательное)

    • способность, которая так же является структурой с полями:
      • цвет
      • наименование

  • кубик - генератор случайных чисел



Первая проблема, с которой мне пришлось столкнуться, оказалась довольно очевидна: долгое отсутствие практики программирования. Ведь последний раз что-то более-менее серьезное я прогал только на первом курсе. Было принято решение отказаться от попыток решить задачу "в лоб", разбить ее на несколько частей, и разбираться с каждой по очереди.

Поэтому для начала я решил реализовать просто проход фишки по полю (размеры поля я уменьшил, чтобы тесты занимали меньше времени).

Спустя какое-то время мне это удалось:


С исходным кодом можно ознакомиться тут: main.c, token.c, token.h

На этом, пожалуй, пока и остановлюсь. Завтра приступлю к следующему шагу: проходу двух фишек и смене направления движения.

@музыка: Shinedown - Bully

@темы: хроники панды, программирование, возвращение

Ушастые заметки

главная