Pull to refresh

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

Reading time 3 min
Views 6.3K
Все мы помним свой первый компьютер, а если вы программист, то и первую программу. Первым компьютером у меня был 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г.
Tags:
Hubs:
+63
Comments 39
Comments Comments 39

Articles