Как я могу исправить синтаксическую ошибку в моей игре? - PullRequest
0 голосов
/ 13 апреля 2020

У меня проблема с одной игрой. Мне нужно отремонтировать это. Вот описание игры:

  1. Игра выбирает число от 1 до 1000
  2. Вам нужно угадать его
  3. Когда вы пишете большее число на экране появляется «Мой номер меньше!»
  4. Когда вы пишете более низкое число, на экране появляется «Мой номер больше!»
  5. Когда вы угадываете, на экране появляется число «Поздравляем! Вы угадал мой номер в [...] попытках! "

У меня проблема с кодом шагов 3 и 4. Вот код:

@echo off
color a
title Guess the number
:play
set /a num=%random%%% 100+1
(
echo %num%
)
cls
echo Guess the number
set /p guess=:
if %guess%==%%%num%-1 +1 goto lower
if %guess%==%num%+1 +1 goto bigger
if %guess%==%num% goto win
:bigger
set /a done=%done%+1
echo My number is lower!
set /a done=%done%+1
:lower
echo My number is bigger!
:win
echo Congrats! You guessed my number in %done% tries!
choice /n /c:YN /m "Do you want to play again? [Y/N]"
if errorlevel==2 goto end
if errorlevel==1 goto play
:end
echo Goodbye
pause
exit

Спасибо заранее!

1 Ответ

0 голосов
/ 13 апреля 2020

Все IF условия записаны неправильно, как это объясняется выводом справки при запуске в командной строке if /?.

  1. Оператор сравнения == - это оператор сравнения строк, а не оператор сравнения целочисленных значений.
  2. Всегда должен быть пробел слева и справа от оператора для 100% правильного синтаксиса, для которого Windows командному процессору не требуется автоматически обнаруживать и исправлять командную строку перед выполнением команды IF .
  3. Код выхода команды или исполняемого файла оценивается с помощью синтаксиса
    IF [NOT] ERRORLEVEL number command
    , как уже объяснялось на первой странице справки команды IF .

Рекомендую прочитать:

Вот код с комментариями для этой игры, который должен угадать пользователь случайное число в диапазоне от 1 до 100 полностью переписано для обеспечения отказоустойчивости при неправильном вводе пользователем.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
color 0A
title Guess the number

:GetNumber
set /A RandomNumber=%RANDOM% %% 100 + 1
set "TrialCount=0"
cls

:UserPrompt
set "UserNumber="
set /P "UserNumber=Guess the number: "

rem Verify the user input.
rem Has the user not entered something at all?
if not defined UserNumber goto UserPrompt
rem Remove all double quotes from entered string.
set "UserNumber=%UserNumber:"=%"
rem Has the user entered only one or more double quotes?
if not defined UserNumber goto UserPrompt
rem Has the user entered any non-digit character?
for /F delims^=0123456789^ eol^= %%I in ("%UserNumber%") do goto UserPrompt

set /A TrialCount+=1
rem Remove all leading zeros.
for /F "tokens=* delims=0" %%I in ("%UserNumber%") do set "UserNumber=%%I"

rem If the entered number was 0, it is too small.
if not defined UserNumber echo My number is bigger!& goto UserPrompt

rem Has the entered number more than three digits?
if not "%UserNumber:~3,1%" == "" echo My number is smaller!& goto UserPrompt

rem Is the entered number greater than the random number?
if %UserNumber% GTR %RandomNumber% echo My number is smaller!& goto UserPrompt

rem Is the entered number less than the random number?
if %UserNumber% LSS %RandomNumber% echo My number is bigger!& goto UserPrompt

if %TrialCount% == 1 (set "PluralS=") else set "PluralS=s"
echo Congratulations! You guessed my number in %TrialCount% attempt%PluralS%!
%SystemRoot%\System32\choice.exe /C:NY /N /M "Do you want to play again? [Y/N]"
if errorlevel 2 goto GetNumber

echo/
echo Goodbye
echo/
pause

rem Restore initial execution environment.
color
endlocal

Некоторые рекомендации, не записанные в других ссылочных ответах:

  1. Пакетный файл не должен зависеть от среды выполнения, определенной вне пакетного файла. Расширения команд включены, а расширение с задержкой отключено по умолчанию Windows, но это не означает, что это верно и для командного файла при его выполнении пользователем в любом случае. Этот пакетный файл требует включенных расширений команд и отключенного отложенного расширения, а также отключенного режима эха. По этой причине приведенный выше пакетный файл гарантирует, что требуемая среда выполнения задается самим пакетным файлом.

  2. Рекомендуется всегда указывать цвет фона и цвет текста при использовании команды COLOR . Не рекомендуется зависеть от Windows значений по умолчанию при использовании COLOR . Каждый пользователь имеет право определять свои собственные значения по умолчанию для Windows командной строки windows. Пользователь мог определить использование зеленого цвета в качестве фона и черного в качестве цвета текста. В этом случае ваш пакетный файл выводит зеленый текст на зеленый фон с помощью команды COLOR , чтобы определить только зеленый цвет текста и сохранить цвет фона, как определено пользователем.

  3. Обычно команду EXIT не следует использовать в пакетном файле без опции /B, чтобы завершить только обработку пакетного файла, а не весь командный процесс. Это позволяет отлаживать пакетный файл . Приведенный выше пакетный файл можно выполнить двойным щелчком по пакетному файлу или запустив его из окна командной строки один или несколько раз. См. Также: Куда GOTO: EOF возвращается?

  4. См. одну строку с несколькими командами с использованием Windows пакетный файл для объяснения оператора &, использованного в приведенном выше пакетном файле несколько раз для выполнения команды ECHO AND и команды GOTO в условии IF , имеющем значение true в одной командной строке. Между ! и оператором & нет пробела, чтобы не печатать завершающий пробел при печати сообщения в окне консоли, хотя пользователи не увидят этот завершающий пробел.

  5. Первоначальный среда выполнения должна быть восстановлена ​​перед выходом из пакетного файла. Командный процессор Windows запускает неявное ENDLOCAL для каждого SETLOCAL без явного выполнения ENDLOCAL перед выходом из обработки пакетного файла. Так что команда endlocal в последней строке не будет действительно нужна. Но цвета консоли должны быть восстановлены, потому что пользователь может запустить пакетный файл также из окна командной строки и ожидает восстановления предпочтительных цветов при выходе из пакетного файла. Это делается с помощью команды COLOR . Командный процессор Windows не запускает неявную команду COLOR перед выходом из пакетного файла.

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

  • choice /?
  • cls /?
  • color /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?
  • title /?
...