Pull to refresh

Comments 116

Либо я чайник, либо эта игра всю жизнь называлась реверси, и программируется на любом айОс за 20 минут.

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

write/writeln, как я уже сказал — это костыли. И я уже сокрушался, что использование их избыточно. Тут просто ещё я выставлял атрибуты цвета для каждого символа (мигание, цвет и т.п.), по этому использовал. Ну плюс, просто я тогда не знал об этом :)
А почему реализация игры сделана в текстовом режиме??
Можно ведь было сделать в графическом, а при загрузке стороннего 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.
Я же написал почему в текстовом. Как минимум потому, что мне было лень разбираться с графическим. Хотя, разумеется это было бы круче и изящнее.
О, а я помню, как очень гордился тем фактом, что прилинковывал все драйверы к своим программам статически, и мой exe-шник не зависел от сторонних файлов…
А у вас исходники драйверов были?
Интеграция видеодрайвера в.ехе делалась с помошью BINOBJ.EXE. Файл видеодрайвера *.BGI переводился в *.OBJ и прилинковывался к exe.
Перед InitGraph делалась загрузка в heap и регистрация драйвера, как-то так.

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

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

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

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

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

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


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

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


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

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

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


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

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

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

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

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

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

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

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

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

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

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


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



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

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

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

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



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

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


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



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

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

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

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

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


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

yadi.sk/d/BwG-TeT21vMWE
Спасибо! Вечером посмотрю.
Оставлю тут ссылку на youtube записи всех демок.
Утром посмотрел половину ролика — впечатляет! Доделать бы это до какого-то логического конца, приляпать хорошей музыки и вышла бы просто конфетка, достойная поста на хабр.
Мне очень стыдно за goto и паузу пустым циклом. И еще за cls после каждого кадра.
goto отличный оператор, при разумном подходе.
UFO just landed and posted this here
UFO just landed and posted this here
Оу, супер! Как вы её только откопали?
UFO just landed and posted this here
Поиграл… Если бы вентили были бы не круглые, ещё туда-сюда. А так…
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Эх, а я написал пошаговый мультиплеерный (play by email) Морской бой на десятки человек. К сожалению, руки так и не дошли до реальной эксплуатации =(
Как же я скучаю по паскалю… Собственно и ник мой оттуда — 11 лет назад кто-то обозвал так за то что всё свободное время кодил на паскале и читал книги о «правилах красивого кода», так и прилипло.
Что мешает на нем писать сегодня? Он живет и здравствует
Собственно — на прямую ничего не мешает. Только то, что на это почти никогда нет времени и еще то, что писать приходится уже на других языках в силу своей работы. Но я прекрасно помню с чего начинал. Паскаль для меня как точка старта с которой всё началось (вообще-то первым я освоил бейсик, но он не показался мне таким привлекательным после знакомства с паскалем).
UFO just landed and posted this here
Sign up to leave a comment.

Articles

Change theme settings