为什么这个批处理文件会冻结?

时间:2016-04-07 01:38:40

标签: batch-file

我目前正在批量制作游戏。在以下代码中,在第10个循环之后的某个时间,批处理文件将完全停止工作。

如果有人可以帮助我,那将是非常有用的。

                :: Check for death ::
                if !b0y! equ 0 if !px! equ 0 timeout /t 1 >nul && goto end
                if !b0y! equ 1 if !px! equ 1 timeout /t 1 >nul && goto end
                if !b0y! equ 2 if !px! equ 2 timeout /t 1 >nul && goto end
                if !b0y! equ 3 if !px! equ 3 timeout /t 1 >nul && goto end
                if !b0y! equ 4 if !px! equ 4 timeout /t 1 >nul && goto end
                if !b0y! equ 5 if !px! equ 5 timeout /t 1 >nul && goto end
                if !b0y! equ 6 if !px! equ 6 timeout /t 1 >nul && goto end
                if !b0y! equ 7 if !px! equ 7 timeout /t 1 >nul && goto end
                if !b0y! equ 8 if !px! equ 8 timeout /t 1 >nul && goto end
                if !b0y! equ 9 if !px! equ 9 timeout /t 1 >nul && goto end
        ::Checking for player input ::
:getinput
        for /f "delims=" %%x in (control.txt) do set direction=%%x
        set "dir=%direction%"
:checkinput
        if !dir! equ 0 set /a "px=!px!-1" >nul
        if !dir! equ 1 set /a "px=!px!+1" >nul
        if !dir! equ 2 goto pause
        if !dir! equ 3 goto end
        if !dir! equ 4 goto chooseboulder

        echo 4>>control.txt

        :: Choosing Boulder placement ::
:chooseboulder
        set /a "num=%random%*10/32768"
        if !num! equ 0 if !b0y! leq 9 goto chooseboulder
        if !num! equ 1 if !b1y! leq 9 goto chooseboulder
        if !num! equ 2 if !b2y! leq 9 goto chooseboulder
        if !num! equ 3 if !b3y! leq 9 goto chooseboulder
        if !num! equ 4 if !b4y! leq 9 goto chooseboulder
        if !num! equ 5 if !b5y! leq 9 goto chooseboulder
        if !num! equ 6 if !b6y! leq 9 goto chooseboulder
        if !num! equ 7 if !b7y! leq 9 goto chooseboulder
        if !num! equ 8 if !b8y! leq 9 goto chooseboulder
        if !num! equ 9 if !b9y! leq 9 goto chooseboulder
        set "b!num!y=9"

    :: Delaying the game 0.75 seconds to make it easier to play ::
    ping localhost -n 2 >nul
)
goto loop

如果您需要完整的代码,请发表评论。 (我有点不愿意把我的所有代码都放在互联网上供大家看。)

1 个答案:

答案 0 :(得分:2)

你似乎被delayedexpansion荒谬地迷住了。

if %b0y% equ %px%timeout /t 1 >nul && goto end

似乎会替代

if !b0y! equ 0 if !px! equ 0 timeout /t 1 >nul && goto end

处理!

的块中不需要dir
if !dir! equ 0 set /a "px=!px!-1" >nul

您可以使用%替换整个块中的内容 - 不需要引号且>nul不执行任何操作

整个

if !num! equ 0 if !b0y! leq 9 goto chooseboulder

可以替换为

if !b%num%y! leq 9 goto chooseboulder

在这种情况下,num的值将替换%num%,然后评估b?y的值 - 这是!b?y!的含义 - 评估!var!被推迟了。

将命令名称用作变量或标签被视为不良做法(dir是命令名,pause}

命令

echo 4>>control.txt

尝试将标准设备编号4(未定义)的输出重定向到已执行echo的文件,该文件可能会生成ech is off到屏幕。重定向器之前的数字将为任何标准设备调用此行为(0 = stdin,1 = stdout,2 = stderr,3-9 = undefined)并且可以通过使用

来避免
>>control.txt echo 4

说完所有这些之后,我现在注意到一个孤儿),这意味着这一切都在一个代码块(带括号的系列语句)中,使我对delayedexpansion的部分内容无效。

如果您甚至没有向我们展示 ONE 完整声明,您希望我们如何调试代码?

您还没有告诉我们您的文件control.txt中包含的内容,因此我们无法分辨出正在阅读的内容并且必须猜测...

由于这是代码块的所有部分,您应该意识到代码块中不允许使用标签,而在您提供的代码部分中,getinputcheckinputchooseboulder是标签,非常重要的::作为评论,它实际上是一个无法访问的标签。它被cmd忽略,因为它是一个标签,因此它对于注释很有用,但它仍然是一个标签,会破坏代码块。使用rem获取代码块中的注释。