我目前正在批量制作游戏。在以下代码中,在第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
如果您需要完整的代码,请发表评论。 (我有点不愿意把我的所有代码都放在互联网上供大家看。)
答案 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
中包含的内容,因此我们无法分辨出正在阅读的内容并且必须猜测...
由于这是代码块的所有部分,您应该意识到代码块中不允许使用标签,而在您提供的代码部分中,getinput
,checkinput
而chooseboulder
是标签,非常重要的::
作为评论,它实际上是一个无法访问的标签。它被cmd
忽略,因为它是一个标签,因此它对于注释很有用,但它仍然是一个标签,会破坏代码块。使用rem
获取代码块中的注释。