Ненормальное программирование

индекс
285,91

Ностальгия: «Ящеры» на батнике

Все мы помним свой первый компьютер, а если вы программист, то и первую программу. Первым компьютером у меня был ZX-Spectrum, а первой написанной под него программой была игрушка «Ящеры» на Бейсике. Ну, если быть честным, то я ее просто переписал из одной книги1, попутно разбираясь в коде и исправляя допущенные автором ошибки :)

2.jpg - Picamatic - upload your images

Решил я дать вторую жизнь вышеуказанной игрушке. Но переписать ее на любом из известных мне языков было бы слишком просто. А так как я люблю писать батники, то переписал я ее на последних :)



Самая большая сложность в неподдержке батниками массивов, поэтому пришлось немножко поизвращаться :) Игра самообучающаяся (примитивный AI), состоит из самой игры (pangolins.cmd) и базы вопросов (questions.txt).

Описание из книги:

Вторая программа (программа № 2) — игра «Ящеры», в которой компьютер отгадывает название животного, задуманного играющим. При этом компьютер задает вопросы, а играющий отвечает только «да» или «нет». Если компьютер не был ранее «знаком» с таким животным, то он «попросит» задать ему наводящие вопросы или «предложит» ему новое название.


image

Не знаю, есть ли смысл описывать, как все работает, поэтому если будут конкретные вопросы по коду – спрашивайте в комментариях ;)

@echo off
:begin

set qfile=questions.txt
set tfile=questions_tmp.txt
set cursor=1
set prew_cursor=1
set count=
rem -----------------------------------------------------------------------

echo Задумай животное и нажми любую клавишу для продолжения...
pause > nul


call :get_current

:get_answer

set answer=
set /p answer=%question% [д]/н:

set prew_cursor=%cursor%
set prew_answer=%answer%
if not "%answer%"=="н" (
  set cursor=%yes_id%
) else (
  set cursor=%no_id%
)

call :get_current

if not "%yes_id%"=="0" (
  goto :get_answer
)

set answer=
set /p answer=Это %question%. Я угадал? [д]/н:

if not "%answer%"=="н" (
  echo Я так и думал.
  goto :end
)

rem -----------------------------------------------------------------------

call :get_count
set /a new_animal_id=%count%+1
set /a new_question_id=%count%+2

call :update_current

:get_new_animal
set new_animal=
set /p new_animal=Хм. Странно. Хорошо, а что это?:
if "%new_animal%"=="" (
  goto :get_new_animal
)

echo %new_animal%:0:0>> %qfile%

:get_new_question
set new_question=
set /p new_question=Напиши, пожалуйста, вопрос, который характеризует различия между животными %new_animal% и %question%:
if "%new_question%"=="" (
  goto :get_new_question
)

set right_answer=
set /p right_answer=И какой правильный ответ для животного %new_animal% [д]/н:
if not "%right_answer%"=="н" (
  echo %new_question%:%new_animal_id%:%cursor%>> %qfile%
) else (
  echo %new_question%:%cursor%:%new_animal_id%>> %qfile%
)




goto :end
rem -----------------------------------------------------------------------

:get_count
for /f "delims=:" %%i in ('findstr /r /n .* %qfile%') do set count=%%i
rem Количество строк на единицу меньше (пустая строка в конце)
rem set /a count=%count%-1
exit /b



:get_current
for /f "tokens=1-4 delims=:" %%i in ('findstr /r /n .* %qfile%') do call :get_current_callback %%i "%%j" %%k %%l
exit /b

:get_current_callback
if "%~1"=="%cursor%" (
  set question=%~2
  set yes_id=%~3
  set no_id=%~4
)
exit /b



:update_current
if exist %tfile% (
  del %tfile%
)

for /f "tokens=1-4 delims=:" %%i in ('findstr /r /n .* %qfile%') do call :update_current_callback %%i "%%j" %%k %%l
copy /y %tfile% %qfile% > nul
exit /b

:update_current_callback
if "%~1"=="%prew_cursor%" (
  if not "%prew_answer%"=="н" (
    echo %~2:%new_question_id%:%~4>> %tfile%
  ) else (
    echo %~2:%~3:%new_question_id%>> %tfile%
  )
) else (
  echo %~2:%~3:%~4>> %tfile%
)
exit /b



rem -----------------------------------------------------------------------
:end
set answer=
set /p answer=Еще раз? [д]/н:

if not "%answer%"=="н" (
  goto :begin
)


Скачать (1,4 кБ)

  1. О.С.Боровик, А.В.Парфенов, В.И.Сырямкин. Увлекательные игры на бытовом компьютере, МГП «Раско», Томск, 1992г.
+63
20 октября 2009, 16:55
13

комментарии (39)

