【问题标题】:How do I use the for statement to cut away too many if statements in Windows Batch?如何使用 for 语句去除 Windows Batch 中过多的 if 语句?
【发布时间】:2020-08-05 21:22:57
【问题描述】:

我正在尝试在我的游戏中制作盔甲和武器买卖系统,但我是一名初学者,不知道如何使用“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

【问题讨论】:

  • for 命令用于迭代事物(即,对集合中的每个项目执行某些操作)。我不认为它做你认为它做的事。我建议先阅读for /? 帮助。 (我还建议从 PowerShell 开始,而不是 cmd 批处理/shell 脚本代码;它具有更好的代码结构,并取消了 goto。)
  • 您要做的是创建一个键值对。我知道我们在这里有一个关于如何做到这一点的很好的问答。我现在找不到它。
  • 当下标不是数字时,您想使用arrayassociative array

标签: batch-file


【解决方案1】:

基本上,您可以做的就是某些人所说的键值对或查找图。据我所知,这可以通过两种方式完成。

第一个选项将所有键值对设置为单个变量。然后进行两次字符串替换,从选择命令设置的键索引中提取正确的值。

@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

第二个选项创建一个键值对数组。数组索引由choice命令再次设置,然后用来获取对应的数组值。

@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

【讨论】:

  • 好方法,加1..如果可以的话,在第二个例子中,你可以在循环的最后一行添加echo !m!. %%G,然后在@之前去掉整个echo N. Name列表987654325@
  • 你也可以把set "index=%errorlevel%"去掉,改成set "armor=!armor[%index%]!" tp set armor=!armor[%errorlevel%]!
  • 两者都有效。我最终使用了键盘映射版本,因为“setlocal enabledelayedexpansion”导致了一些问题。显然,如果你在保存它不保存的数据之前结束本地化,它会删除句子中的所有感叹号,以及之后的潜在句子。但它们都有效;谢谢!
【解决方案2】:

为了给出@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

【讨论】:

    【解决方案3】:

    另一个版本! ;)

    @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%
    

    【讨论】:

      猜你喜欢
      • 2023-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多