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

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

Не знаю, есть ли смысл описывать, как все работает, поэтому если будут конкретные вопросы по коду – спрашивайте в комментариях ;)
Скачать (1,4 кБ)
Решил я дать вторую жизнь вышеуказанной игрушке. Но переписать ее на любом из известных мне языков было бы слишком просто. А так как я люблю писать батники, то переписал я ее на последних :)
Самая большая сложность в неподдержке батниками массивов, поэтому пришлось немножко поизвращаться :) Игра самообучающаяся (примитивный AI), состоит из самой игры (pangolins.cmd) и базы вопросов (questions.txt).
Описание из книги:
Вторая программа (программа № 2) — игра «Ящеры», в которой компьютер отгадывает название животного, задуманного играющим. При этом компьютер задает вопросы, а играющий отвечает только «да» или «нет». Если компьютер не был ранее «знаком» с таким животным, то он «попросит» задать ему наводящие вопросы или «предложит» ему новое название.

Не знаю, есть ли смысл описывать, как все работает, поэтому если будут конкретные вопросы по коду – спрашивайте в комментариях ;)
@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 кБ)
- О.С.Боровик, А.В.Парфенов, В.И.Сырямкин. Увлекательные игры на бытовом компьютере, МГП «Раско», Томск, 1992г.