Мои переменные не работают должным образом ... Но они должны в теории ... (пакетный файл) - PullRequest
0 голосов
/ 20 декабря 2018

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

set /a "22pistolammo=22pistolammo-3"
pause
goto safehouselate

А теперь для магазина, который, кажется, работает (хотя):

set /p gunstore=
if %gunstore% == 1 set /a "22silencedpistol=22silencedpistol+1"
if %gunstore% == 1 set /a "money=money-450"
if %gunstore% == 2 set /a "22pistolammo=22pistolammo+10"
if %gunstore% == 2 set /a "money=money-10
if %money% lss 0 goto gunstoredeath
if %gunstore% == 3 goto fargomarketstreet
goto gunstore

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018
set "_money=500"
set "_22pistolammo=500"
set /a "_22pistolammo-=3"

set "_gunstore=0"
set /p "_gunstore="
if %_gunstore% == 1 set /a "_22silencedpistol+=1"
if %_gunstore% == 1 set /a "_money-=450"
if %_gunstore% == 2 set /a "_22pistolammo+=10"
if %_gunstore% == 2 set /a "_money-=10
if %_money% lss 0 echo goto gunstoredeath
if %_gunstore% == 3 echo goto fargomarketstreet
echo goto gunstore
set _

Это похоже на код вопроса.Переменные начинаются со знака подчеркивания, чтобы избежать переменных, начинающихся с числа, которое может быть недопустимым, и его легко вывести с помощью set _ для этих примеров.

Проблема: это может привести к синтаксической ошибке, если вы введете пробел или другие специальныесимвол в строке ввода.


set "_money=500"
set "_22pistolammo=500"
set /a "_22pistolammo-=3"

choice /c 123 /N
if errorlevel 1 (set /a "_22silencedpistol+=1" & set /a "_money-=450")
if errorlevel 2 (set /a "_22pistolammo+=10" & set /a "_money-=10")
if %_money% lss 0 echo goto gunstoredeath
if errorlevel 3 echo goto fargomarketstreet

echo goto gunstore
set _

Используется if errorlevel.Если в приглашении введено 3, все условия будут запущены из-за того, что if errorlevel 1 равно 1 или больше, что верно, if errorlevel 2 равно 2 или больше, что верно, и if errorlevel 3 равно 3 или больше,что также верно.

Проблема: ошибка.


Чтобы проверить с помощью if errorlevel, вам может потребоваться проверка от наивысшего к низшему.

Блок типаэто можно попробовать:

if errorlevel 3 (
    echo goto fargomarketstreet
) else if errorlevel 2 (
    set /a "_22pistolammo+=10"
    set /a "_money-=10"
) else if errorlevel 1 (
    set /a "_22silencedpistol+=1"
    set /a "_money-=450"
)

Это может сработать, за исключением того, что первоначальная последовательность - это проверка 1, проверка 2, проверка денег, а затем проверка 3. Если вы вынуждены сначала проверить 3, то проверка денег должна бытьпроверено перед проверкой 3, что слишком рано для проверки 1 (которая корректирует деньги) и проверки 2 (которая корректирует деньги).

Проблема: ошибка.


Использование if %errorlevel% вместо if errorlevel дает поведение, аналогичное 1-му коду:

set "_money=500"
set "_22pistolammo=500"
set /a "_22pistolammo-=3"

choice /c 123 /N

if %errorlevel% equ 1 (
    set /a "_22silencedpistol+=1"
    set /a "_money-=450"
) else if %errorlevel% equ 2 (
    set /a "_22pistolammo+=10"
    set /a "_money-=10"
)

if %_money% lss 0 echo goto gunstoredeath

if %errorlevel% equ 3 echo goto fargomarketstreet

if %_money% lss 0 echo goto gunstoredeath
echo goto gunstore
set _

Проверяет 1, еще проверяет 2, проверяет деньги, затем проверяет 3.

Проблема: неизвестна.(за исключением choice не существует в Windows XP).


Примечание :

Все приведенные выше коды отключены goto с использованием ведущего echo, так как в коде нет меток для goto.

Проверка 3 может означать проверку значения со значением 3 и т. д. Я хотел бы избежать обобщения огромной суммы с длинными повторяющимися терминами.

Предложите использовать 1-й код (с использованием set /p) или последний (с использованием choice).

Переменные не могут начинаться с чисел, так как %22silencedpistol% будет проанализирован как %2, что2-й ( script | называется label ) аргумент, а затем анализирует 2silencedpistol%, что может вызвать синтаксическую ошибку.Синтаксический анализатор не знает, что %22silencedpistol% является одной переменной, и соглашается на ленивое совпадение %2, которое он распознает 1-м.

0 голосов
/ 20 декабря 2018

Некоторый более простой код, который может исправить ваш код:

set /a "_22pistolammo-=3"
pause
goto safehouselate
choice /c:123 /N
if %errorlevel% EQU 1 ( set /a "_22silencedpistol+=1" && set /a "money-=450" )
if %errorlevel% EQU 2 ( set /a "_22pistolammo+=10" && set /a "money-=10" )
if %money% lss 0 goto gunstoredeath
if %errorlevel% EQU 3 goto fargomarketstreet
goto gunstore

Сокращенные переменные в set /a.Заменены переменные, содержащие числа.Прочтите страницу справки set /a, нажав set /? в новом окне cmd

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