+22
collapse #
Мда… а вы говорите objective-C и iPhone
+14
kykapa4a #
Ждём от вас реализацию на Brainfuck.
+2
naryl #
К сожалению в Brainfuck отсутствует возможность файлового ввода-вывода, а вот на Befunge — вполне. Язык похож на Haskell или Prolog тем что после нескольких дней/недель/месяцев ломания мозга программки начинают писаться достаточно легко. Но в отличие от последних для неподготовленного читателя выглядит как прямоугольник, забитый кучей произвольных символов.
+2
naryl #
Ах да, и производительность у него приблизительно в 100 раз хуже, чем у BF.
0
VlK #
М-м-м-мда. Батники. Прелесть просто. :)
+5
i_bobr #
А я Sokoban писал на Спектруме.
+1
sith #
И я. На basic, и при этом не очень шустро человечек ходил. Т.е. алгоритм был примерно такой — какой-то там опрос клавиатуры, и ужасно длинная конструкция со множеством вложений if then, типа если нажали вправо и справа стенка, то не ходи, затем, после хода — одно из самых тормозных (как это не странно) мест в коде — проверка на то, что все ящики стоят на своих местах, что перегревало и так не турбированый Z80 )
+2
NemeZZiZZ #
У Вас был какой-то деревянный Z80: мой Sokoban летал отлично.
+2
pcmaniac #
То вы неправильно писали ;)
–4
pcmaniac #
Писали
+3
Sharn #
А я писал на фокале, интерпретатор которого находился на отдельном картридже для БК0010-01. Вот это мегакруто!
0
Medlay #
Я тоже. :) Особенно удивляет что команды все там можно было до одной буквы сокращать.
+2
AlexcYeCu #
Я так понял, «арканоид на баше» подвинули?
0
andreysmind #
А я только про Тетрис на sed читал.
+3
A1lfeG #
Мои первые программы на спектруме — это вставка магических PEEK в загрузчик некоторых игр чтобы получить плюшки:))
+3
i_bobr #
Не POKE?
+3
kozyabozya #
POKE конечно, POKE — писать, PEEK — читать, например: POKE 54192,255;
0
A1lfeG #
POKE!!! и точно…

Таки пропил память… :(
+1
mmmm1982 #
первый опыт программирования был на чуде совецкой передовой мысли — микрокалькуляторе электронника мк-64
иногда транцисторы внутри перегревались и калькулятор реально вис
0
mdk #
У меня это был МК-52 с внешними картриджами :) Не вис ни разу, а уж сколько игр я на нем запускал )))
0
Kakysha #
Ой-ой с Колбасой! Ну проблема не ваша, а моя, но в Win7 не кажет русские символы (в ANSII), а в UTF-8 так вообще начинает ругаться на код, видимо изза BOM…
0
Tokolist #
В архиве все в дос-кодировке (OEM) и нормально работает на Семерке (проверял).
Если хотите в другой, то попробуйте поменять шрифт консоли и/или поэкспериментировать с командой chcp ;)
+2
nik_a #
На ZX Spectrum 48 КБ, помню в очень молодом возрасте игру крестики-нолики учудил. Еще свою MUD начал писать, но очень не торопясь, так и не дописал )
–3
COOL_ALMANAH #
Очень тяжело разобраться в коде, который вы привели. Если не сложно, можете описать в нескольких шагах алгоритм работы программы без непосредственно кода? Чтобы только можно было понять логику?
+2
Tokolist #
Ненавижу рисовать блок-схемы, но для вас сделал исключение :) Вот несколько упрощенный алгоритм игрушки:

Diagram_1.jpg - image uploaded to Picamatic
0
COOL_ALMANAH #
Спасибо.
0
romanoza #
А у меня такой был: en.wikipedia.org/wiki/Dubna_48K
Вроде и не писал на нем ничего, т.к. был в 1м классе в то время, за исключением копипаста из мануала: всякие кружки и т.д. Ну, и, конечно, не без игр с кассетки :)

эээх
+1
biGGer #
Для тех у кого проблемы с русскими символвами, нужно в свойствах батника поменять шрифт на Lucida Console
+1
pcmaniac #
А я в своё время начинал на каких-то модификациях спектрума 48 в «компьютерном клубе» таким-же копипастом и оптимизациями готовых программ. А после того как окреп — выбил с родителей чудо советского плагиата — Электронику МС-1502 с 5.25" дисководом на 720Kb. На винт денег не хватило т.к. винт на 10Mb стоил как цветной телевизор) Но и на этом чуде техники было написано дофига игр-однодневок с оригинальными сюжетами а-ля «летающие и стреляющие шарики»… Эх… ностальгия)
+1
misha91 #
ностальгия, не то слово…
–1
Tolsi #
Увлекательные игры на бытовом компьютере… такие увлекательные =)
+2
WhiteDragon #
Мда… Загадал жирафа. Программа отгадала его с 3-го вопроса. Ну что за день…
+1
don #
а я вот слона, пришлось учить неразумную)
0
Prapor #
Мой первый компьютер был ПК «Веста»
ПК8000 («Сура», «Веста», «Хобби»)
Первая программа на Бейсике — Питон пожирающий яблочки.
Списана и исправлена из какого-то советского журнала.
Потом был Сокобан.
+1
mvgolubev #
> rem Количество строк на единицу меньше (пустая строка в конце)
> rem set /a count=%count%-1

Для пометки закомментированных строк в пакетных командных файлах (.cmd/.bat) лучше вместо REM использовать двойное двоеточие (::) в начале строки. Это и при наборе быстрее, и при прочтении батника гораздо удобнее, т.к. более явно выделяет закомментированные строки. Обрабатывается это точно так же, как и rem.
0
Tokolist #
Для меня привычнее rem и нормальные редакторы подсвечивают его как комментарий. Но спасибо — не знал :) Век живи, век учись.
0
Albinos #
тоже писал игрушки на спектруме. было сложно… холодильник был злейшим врагом :)
0
mihailm #
интересный батник… надо попробовать на досуге!

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