• ↓
  • ↑
  • ⇑
 
Записи с темой: программирование (список заголовков)
02:13 

Как я список учеников составлял

Работаю администратором образовательного центра. Размещается он в здании школы - арендуем у них помещения по выходным. Однажды завуч этой самой школы попросила предоставить полный список наших учеников. Возможности посмотреть именно список учеников у меня нет - в нашей системе можно посмотреть только услуги. То есть, грубо говоря, я могу получить пару "ученик-услуга". Однако на каждого ученика может быть заведено несколько услуг, таким образом в списке будет большое количество одинаковых имен, да еще и некоторые имена имеют цифру на конце (база общая на все центры, поэтому при появлении учеников с одинаковыми именами надо добавить порядковый номер).
Я начал думать, как можно решить проблему. Спустя пару минут решение было найдено - надо написать небольшую программу.

Спустя еще минут 15 программа была готова, вот код.



Программа сработала идеально, дубликатов было около 200. Я доволен, как слон. Однако вдруг промелькнула мысль о том, что все это наверняка можно было сделать штатными средствами прямо в экселе. Погуглил, и первая же ссылка подтвердила мои подозрения. Я уж не стал гуглить, можно ли штатными средствами убирать циферки из строк - уверен, что можно.

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

@темы: программирование, epic fail, радость, DIY

18:31 

Как я музыку выкачивал

Недавно из-за нелепой случайности потерял всю инфу на телефоне, благо там почти не было ничего важного. Однако меня больше интересовала музыка, ибо последний раз я делал резервную копию больше года назад. Учитывая, что уже давно я загружаю музыку в телефон, минуя компьютер, накопилось довольно большое количество треков, которых не было на компьютере. Таким образом передо мной стояла задача скачать около 70 аудиозаписей.
Существуют расширения для браузера, позволяющие сделать то, что мне нужно, однако у них имеются минусы:
  • с помощью VKopt можно загружать аудиозаписи с нормальными названиями, но только по одной
  • SaveFrom.net позволяет загрузить сразу ВСЕ свои аудиозаписи

Как вы понимаете, ни один из этих вариантов меня не устраивал, поэтому пришлось копать дальше. Я заметил, что VKopt позволяет получить список ссылок на все аудиозаписи. После небольшого редактирования в списке остались только нужные мне треки. Я уже хотел было обрадоваться, но не тут-то было. Все действительно скачивалось, однако названия файлов были такие, что понять, какая это песня не представлялось возможным. Ну вот как понять, что за таинственным "bf026609003c19" скрывается чудесное "Небо в алмазах"? Меня несколько озадачил тот факт, что поодиночке файлы сохранялись с нормальными названиями, а при попытке массовой загрузки названия файлов выглядели несколько удручающе. Я решил рассмотреть ссылки на файлы поподробнее:

Мое внимание привлекла вот эта часть ссылки Rise%20Against%20-%20Hero%20Of%20War. Выходит, что ссылка уже хранит нормальное название, надо только найти способ извлечь его оттуда.

План начинал вырисовываться:
  1. Выудить названия файлов из ссылок
  2. Привести их в нормальный вид (если кто не заметил - пробелы были заменены на %20)
  3. Составить список названий таким образом, чтобы каждой ссылке поставить в соответствие нужное название
  4. Воспользоваться утилитой wget для загрузки аудиозаписей

План идеален, осталось только реализовать. И вот тут я столкнулся с некоторыми трудностями. Чтобы зациклить wget и выкачать файлы, логично было бы написать скрипт, но работать со строкой в bash сильно неудобно. Со строкой удобно работать, например, в java. По идее, я мог бы написать всю программу на java, но я понятия не имею, как оттуда запустить wget с нужными мне параметрами. Поэтому мною было принято решение: список имен получу с помощью программы на java, а файлы загружу с помощью bash-скрипта.

Java-часть: тут
Bash-часть: тут

Наконец, после всех стараний я наслаждался видом автоматически скачиваемых аудизаписей :)
P.S. Забыл сказать, что с кириллическими названиями все равно пришлось поработать ручками (благо их было не так уж много), ибо писать перекодировщик было уж совсем лень.

@темы: программирование, DIY

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

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

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

главная