跳过FOR循环中的特定迭代

问题描述 投票:-2回答:1

在我使用Batch编程的游戏中,使用特定函数来绘制具有预设tileset的地图。它相当复杂,绘制整个全彩色地图需要花费几秒钟的时间。

我想为玩家添加一个图标。我想完全在图形子程序中实现它,而不是改变地图数据。

现在,图标显示,但它将整个图形线推回一个空间。我想让它跳过播放器位于其上的磁贴,但是这样做的唯一方法似乎是在BASIC中执行类似于你的NEXT命令。我不知道批次相当于此,所以我来这里寻求帮助。在绘制播放器磁贴后,我需要跳过FOR循环的特定迭代。

没有相当多的上下文,这没有多大意义,但这里是子程序:

:D
REM Draw tiles
IF /I %OSV% LSS 3 (
FOR /L %%G IN (0,1,31) DO (
    REM Old tileset
    IF "%2" == "1" IF "%%G" == "%X%" CALL :C 0C "i" & REM skip the rest
    IF "!M%MAP%%1:~%%G,1!" == "0" CALL :C 00 " "
    IF "!M%MAP%%1:~%%G,1!" == "1" CALL :C 2A "w"
    IF "!M%MAP%%1:~%%G,1!" == "2" CALL :C 87 "S"
    IF "!M%MAP%%1:~%%G,1!" == "3" CALL :C 6E "W"
    IF "!M%MAP%%1:~%%G,1!" == "4" CALL :C 0A "T"
    IF "!M%MAP%%1:~%%G,1!" == "5" CALL :C 0A "n"
    IF "!M%MAP%%1:~%%G,1!" == "6" CALL :C 6E "H"
    IF "!M%MAP%%1:~%%G,1!" == "7" CALL :C 91 "m"
    IF "!M%MAP%%1:~%%G,1!" == "8" CALL :C 19 "m"
    IF "!M%MAP%%1:~%%G,1!" == "9" CALL :C B3 "M"
    IF "!M%MAP%%1:~%%G,1!" == "A" CALL :C 4C "m"
    IF "!M%MAP%%1:~%%G,1!" == "B" CALL :C C4 "M"
    IF "!M%MAP%%1:~%%G,1!" == "C" CALL :C 6E "O"
    IF "!M%MAP%%1:~%%G,1!" == "D" CALL :C 6E "W"
    IF "!M%MAP%%1:~%%G,1!" == "E" CALL :C 78 "W"
    IF "!M%MAP%%1:~%%G,1!" == "F" CALL :C 0D "X"
    IF "!M%MAP%%1:~%%G,1!" == "G" CALL :C 6E "E"
    IF "!M%MAP%%1:~%%G,1!" == "H" CALL :C 48 "E"
    IF "!M%MAP%%1:~%%G,1!" == "I" CALL :C 68 "n"
    IF "!M%MAP%%1:~%%G,1!" == "J" CALL :C 6E "m"
    IF "!M%MAP%%1:~%%G,1!" == "K" CALL :C E6 "W"
    IF "!M%MAP%%1:~%%G,1!" == "L" CALL :C 6A "T"
    IF "!M%MAP%%1:~%%G,1!" == "M" CALL :C 2A "w"
    IF "!M%MAP%%1:~%%G,1!" == "N" CALL :C 87 "S"
    IF "!M%MAP%%1:~%%G,1!" == "O" CALL :C 0D "i"
    IF "!M%MAP%%1:~%%G,1!" == "P" CALL :C 6A "Y"
    IF "!M%MAP%%1:~%%G,1!" == "Q" CALL :C BF "C"
)
)
GOTO :EOF

请注意我删除了高级(“Fancy”)tileset,因为它增加了更多的复杂性并且在这里没有正确显示。

在绘制角色(第六行)之后,我需要跳过序列的其余部分以防止它绘制玩家站在顶部的图块。

传递给函数的变量是:

  • %1 - 要绘制的Y值
  • %2 - 玩家是否在此Y值上

除了终端之外,没有输出通过C功能,它只是绘制一个彩色字符。

任何想法都会很棒。

编辑:这是一些没有播放器图标的示例输出。红色数字表示玩家的位置。我想用玩家的图标替换此位置的牌。

Overworld截图

Overworld screenshot

沙漠截图

Desert screenshot

windows batch-file
1个回答
0
投票

你没有创建一个MCVE,你的代码没有意义,因为如果它在第6行之后停止,那么剩下的就没用了,并且不需要循环32次。因此,这只是一个例子

要在条件为真时阻止块运行,只需反转条件

FOR /L %%G IN (0,1,31) DO (
    rem Things that will done every time
    IF NOT "%%G" == "6" (do something) else (
        rem Things that will be done when %%G != 6
        rem i.e. if %%G != 6 next
    )
)

在这种情况下,如果要在第一行的条件为真时跳过剩余的命令,则

FOR /L %%G IN (0,1,31) DO (
    IF "%2" == "1" IF "%%G" == "%X%" (CALL :C 0C "i") ELSE (
        IF "!M%MAP%%1:~%%G,1!" == "0" CALL :C 00 " "
        IF "!M%MAP%%1:~%%G,1!" == "1" CALL :C 2A "w"
        IF "!M%MAP%%1:~%%G,1!" == "2" CALL :C 87 "S"
        IF ...
    )
)

再次,for循环不是必需的,因为每个循环只跳转到一个case。第一行看起来正在检查是否是播放器,所以只需将其拆分为单独的函数即可

IF /I %OSV% LSS 3 (
    IF "!M%MAP%%1:~0,1!" == "0" (call :checkplayer %2 %%G %X% || CALL :C 00 " ")
    IF "!M%MAP%%1:~1,1!" == "1" (call :checkplayer %2 %%G %X% || CALL :C 2A "w")
    IF "!M%MAP%%1:~2,1!" == "2" (call :checkplayer %2 %%G %X% || CALL :C 87 "S")
    ...
)

:checkplayer
IF "%1" == "1" IF "%2" == "%3" (
    CALL :C 0C "i"
    exit /b 0
) ELSE (
    exit /b 1
)
© www.soinside.com 2019 - 2024. All rights reserved.