Как использовать оператор for, чтобы вырезать слишком много операторов if в Windows Batch? - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь создать в своей игре системы покупки и продажи доспехов и оружия, но я начинающий программист и понятия не имею, как использовать оператор «for». На данный момент у меня есть некоторый функциональный код, но он абсолютно громоздкий и непонятный. Я хочу попытаться использовать оператор for, чтобы сократить его, но не знаю как. Кто-нибудь может мне помочь? Спасибо. В настоящее время я использую этот нежелательный код:

cls
echo What armor do you want to change to?
echo[
echo 1. None
echo 2. Leather
echo 3. Wooden
echo 4. Stone
echo 5. Bronze
echo 6. Iron
echo 7. Titanium
echo 8. Adamantium
echo[
choice /c 12345678 /m "What'll it be, %name%?"
if %errorlevel%==8 (
cls
set armor=Adamantium
echo It is done!
pause
goto start
)
if %errorlevel%==7 (
cls
set armor=Titanium
echo It is done!
pause
goto start
)
if %errorlevel%==6 (
cls
set armor=Iron
echo It is done!
pause
goto start
)
if %errorlevel%==5 (
cls
set armor=Bronze
echo It is done!
pause
goto start
)
if %errorlevel%==4 (
cls
set armor=Stone
echo It is done!
pause
goto start
)
if %errorlevel%==3 (
cls
set armor=Wooden
echo It is done!
pause
goto start
)
if %errorlevel%==2 (
cls
set armor=Leather
echo It is done!
pause
goto start
)
cls
set armor=None
echo It is done!
pause
goto start

Ответы [ 3 ]

1 голос
/ 07 августа 2020

Другая версия! ;)

@echo off & setlocal EnableDelayedExpansion

set "armors=None Leather Wooden Stone Bronze Iron Titanium Adamantium"
set "m=1" & set "armor[!m!]=%armors: =" & set /A m+=1 & set "armor[!m!]=%"

for /L %%i in (1,1,%m%) do echo %%i. !armor[%%i]!
echo/
choice /n /c 12345678 /m "What'll it be?"
set "armor=!armor[%errorlevel%]!"
echo %armor%
1 голос
/ 06 августа 2020

По сути, то, что вы можете сделать, это то, что некоторые люди называют парой "ключ-значение" или картой поиска. Это можно сделать двумя известными мне способами.

Первый вариант устанавливает все пары ключ-значение в одну переменную. Затем выполняются две подстановки строк, чтобы извлечь правильное значение из индекса ключа, установленного командой выбора.

@echo off
cls
SET keymap=1-None;2-Leather;3-Wooden;4-Stone;5-Bronze;6-Iron;7-Titanium;8-Adamantium
echo What armor do you want to change to?
echo(
echo 1. None
echo 2. Leather
echo 3. Wooden
echo 4. Stone
echo 5. Bronze
echo 6. Iron
echo 7. Titanium
echo 8. Adamantium
echo(
choice /c 12345678 /m "What'll it be?"
set "index=%errorlevel%"
CALL SET armor=%%keymap:*%index%-=%%
SET armor=%armor:;=&rem.%
echo Armor = %armor%
pause

Второй вариант создает массив пар значений ключа. Индекс массива снова устанавливается командой выбора и затем используется для получения соответствующего значения массива.

@echo off
setlocal enabledelayedexpansion
set "m=0"
for %%G in (None Leather Wooden Stone Bronze Iron Titanium Adamantium) do (
    set /A m+=1
    set "armor[!m!]=%%G"
)
echo(
echo 1. None
echo 2. Leather
echo 3. Wooden
echo 4. Stone
echo 5. Bronze
echo 6. Iron
echo 7. Titanium
echo 8. Adamantium
echo(
choice /c 12345678 /m "What'll it be?"
set "index=%errorlevel%"

set "armor=!armor[%index%]!"
echo Armor = %armor%
pause
endlocal
0 голосов
/ 06 августа 2020

Чтобы дать немного более короткую версию ответа @Squashman, и это просто сокращенная версия, НЕ помечайте его как правильный ответ, поскольку оригинал не был отправлен мной.

@echo off & setlocal enabledelayedexpansion
set "m=0"
for %%G in (None Leather Wooden Stone Bronze Iron Titanium Adamantium) do (
    set /A m+=1
    set "armor[!m!]=%%G"
    echo !m!. %%G
)
echo(
choice /c 12345678 /m "What'll it be?"
set armor=!armor[%errorlevel%]!
echo %armor% & pause
goto :start
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...