Batch file 为什么批处理文件一直冻结?

Batch file 为什么批处理文件一直冻结?,batch-file,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 >

我目前正在批量制作一个游戏。在下面的代码中,在第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

如果你需要完整的代码,请留言。(我有点不愿意把我所有的代码都放在互联网上让大家看。)

你似乎被延迟扩展所困扰

if %b0y% equ %px%timeout /t 1 >nul && goto end
似乎可以代替

if !b0y! equ 0 if !px! equ 0 timeout /t 1 >nul && goto end
if !num! equ 0 if !b0y! leq 9 goto chooseboulder
没有一个
dir

if !dir! equ 0 set /a "px=!px!-1" >nul
您可以用
%
-不需要引号,nul
不起任何作用

整个街区

if !b0y! equ 0 if !px! equ 0 timeout /t 1 >nul && goto end
if !num! equ 0 if !b0y! leq 9 goto chooseboulder
可以用

if !b%num%y! leq 9 goto chooseboulder
在这种情况下,将
num
的值替换为
%num%
,然后计算
b?y
的值-这就是
的含义!b?y-对
的评估!瓦尔延迟

将命令名用作变量或标签被视为不好的做法(
dir
是命令名,就像
pause
一样)

命令

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

>>control.txt echo 4
说到这里,我现在注意到一个孤立的
,这意味着这都在一个代码块(一系列括号内的语句)内,使我所说的delayedexpansion部分无效

if %b0y% equ %px%timeout /t 1 >nul && goto end
当您甚至没有向我们展示一条完整的语句时,您希望我们如何调试代码

您还没有告诉我们您的文件
control.txt
中包含的内容,因此我们无法知道正在读取的内容,只能猜测


由于这都是代码块的一部分,您应该意识到标签不允许出现在代码块中,而在您提供的代码部分,
getinput
checkinput
chooseboulder
都是标签,作为注释使用的原因是,它实际上是一个无法访问的标签。它被
cmd
忽略,因为它是一个标签,因此对注释很有用,但它仍然是一个标签,会破坏代码块。使用
rem
查看代码块中的注释。

是时候进行一些“printf调试”。。。(
echo有用的状态信息
到处都可以找到它停止的位置)@tessellingheckler好的,我想我会这样做的。我们不需要你的完整代码,但需要一个能显示你的问题的。一些随机片段没有帮助。