Первая игра, которую я просто написал для себя

    Пост ностальгии по игрушкам, которые мы сами для себя писали в детстве.
    Лазая по просторам App Store ища очередную игрушку для своего айпада, наткнулся на старинную игрушку “Братья Пилоты”. Сразу купил, поставил и прошёл на одном дыхании (уже наверное в 3 раз). Но более всего задержался на эпизоде с холодильником. Уж больно меня прёт эта головоломка.



    И внезапно вспомнил, что ещё в школьные годы, после прохождения холодильника, головоломка меня так накрыла, что я написал на паскале свою собственную игрушку — эмулятор головоломки. Но не просто повторяла исходную игру, а позволяла выбирать размер поля, имела хелп, возможность сохранения и продолжения игры с прошлого места после выхода.

    Подняв старые бекапы я нашёл исходную игру. Запустил её в dosbox и пропал для внешнего мира на пару часов.



    Исходная головоломка, обратите внимание на открытый левый столбец и положение вентилей

    В чём же суть?



    Суть головоломки достаточно проста. Имеется поле вентилей 4 на 4 штуки, необходимо все вентили на холодильнике поставить в горизонтальное положение. “Но есть нюанс”(с): когда вы поворачиваете вентиль, то вместе с ним поворачиваются все вентили в столбце и строке, в которой находится данный вентиль. И тут начинается самое интересное!
    Когда я впервые сел за эту головоломку в исходном квесте, играя ещё в школе, то проходил её, наверное минут 40, не меньше. Но она до того мне понравилась, что я играл в неё играл и играл, и играл…
    Но хотелось большего: возможность сохранять игровой процесс, генерировать разные уровни и менять размер поля, чтобы понять алгоритм игры.
    Тогда я понял, что если мне головоломка нравится, и хочется попробовать разные масштабы игрового поля, то не стоит ждать у моря погоды. Есть только один выход — реализовать эту игру самостоятельно.

    Ну’c, приступим!



    Я не смогу точно определить дату создания игры, но это точно конец школы, начало института. В те годы я прекрасно владел паскалем. В институте решал на нём задачки за деньги, помогал писать курсачи и вообще — это был прекрасный логичный язык. Поэтому игрушку было решено писать на нём.
    Не смотря на то, что я знал как реализовывать графику в ДОСе, я решил не делать графическое приложение. Это связанно с тем это бы страшно глючило и тормозило что, во первых, мне хотелось как можно быстрее реализовать данное приложение, а реализация графики отняла бы много времени; а во вторых, текстовый вид мне нравится больше. Хотя оглядываясь назад, мне кажется лучше бы я сделал графику и ещё добавил поддержку мыши.
    Задача была простая: сделать простую изящную игру, которую не стыдно было бы показать. Из возможностей: помощь, возможность сохранения и после запуска продолжение игры с момента остановки, возможность изменять размер игрового поля. Плюс немного красок и изящества.

    Реализация



    Я не буду целиком разбирать исходники и логику работы всей программы, ибо они очевидны, а что не очевидно ясно из кода. Но более подробно остановлюсь на паре моментов.
    Основу игры составляет текстовый массив NxN элементов, где N может быть равно 2, 4, 8 и 16. Массив заполнен всего двумя символами X и Y. Позиция курсора, это позиция текущего элемента массива i и j. При инвертировании элемента массива происходит замена X на Y и Y на X с столбце и строке массива. Ну и плюс есть горячие клавиши (F1-F4, F10), которые позволяют вызвать Помощь, Сохранить/загрузить, создать и выйти. Здесь всё ясно, и как реализовать просто и останавливаться мы на этом подробно не будем.

    Наибольший интерес, с познавательной точки зрения, представляет процедура WRIFT.*

    * - примечание, почему wrift
    В те времена, в качестве экономии смс-ки писались транслитом. Как мы помним буква “Ш” заменяется сочетанием “sh”, но для экономии места я её заменял неиспользуемой буквой со схожим написанием “W”. Отсюда и пошло название Wrift (Шрифт). Аналогично буква “X” (икс) заменяла букву “Х” (русское “ха”).


    Поскольку я решил использовать текстовый режим для игры, то мне понадобилась буква, которая бы заменила бы вентиль. При чём такая буква, которая бы показывала вентиль в вертикальном и горизонтальном положении. Единственные кандидаты, которые подходят для этих целей — это латинские буквы “N” и “Z”. Буква “Z” напоминает положенную на бок букву N, только растянутую.
    Я попробовал этот вариант, и остался им не доволен. И понял, что требуется сделать что-то своё, какое-то альтернативное решение. Уже было я задумался написать графическую версию, как наткнулся на паскалевскую программу “Матрица” от автора Абрарова А.М. . Программа начинается так же, как первая “Матрица” — вывода на экран строки, поиск кода. А затем начинаются сыпаться символы-иероглифы. При чём это реализовано только в текстовом режиме.

    Небольшой ликбез о программе Matrix.pas
    Программа была очень красивой и изящной для своего времени. И мне тогда весьма доставляла. Самое интересное, что там реализован полный шрифт, для 208 символов! Но я предполагаю, что автор взял реализацию программы типа нашего “русификатора”, только для иероглифов и переделал её под себя.

    Правда, сейчас чтобы заставить программу нормально работать, даже в dosbox, надо уменьшить все задержки раз в 10 (delay), иначе конца работы дождутся ваши внуки. Поскольку переделывать программу мне лень, то она представляет чисто академический интерес. Или быть может кто её переделает и покажет миру, софтинка-то красивая (тем более я даю ссылку на сорцы). А если вдруг её автор читает сей пост, то передаю ему мои слова благодарности.


    Самое главное, в той программе, для “кракозябр” реализован свой шрифт! И производится его загрузка. Вот эту процедуру загрузки я и позаимствовал, разумеется немного изменив её.
    Пара слов о работе со шрифтами.

    В MS-DOS средствами BIOS поддерживается работа с растровыми шрифтами. Функции BIOS позволяют получать и устанавливать пользовательские шрифты, а также получать шрифты из знакогенератора видеоадаптера. Все устанавливаемые шрифты имеют одинаковую ширину 8 точек, а высота может иметь три фиксированных значения — 8, 14 или 16 точек. Конкретное значение высоты шрифта определяется видеорежимом, для которого загружается шрифт. Высота шрифта 8 точек соответствует видеорежиму с 50/43 строками, высота 14 точек — видеорежиму с 25 строками для EGA, а высота 16 точек — видеорежиму VGA с 25 строками.


    Взято отсюда

    Мы будем использовать видеорежим 16 цветов 40х25 символов. В таком видеорежиме, каждый символ представляет собой массив точек 8х16. Говоря просто, каждый символ представляет собой 16 байт, где в байте бит выставленный в единицу означает то, что он окрашивается в чёрный цвет. Если у вас сейчас каша в голове, не пугайтесь — дальше станет понятнее.
    Для обозначения закрытого (вертикального) вентиля была выбрана буква “X” (латинская заглавная буква “Икс”) и для открытого горизонтального, буква “Y” (латинская заглавная буква “Игрек”). Выбор был сделан на эти буквы по нескольким причинам. Во первых они знакомы из школьной программы и на слуху. Во вторых, и это важнее, они в таблице ASCII символов стоят подряд (88d и 89d позиция соответственно), что упрощает их замену. А латинские выбраны для того, чтобы можно было сделать меню на русском, без перезалива шрифта.
    Итак, с символами мы определились, теперь перейдём к их одежде, ака шрифту. Берём лист бумаги в клетку, и делаем на нём поле 8х16 и приступаем к рисованию символа горизонтального, а затем вертикального вентиля. Поскольку вентиль должен быть одинаковым, как в вертикальном, так и горизонтальном состоянии, то мы будем использовать только первые 8 строк, чтобы получить квадрат. И далее рисуем в этом поле два вентиля, вертикально и горизонтально. Должно получится как-то так


    Шрифт двух вентилей

    Далее, чёрный квадратик обозначаем единичкой, белый нулём. И формируем 8 байт. После чего их переводим в десятичный формат и формируем массив. Сначала 8 байт символа, потом 8 байт нулей (подвал же мы оставили пустым), повторяем эту процедуру для второго символа.


    Таблица двоичных кодов, и переведённые в десятичный формат

    В результате получаем такую шапку процедуры:

    procedure WRIFT; {Zagruzka shrifta ("pesochnye chasy")}
    Const
      Font:array [1..32] of Byte=(129,195,231,153,153,231,195,129,0,0,0,0,0,0,0,0,
    255,102,36,24,24,36,102,255,0,0,0,0,0,0,0,0);
    
    Var
      SegScr:Word;
      OfsScr:Word;
      screen1:Array [0..512] of Byte absolute Font;
    


    Font — это массив двух символов вентилей (каждый символ на своей строчке). Самая интересная переменная — это массив screen1 — массив, который располагается по абсолютному адресу переменной Font (директива absolute). Далее наступает самое интересное.

    begin
          ofsscr:=ofs(screen1);
          segscr:=seg(screen1);
        Asm
          push bp
          mov ax,segscr
          mov es,ax
          mov bp,ofsscr
          mov bx,1000h
          mov dx,88 {s kakogo simvola na4at' zapis' 88d-X,89d-Y}
          mov cx,2 {koli4estvo simvolov}
          mov ax,1100h
          int 10h
          pop bp
          mov ah,1 {ustanovit videorezhim txt, tsvetnoj (16 cvetov) 40x25 }
          mov cx,1000h
          int 10h
        End;
    end;{WRIFT}
    


    Как понятно из строк выше мы загружаем в регистр ES — сегмент, а в регистр BP — смещение адреса расположение нашего шрифта. Командой mov bx,1000h мы говорим, что в шрифте у нас 16 строк (число 10h=16d загружаем в BH, а BL=0).Далее в регистр DX мы загружаем номер символа, с которого мы начинаем менять шрифт. А в CX — количество заменяемых символов. Загружаем в регистр AX — номер функции BIOS для смены шрифта, и вызываем прерывание BIOS. Далее восстанавливаем регистр BP и аналогичным образом выставляем режим видеоадаптера. Подробнее описано тут: shackmaster.narod.ru/fonts.htm. Для лучшего понимания о структуре шрифтов, лучше будет почитать этот сайт.

    Таким вот нехитрым образом, можно сменить весь шрифт в ДОСе на свой собственный. Для того, чтобы выгрузить шрифт, используется процедура Restore:

    Procedure Restore; {Sbros shrifta}
    Begin
      asm
        mov ax,3
        int 10h
      End;
    End;{Restore}
    


    Которая выполняется при выводе меню и выходе из программы.

    Кстати, для справки, аналогичным образом в ДОСе работали, так называемые “русификаторы”. Они просто заменяли текущий шрифт, на шрифт с русскими буквами.

    Один из приколов
    Один мой товарищ, а конкретно termi, когда изучал программирование на Борланд С++ сделал шрифт в виде МПХ, так же используя пример из “Матрицы”. Т.е. просто заменил все символы одним символом МПХ. Нортон Коммандер выглядел страшно! Жаль фотографий с того времени не осталось.
    Такую бы программулинку запустить на информатике, то-то училка бы порадовалась.


    Модификации сегодня



    На самом деле, игру я даю не в том виде, в котором она была написана много лет назад. В ней обнаружились весьма неприятные косяки:
    1. Программа просто вылетала, если не был обнаружен файл GAME.SAV;
    2. Генератор случайных чисел не был инициализирован, поэтому генерировал постоянно один и тот же уровень.
    Плюс, из-за проблем с кодировками, я создал вторую версию игры, полностью на английском языке. И если вы будете читать исходный код не в ДОС-совместимом редакторе, рекомендую использовать её исходники — там не будет проблем с кодировкой.

    Так отрадно, что ДОСбокс есть везде, лично я редактировал большую часть программы на iPAD в метро. Представляете, как забавно выглядит перец с айпадом, и открытым на нём Борланд Паскалем?


    Старый добрый Borland Pascal на iPAD

    Так что косяки оперативно исправлены.

    Несколько скриншотов программы, с кратким описанием



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


    Старт

    Курсор подсвечен, и мигает.

    Если нажать F1, то можно получить вот такой нехитрый хелп



    Хелп

    Для генерации уровня жмём F4 и попадаем вот в такое меню


    Меню генерации уровней

    Ну и после победы игра вас поздравит


    Поздравление с победой

    И будет ждать нажатия любой клавиши. В этом случае прогресс игры не сохраняется.

    Как установить и играть



    В силу особенностей и применения загрузки шрифта, игруха работает только в чистом ламповом ДОСе. По этому, для её работы необходимо использовать dosbox или аналогичную программу.
    Установка тривиальна. Качаете архив с программой. Устанавлиаете dosbox. И, если есть желание, русифицируете его, методика для linux вот: old-game.org/?p=1717.
    В принципе все эти файлы можно использовать и для винды: Для этого файл russian.txt кладётся в папке с программой и конфигом, и редактируется ярлык для досбокса. В пути ярлыка должно быть что-то типа: “«C:\Program Files\DOSBox-0.74\DOSBox.exe» -userconf” Убираем “-userconf” и будет работать ваш конфиг.

    В Ubuntu я просто щёлкаю правой кнопкой мыши по программе и выбираю запустить её в dosbox, как в винде я не знаю, ибо её нет ни на одной из машин. Ну в крайнем случае монтируется путь до игры, командой mount путь.
    На выбор вам русская и английская версия. Можно не морочиться с русификацией и геморроем с конфигами, а просто пулять в английскую. Разницы между ними практически нет. Хотя, лично я, как автор, предпочитаю русскую версию.
    Управление производится стрелками клавиатуры, выбор и инвертация клавишей insert или двойным нажатием на пробел (да, тут косяк). Если вдруг заест позиция, нажмите один раз на пробел.

    Помните, что каждый раз загружается последняя сохранённая игра. Для генерации новой, нажмите F4. Рекомендую начать с поля 4х4. Я сейчас играю 8х8, и пока боюсь переходить на 16х16. Ибо 4х4 я прохожу менее, чем за минуту, 8х8 минут за 7-10, а 16х16 боюсь даже представить.
    Помните, что загрузочное поле с надписью HABR и моим ником (картинка в заходнике статьи), пропадёт после сохранения или легального выхода. Она хранится в файле GAME.SAV. Если хочется восстановить, то замените этот файл, на файл из архива.

    Поле специально для хабра
    Мне не хотелось просто так пускать игру, пусть и доделанную и допиленную для хабра. Хотелось какую-то фишечку. И я решил сделать надпись в самом большом поле 16х16.
    Формат файла сохранения прост: начала идёт размер поля, например цифра 16, перевод каретки, потом 256 (для поля 16х16) символов X и Y, составляющие рисунок поля, а в конце количество Y в поле (этакая контрольная сумма).
    Для этого в OF Calc я сформировал такое поле, цветом сделал надпись в клетках. А затем проставил соотсветственно буквы X и Y.

    Заготовка для поля.

    После чего сохранил его в CSV. Удалил все разделители. Посчитал количество Y (очень просто, делаешь во OF Writer поиск, заменить на и заменяешь Y на что-нить, он говорит количество замен — вот искомое число). Поставил сначала число 16, перевод каретки и в конце количество игреков. Результат вы можете оценить сами :).


    Недостатки текущей версии программы.



    Я написал текущей версии… Маловероятно, что я буду переписывать программу и совершенствовать её, ибо она уже страшно устарела. Но с другой стороны, сейчас dosbox можно поставить чуть ли не на фонарик, по этому она может обрести новую жизнь, и быть может имеет смысл переписать и исправить основные недостатки.

    Итак:

    1. Первый, и самый неприятный недостаток — это убогое управление. Во первых инвертация идёт клавишей Insert, или двойным пробелом. При чём, если пробел нажать нечётное количество раз, то программа “заедает”, пока не сделаешь чётное количество нажатий. Это раздражает.
    2. Второй существенный недостаток — это отрисовка всей игры с помощью функций write/writeln. При каждом событии экран перерисовывается заново. При игре на поле 16х16 уже заметны тормоза и вспышки отрисовки. Плюс такой подход усложнил логику программы, и теперь её поправить громадная проблема.
    Надо было реализовывать отрисовку с помощью функции goto(x;y); Тогда можно было бы менять отдельный символ, не перерисовывая весь экран.
    3. Игра просто просит поддержку мыши. Опять же поддержку мыши нужно реализовывать на пару с п. 2, чтобы можно было точно “ловить” координаты.
    4. Мелкий баг, который следует из п.2 — когда спускаешься в правый нижний угол, за рамку убегает один символ. Пытался исправить, и понял что проще вообще переписать это место отрисовки, чем разобраться как оно работает.

    Что хотелось бы сделать



    Конечно, хотелось бы такое приложение под ведройд или iPad. Чтобы можно было в него играть пальцем. Или уж, если не приложение, то браузерную игрушку (но такую, чтобы работала под Android и iOS). Чтобы там было красивое меню и удобная навигация. Была таблица рекордов. Был счётчик времени, которым можно было бравировать с друзьями. Так же была статистика, чтобы можно было оценить среднее время и скорость навыка.
    В общем громадный полёт для творчества, при полном отсутствии свободного времени на изучение программирования под эти устройства. С другой стороны, dosbox есть везде, и наверное более универсальной переносимости добиться будет сложно, и может имеет смысл допилить таки эту программу? Как вы думаете?

    Итоги...



    Цель статьи, не показать какой я молодец, а просто вспомнить как было. Наверняка практически каждый из нас писал что-то такое в детстве. Это не ах какая сложная программа, и её может написать каждый школьник, при достаточной усидчивости. Здесь скорее пост воспоминание.
    Раньше я в программах много использовал ассемблер. Мне нравилось “говорить” с железом напрямую, без посредников. Я лучше чувствовал машину. И даже потом, для AVR я писал исключительно на ассемблере. А сейчас я не понимаю, как функционирует ЭВМ. Конечно, я представляю базовые блоки и т.п., но детальную картину я не знаю, и самое забавное, что её не знает никто!
    А сейчас… Языки высокого и сверх высокого уровня абстракции вообще заставляют нас не думать, как и где исполняется код. Это без сомнения хорошо, ибо позволяют сосредоточиться непосредственно на задаче, но с другой стороны уходит тот тёплый ламповый шарм работы с железом…

    Список литературы и ссылок:

    1. Описание, как загрузить шрифт под ДОС shackmaster.narod.ru/fonts.htm
    2. Отличный справочник по ассемблеру, который мне дал понимание, как работать с функциями BIOS, да и вообще с комповым железом: “Программирование на аппаратном уровне: специальный справочник.” Кулаков
    3. Эмулятор ДОСа dosbox www.dosbox.com/download.php?main=1
    4. Программа и исходники narod.ru/disk/65499856001.6f143511c7c3c2ad7866f07008d8db29/INVERTOR.zip.html
    5. Исходники программы “Матрица” narod.ru/disk/65499898001.a6c953f20e2ee023bd00e3518e22fea8/Matrix.pas.html

    P.S. Фух, я наверное пару дней вспоминал и гуглил, как же я делал этот шрифт. Код есть, он работает, а как я не помню и не понимаю.
    P.P.S. Если народу будет интересно, то я добавлю видео, как я прохожу поле 4х4 менее, чем за минуту (на примере холодильника “Братьев Пилотов”).
    P.P.P.S. Буду признателен за все замечания по орфографии и пунктуации, отправленные личным сообщением!
    Какую следующую статью вы хотите увидеть

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

    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 116
    • –11
      Либо я чайник, либо эта игра всю жизнь называлась реверси, и программируется на любом айОс за 20 минут.

      У меня вопрос, зачем перерисовывать writeln()- ом, если Вы пользуетесь asm, и можете писать сразу в видео память, начищающуюся с адреса 0xb800, если я не забыл? Она мгновенно отражает весь новый экран.
      • +7
        Реверси — игра для двух игроков. Названия этой игры я не знаю.
        • +2
          Нет, это не реверси, как уже сказали ниже.

          write/writeln, как я уже сказал — это костыли. И я уже сокрушался, что использование их избыточно. Тут просто ещё я выставлял атрибуты цвета для каждого символа (мигание, цвет и т.п.), по этому использовал. Ну плюс, просто я тогда не знал об этом :)
          • –1
            А почему реализация игры сделана в текстовом режиме??
            Можно ведь было сделать в графическом, а при загрузке стороннего VESA драйвера получить и разрешение и цвета…
            Помню в свою бытность грузил драйвер из пакета SciTech Display Doctor, там была библиотечка под DOS, как-то так:

            var 
               gd,gm : integer; 
               PathToDriver : string; 
            begin
               gd:=detect;
               gm:=0;
               PathToDriver:='C:\VESA';
               InitGraph(gd,gm,PathToDriver); 
               ...
               CloseGraph;
            end.
            • +2
              Я же написал почему в текстовом. Как минимум потому, что мне было лень разбираться с графическим. Хотя, разумеется это было бы круче и изящнее.
              • 0
                О, а я помню, как очень гордился тем фактом, что прилинковывал все драйверы к своим программам статически, и мой exe-шник не зависел от сторонних файлов…
                • 0
                  А у вас исходники драйверов были?
                  • 0
                    Интеграция видеодрайвера в.ехе делалась с помошью BINOBJ.EXE. Файл видеодрайвера *.BGI переводился в *.OBJ и прилинковывался к exe.
                    Перед InitGraph делалась загрузка в heap и регистрация драйвера, как-то так.

                    • 0
                      Грузить в heap не требовалось — драйвер был уже в памяти, вместе с остальной программой. А вообще, именно так я и делал.
            • +18
              Более того, можно прямо в Паскале массив разместить в нужном месте памяти:

              Type  ScreenChar = record
                        Symbol : char;
                        Attrib : byte;
                    end;
                    ScreenAr = array[1..25,1..80] of ScreenChar;
              Var  
                Screen : ScreenAr absolute $B800:$0000;

              До сих пор скучаю по Паскалевским массивам :-)
              • +1
                Ухты, какая красота! Надо взять на заметку. Вдруг, ВНЕЗАПНО решу переделать программу :).

                Да, после паскаля си кажется просто ужасным языком. Где нужно думать о массивах, типах присваемых данных и прочих пакостях. С другой стороны дарит недюжую гибкость.

                На самом деле, паскаль (именно паскаль) живёт и здравствует, и многие программы можно компилировать. Правда, вот конкретно эту, без допиливания виртуал паскалем скомпилировать не удалось (ругался на 32-х разрядные указатели)
                • +20
                  Прямо как старая чорно-белая фотокарточка, выпавшая из древней книги.
                  • +3
                    Ну, в Си сделать такой же трюк не сложнее (хвала Звезде Пустоты!)

                    struct ScreenChar {
                      char symbol, attrib;
                    };
                    struct Screen {
                      char volatile all[25][80];
                    };
                    static const Screen *screen = (Screen*)(void*)0xb8000000;
                    


                    Если есть ошибки, не пинайте сильно, потому что код скомпилировать и проверить уже не имею возможности :)
                    • +2
                      Ну, это на 32-х битной системе было бы отдаленно похоже на правду, а у нас ведь сегментная адресация ;-)
                      Второй ньюанс С — двумерные массивы в памяти не расположены линейно (там указатели «по измерениям»), т.е у вас тут будет «segfault».

                      А вот сделать массивы с единички будет несколько сложнее (но это уже толсто)…
                      • +8
                        Ну, это на 32-х битной системе было бы отдаленно похоже на правду, а у нас ведь сегментная адресация ;-)


                        Что не мешает полному (FAR) указателю быть 32х-битным (16 бит на сегмент, и 16 бит на смещение). Наверное, мне стоило написать
                        static const Screen * FAR screen = (Screen* FAR)(void* FAR)0xb8000000;
                        

                        или что-то в этом роде. Точно не помню.

                        Второй ньюанс С — двумерные массивы в памяти не расположены линейно


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

                        А указателей «по измерениям» там нет. Это, в частности, является причиной неприводимости типа данных int[][] к int**, из-за чего двумерный массив затруднительно передать в подпрограмму
                        • 0
                          Вы правы, как печально :-)
                          • +1
                            Что не мешает полному (FAR) указателю быть 32х-битным

                            20-битным, в действительности. Адрес вычислялся как сегмент * 16 + смещение.

                            en.wikipedia.org/wiki/Far_pointer
                            • 0
                              Физический — да, был 20-битным. Но виртуальный адрес (тот самый, который far pointer) был 32х-битным. В старших 16 битах хранился сегмент, а в младших — смещение, об этом в той статье тоже написано.
                      • 0
                        Разве с ними что–то случилось?
                    • +9
                      В своё время я тоже вдохновился этой головоломкой и тоже реализовал её, тоже на паскале. Правда, графическую, — но только 4x4. А в ходе игры дебага постепенно пришло понимание выигрышного алгоритма. В результате в игре появилась кнопка «Подсказка» :)
                      Как решить задачу с холодильником
                      1. Имеем поле 4x4, на котором N рукояток находятся в неправильном положении. Запоминаем их координаты.
                      2. Поворачиваем каждую из них (даже если предыдущий ход её повернул в правильное положение). Порядок роли не играет.
                      3. Если игра не закончилась, goto 1.

                      Хватает пары итераций.
                      • 0
                        А можно посмотреть вашу реализацию?
                        • +1
                          Как-то вот так. По различиям двух версий прослеживается профессиональный рост :)
                          Библиотеки для работы с графикой и мышкой честно набраны из книжки Фаронова.
                          • 0
                            Эх нет библиотеки мыши… Можете ещё и её прислать? А еще лучше плюс экзешники :)
                            • 0
                              Вроде же mouse.pas приложен… А компилировать мне уже и нечем :)
                              • 0
                                Точно! Я просто на айпаде, распаковал в текущую папку и потерял файлик. Сейчас пытаюсь собрать. Ворой не компилируется (ругается что не знает таких функций) второй ругается на отсутствие файла драйвера…
                        • 0
                          Можно и без итераций — довольно просто повернуть неправильную рукоятку не изменив при этом расположения других рукояток на поле.
                          • 0
                            Кстати попробовал именно на холодильнике — правда работает. Вот только поле 16 на 16 сам не запомнишь :)))
                            • +2
                              Можно без запоминания:

                              для каждого переключателя (в произвольном порядке):

                              * подсчитать число переключателей в вертикальном положении на той же строке, что и данный, учитывая, если надо его самого

                              * прибавить к нему число переключателей в вертикальном положении в том же столбце, что и данный, учитывая, если надо его самого

                              * прибавить единицу, если переключатель сам в вертикальном положении

                              * если получилось нечетное число, повернуть переключатель, иначе не делать ничего.

                              (http://www.geocities.ws/nikitadanilov/pilots/index.html)
                              • +2
                                Это решение работает только если обе стороны поля четные, потому что основывается на факте, что при повороте вентеля четность посчитанной по вашему алгоритму величины поменяется только для клетки, для которой вы поворачиваете вентель, что для случая с нечетными сторонами не так. А автор предлагает играть в игру, где размер поля не обязательно 4 на 4.
                                Есть подозрение, что решить за линию от количества вентелей для случая когда одна из сторон (или обе) нечетна, нельзя.
                                • 0
                                  Гениальная мысль сделать разные сороны и ещё и нечётные!
                                  • 0
                                    По сслыке в моем комментарии есть общее решение для прямоугольной доски N на М, где вентили имеют по К положений (в классическом случае N = M = 4, K = 2). Правда страничка побилась с того времени, как я ее написал (2002) — потерялись gif-ы, но понять можно.
                                    • 0
                                      На самом деле, решение дано для случая, когда каждый вентиль имеет разное количество положений, но оно получается итеративным. Замнкнутая форма получается для четных досок.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                        • 0
                                          думаю зависит от чётности и нечётности исходных закрашенных полей
                                          • НЛО прилетело и опубликовало эту надпись здесь
                                      • –1
                                        А если поле не квадрат, а 5х4 скажем, ваш метод будет работать?
                                        • 0
                                          На мой взгляд, проще не учитывать сам переключатель, так как первые два шага взаимокомпенсируют этот учёт. Это сводит задачу к тому, чтобы посчитать число вертикальных переключателей в кресте из горизонтального и вертикального ряда и переключить, если их нечётное число.
                                          • 0
                                            Все зависит от того, человек играет или компьютер. Человеку проще учитывать сам переключатель только один раз, для компьютера же проще подсчитать его три раза.
                                        • +2
                                          Первую программу успешно собрал, немного поправив пути внутри программы.


                                          И даже выииграл



                                          Вторую, правда собрать не удалось. Могу сказать одно: очень круто, жму руку. Реализация ещё более изящная.
                                          Не против будете, если я её ещё приложу к посту, с указанием вашего авторства?
                                          • 0
                                            Прикладывайте, конечно, не вопрос.
                                            Необычное ощущение — видеть скриншоты своей хорошо забытой программы. Как пишут ниже, ностальгией накрыло — не передать :)
                                            • 0
                                              Жаль что вторую не удалось собрать…
                                        • +2
                                          Ооох… Как ностальгией-то накрыло после прочтения, не передать.

                                          Когда-нибудь, когда я стану совсем старым, сидя у камина и покуривая трубку, таки разберу свои школьные программки, любовно в архиве переезжающие с дискеты на дискету, с на винта на винт (кстати, надо бы залить на какой Google Drive).
                                          Внукам на радость.
                                          • +13
                                            Школьные програмки надо залить на планшет, и мучать их там.

                                            А внукам будет чхать на наши программы :) У них будут уже свои финтифлюшки.

                                            Боюсь как бы не было вот так



                                          • +4
                                            Да, до сих пор испытываю ностальгию по текстовому режиму. Помнится, для своих программ рисовал окошки псевдографикой, а на столе всегда была распечатка с таблицей кодов символов. Ну и шрифты конечно тоже пробовал менять, даже редактор писал какой-то.
                                            По случаю вспоминаются следующие приколы, которые мы в институте делали с текстовым режимом под DOS
                                            1. Резидентная программа вешается на таймер, Программа сканирует текстовую видеопамять и заменяет все английские буквы на соответствующие русские. Забавный такой русификатор.
                                            2.Такая же резидентная программа, аналогичным образом все выводимые на экран слова из трех букв заменяет на одно вполне определенное слово:)

                                            • +1
                                              шрифты конечно тоже пробовал менять


                                              В годы бурной юности я писал (на заказ) поддержку графического курсора мышки для консоли под win32 (windows-95). Писалось в основном на ассемблере и активно использовались т.н. flat thunk, позволяющие вызывать 16-битный код из 32-битного. Ну и делается это путем динамического изменения шрифта (четырех символом) прямо в процессе перемещения мыши.
                                            • +1
                                              Паскаль на iPad у меня вызывает бурный восторг. Помню, лет 7 назад будучи еще школьником писал программки прямо на уроке физики на КПК Compaq, где был установлен Dosbox с Паскалем. Было очень тяжело, потому что экранчик был менее 4-х дюймов. Вот на планшете самая красота.
                                              • +1
                                                Во второй раз я жалею, что не сделал джейл на iPad:(
                                                • 0
                                                  Что мешает сделать его сейчас?



                                                  Вот так это вкусно выглядит в вертикальном положении. В купе с iFiles просто универсальный аппарат стал!
                                                  • 0
                                                    6ку не сломали еще, да и нафиг, в общем то, надо:)
                                                    • 0
                                                      Я до сих пор на четвёрке сижу. Но мне хватает для всех моих скромных задач. Ну меня первый iPad
                                                      • +1
                                                        Для устройств на A4 есть tethered джейл для 6-ки. Делается элементарно с помощью redsn0w.
                                                  • +1
                                                    Тоже хочу DOSBox на iPad, но не так то все просто
                                                    • 0
                                                      А в чем сложность?
                                                    • 0
                                                      Кстати, а почему размерности массива только по степеням двойки: 2, 4, 8, 16? Остальные не будут работать?
                                                      • 0
                                                        Будут. Просто так сложилось
                                                      • +1
                                                        Ха, я тоже писал программу для этой головоломки из «Братьев Пилотов», правда, не игровую, а для поиска решения (тогда не знал алгоритма). Уже не помню, на чем писал, скорее всего, тоже паскаль или QBasic.
                                                        • +2
                                                          Хм, а я для этого холодильника писал брутфорсер, когда не смог пройти. Благо 65535 комбинаций всего :)
                                                          • +1
                                                            Аналогично, это была одна из первых моих программ :)
                                                            • 0
                                                              А как он работал?
                                                              • +1
                                                                Ну, поле 4x4, т.е. 16 ячеек всего, ячейка два состояния имеет.
                                                                Повторное нажатие на ячейку восстанавливает первоначальное состояние => максимальное количество вентилей, которые нужно повернуть для открытия замка — 16.
                                                                Т.е. мы можем фактически записать комбинацию нажатий в два байта.
                                                                Далее повторяем логику игры, т.е. инвертируем столбец и строку соответствующей ячейки.
                                                                В качестве указания, какие ячейки нажимать в брутфорсере принимаем эти самые два байта(например, 00001000 00000001 — значит нажимаем на ячейки номер 5 и 16).
                                                                Просто перебираем все возможные комбинации байтов, т.е. 2^16, применяем к каждой комбинации правила игры и проверяем не стало ли поле обнуленным, если да — то замок открыт)

                                                                В общем, довольно тупо, но эффективно.
                                                              • 0
                                                                Хм, а я как-то решал подобную задачу динамическим программированием по профилю…

                                                                Оценка времени N * 2^(2N) (т.е. 1024 операций при N=4, не считая служебных)
                                                                • 0
                                                                  Где-то в комментариях приводили алгоритм решения, вообще без перебора. Еще я встречал где-то программу для брутфорса этого несчастного замка, она решала задачу секунд тридцать на пентиум 100 :)
                                                                  Это я к тому, что этот замок ломали многие, совершенно разными методами :)
                                                              • 0
                                                                после испраления косяков «Новичёк» тоже исправили?)
                                                                • 0
                                                                  Ага, это старые скрины
                                                                • 0
                                                                  Подскажите чем пользовались для эмуляции DOS на iPad?
                                                                  • 0
                                                                    Простите невнимательно прочитал, что нужен джейл, поэтому не мог найти эмулятор в AppStore.
                                                                    А кроме DosPad и iDOS что-то есть?
                                                                    • 0
                                                                      Scumm VM ещё по моему, она есть в апсторе. Но мне больше iDOS нравится, т.к. Это обычный dosbox, только со свистелками и перделками. У меня там даже конциг такой же как на компе
                                                                  • 0
                                                                    Чем-то напомнило вот эту (http://www.youtube.com/watch?v=WlWs73ShRxg&t=6m26s) головоломку. Она посложнее.
                                                                    • +2
                                                                      Когда играл в Братьев Пилотов, учился в универе. С друзьями проходили эти головоломки и соревновались, кто быстрее пройдет. Холодильник был самой сложной и самой запоминающейся головоломкой. У нас как раз был курс линейной алгебры, и мы пробовали решить задачу перемножением единичных матриц. Не помню точно уже как решали и что за решение получилось, но холодильник запомнился надолго.
                                                                      • +7
                                                                        «Принцип игры Flip Flop был применён в игре Братья Пилоты: По следам полосатого слона той же компании в эпизоде посещения комнаты Карбофоса в отеле.»

                                                                        image
                                                                        • 0
                                                                          О, какая красота. Даже и не слышал об этой игре! Нужно будет найти.
                                                                          • +5
                                                                            Стоит вспомнить и другие хиты этой компании с персонажами-шариками: Девятка, Балда, Lines. Это сейчас секретарши играют в пасьянс, ферму или маджонг. А раньше играли в тёплые ламповые шарики!
                                                                            • 0
                                                                              Эти-то я все знаю, а вот про окошки эти не слышал :).
                                                                              • +4
                                                                                А еще у гамоса была АйТи (Netwalk). Вот это была знатная убивалка времени.
                                                                                • 0
                                                                                  Нашел её на андроиде, до сих пор играю =)
                                                                          • +1
                                                                            Головоломка легко решается, если заметить, что изменить положение только переключателя Ai,j можно, переключив вместе с ним все переключатели в строке i и столбце j.
                                                                            • +2
                                                                              Это работает только для головоломок с четными сторонами.
                                                                            • 0
                                                                              Вот блин. А я этот холодильник так и не смог пройти, несмотря на подсказки. Так и застрял на нем
                                                                              • 0
                                                                                А оказывается она проходится за 20-30 шагов…
                                                                            • +1
                                                                              Супер, поностальгировал! =)

                                                                              Я писал игры на Atari BASIC и QBasic, было дело, в школе ещё. И, кстати, не так давно ставил этот QBasic на свой iPad, хех =)
                                                                              • +4
                                                                                Помню, у нас в компьютерном зале были запрещены игры, поэтому я написал для себя «Сапёра».
                                                                                • 0
                                                                                  Это сурово :)
                                                                                  • 0
                                                                                    :) сурово, точно!
                                                                                    я тоже когда-то писала для себя сапера в псевдогрфическом режиме…
                                                                                    весь хард бекапила в то время на десять 5-ти дюймовых дискет, такое у меня тогда старье было.
                                                                                • 0
                                                                                  Ещё в школе писал простую игру на паскале, передвигающую пятнашки стрелками. Всего один уровень, таблица рекордов и настройка цветов отображения. Исходников не осталось.
                                                                                  Эх, сейчас уже другое время…
                                                                                  • +3
                                                                                    Что мне нравилось в IT тех лет — удивительная, потрясающая совместимость. Одна платформа, и если что-то работает на более старом железе, оно может быть запущено и на новом, хоть часто и с изрядным шаманством.
                                                                                    Сейчас же, кажется, каждый житель этой планеты задался целью создать собственную платформу, ОС и язык программирования. Мириады новых устройств — планшеты, консоли, микроконтроллеры, КПК… Чем больше говорят про совместимость, тем меньше её становится. Уже даже добавка всё новых и новых уровней абстракции не спасает, настолько развился весь этот зоопарк. Раньше можно было выучить один только C++ и радоваться, т.к. он покрывал 99% всех программистских потребностей. А сейчас даже непонятно, что учить — языков расплодилось как грибов после дождя, но все они почему-то нишевые. Скоро уже дойдёт до того, что под каждую конкретную задачу придётся учить новый язык.
                                                                                    • +1
                                                                                      Скоро уже дойдёт до того, что под каждую конкретную задачу придётся учить новый язык.


                                                                                      А что, разве сейчас не так?
                                                                                  • 0
                                                                                    Пару лет назад just for fun делал такую игру на чистом html, без всяких там скриптов, для поля 4x4. Только гиперссылки, только хардкор. Какой-то добрый человек даже собрал её в один файл огромного размера, который успешно используется мной (и не только мной) для тестирования.
                                                                                    • +1
                                                                                      А возможно ли где-то такое посмотреть?
                                                                                      • +1
                                                                                        Это как? 65 536 файлов со всеми возможными состояниями игрового поля и ссылками?
                                                                                        • 0
                                                                                          Видимо да, раз «файл огромного размера». 65к файлов можно сгенерировать (если кто-то подумал, про ручной ввод).
                                                                                      • +1
                                                                                        Я графические мини демки писал на qbasic 4.5 в 9 классе, сейчас запустил в досбоксе и ностальгировал.
                                                                                        • 0
                                                                                          Покажите нам, мы тоже поностальгируем :)
                                                                                          • +1
                                                                                            Хочу записать видео, склеить его и может электронщину какую-нибудь наложить.
                                                                                            Использовал dosbox svn-daum, с него же запишу видео в выходные.

                                                                                            yadi.sk/d/BwG-TeT21vMWE
                                                                                            • 0
                                                                                              Спасибо! Вечером посмотрю.
                                                                                              • +1
                                                                                                Оставлю тут ссылку на youtube записи всех демок.
                                                                                                • 0
                                                                                                  Утром посмотрел половину ролика — впечатляет! Доделать бы это до какого-то логического конца, приляпать хорошей музыки и вышла бы просто конфетка, достойная поста на хабр.
                                                                                                  • 0
                                                                                                    Мне очень стыдно за goto и паузу пустым циклом. И еще за cls после каждого кадра.
                                                                                                    • 0
                                                                                                      goto отличный оператор, при разумном подходе.
                                                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                                                            • 0
                                                                                              Оу, супер! Как вы её только откопали?
                                                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                • 0
                                                                                                  Поиграл… Если бы вентили были бы не круглые, ещё туда-сюда. А так…
                                                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                                            • +1
                                                                                              Да, то что у них сейф, у нас только холодильник.
                                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                            • 0
                                                                                              Эх, а я написал пошаговый мультиплеерный (play by email) Морской бой на десятки человек. К сожалению, руки так и не дошли до реальной эксплуатации =(
                                                                                              • +1
                                                                                                Как же я скучаю по паскалю… Собственно и ник мой оттуда — 11 лет назад кто-то обозвал так за то что всё свободное время кодил на паскале и читал книги о «правилах красивого кода», так и прилипло.
                                                                                                • 0
                                                                                                  Что мешает на нем писать сегодня? Он живет и здравствует
                                                                                                  • 0
                                                                                                    Собственно — на прямую ничего не мешает. Только то, что на это почти никогда нет времени и еще то, что писать приходится уже на других языках в силу своей работы. Но я прекрасно помню с чего начинал. Паскаль для меня как точка старта с которой всё началось (вообще-то первым я освоил бейсик, но он не показался мне таким привлекательным после знакомства с паскалем).
                                                                                                • +2
                                                                                                  Да Вы — медвежатник, Шеф!
                                                                                                  • НЛО прилетело и опубликовало эту надпись здесь

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