首先,我读了其他人类似的问题,但没有一个给定的解决方案有效。这也是我的第一个批处理文件之一。它背后的想法是我按[D]将块X向右移动,然后按[A]向左移动它。这是脚本。
@echo off
:start
set z=%q%
if "%z%"=="" set z=5
choice /c ad
set x=%errorlevel%
if %x%==a goto a
if %x%==d goto b
:sett
set /a q="%z% %y% 1"
if %q%==1 goto 1
if %q%==2 goto 2
if %q%==3 goto 3
if %q%==4 goto 4
if %q%==5 goto 5
if %q%==6 goto 6
if %q%==7 goto 7
if %q%==8 goto 8
if %q%==9 goto 9
if %q%==10 set q=1 && goto 1
pause
:a
set y="-"
goto sett
:b
set y="+"
goto sett
:1
echo.X
goto start
:2
echo..X
goto start
:3
echo...X
goto start
:4
echo....X
goto start
:5
echo.....X
goto start
:6
echo......X
goto start
:7
echo.......X
goto start
:8
echo........X
goto start
:9
echo.........X
goto start
我认为(从其他人的帖子中收集),问题出在
中set /a q="%z% %y% 1"
或
set y="-"
或
set y="+"
我知道可能有更简单的方法来实现这一目标,但这就是我学习的方式。艰难的方式。
答案 0 :(得分:3)
问题可能是一个组合。
语法set "var=string"
将var
的值设置为string
,而set var="string"
将var
的值设置为"string"
。
第一种形式用于确保线上的任何尾随空格不包含分配的值。第二个包括分配值中的引号。
因此您的set /a q...
命令将被解析为
设置/ a q =“5”+“1”
解决方案是使用
set "y=+"
和
set /a q=%z% %y% 1
答案 1 :(得分:2)
除了Magoo的回答 - 您误解了ErrorLevel
和choice
choice /c ad
set x=%errorlevel%
if %x%==a goto a
if %x%==d goto b
ErrorLevel
变量只会扩展为数字。对于choice
命令,它将通过您提供的许多可能值扩展为1。 Expample
choice /c abc
如果用户按下a
键,则%errorlevel%
将展开为1
。然而,如果他们按b
,它将扩展为2
,依此类推。
因此,您的两个if
支票都失败了,您将直接转到:sett
。
您应该检查%x%
是否等于1
或2
。
choice /c ad
set x=%errorlevel%
if %x%==1 goto a
if %x%==2 goto b
答案 2 :(得分:0)
做同样事情的类似概念.....希望它有帮助...... 得到这个代码的其他地方
@setlocal enableextensions enabledelayedexpansion
@echo off
title movement
color 0a
set length=
set height= a
:controls
cls
echo Use WASD to move your character ([]).
echo.
for %%a in ( %height% ) do echo.
echo %length%[]
choice /c wasd /n
if %errorlevel% equ 1 call:up
if %errorlevel% equ 2 call:left
if %errorlevel% equ 3 call:down
if %errorlevel% equ 4 call:right
:left
setlength=!length:~0,-1!
goto controls
:right
set length=%length%
goto controls
:up
set height=!height:~0,-2!
goto controls
:down
set height=%height% a
goto control