2014-05-09 109 views
1

首先,我讀到其他人的問題都是類似的,但沒有一個給定的解決方案可行。這也是我的第一批文件之一。背後的想法是,我按[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="+" 

我知道有可能是更簡單的方法來完成這一點,但這是我學習的方式。困難的方式。

回答

3

這個問題可能是一個組合。

varstring語法set "var=string"套THA值,而set var="string"設置的var"string"值。

第一種形式用於確保線上的任何尾隨空格均爲而非包含指定的值。第二個在分配的值中包含引號。

因此你set /a q...命令將被解析爲

組/水溶液= 「5 」+「 1」

的解決方案是使用

set "y=+" 

set /a q=%z% %y% 1 
+0

感謝你的幫助,但它仍然是行不通的。發生同樣的確切錯誤。 – coltonon

+0

您的下一個問題是您將'x'設置爲'%errorlevel%',因此它會是1或2.然後您會對'a'和'd'進行測試,因此兩個測試都會失敗。批量只是繼續到下一行,並且由於'y'尚未建立,所以看到'set/a q = 5 1'並報告操作員缺失。如果您要將'@echo off'更改爲'echo on'(或簡單地'rem'出來),那麼您會一步步看到操作。一旦你解決了這個問題,你會遇到'q'從1遞減的問題,因爲沒有'q == 0'的測試將它返回到9。 – Magoo

+0

有一點要謹慎。你的代碼中有一個失敗失敗的情況,現在是最好的排序,而不是稍後。 '&'和'&&'有很大的區別。 '&'意味着'做到這一點,然後做'。 '&&'意味着'做到這一點,如果成功了,那就做'。 'set'總是會成功,所以在這種情況下,它們是等價的,但'並非總是如此。在使用該語法編寫批處理近20年的時間裏,我從來沒有使用'&&'或'||' - 主要是因爲我不記得有什麼不同。 – Magoo

2

除了Magoo的回答 - 你誤解了ErrorLevelchoice

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%是否等於12

choice /c ad 
set x=%errorlevel% 
if %x%==1 goto a 
if %x%==2 goto b 
+1

糟糕!我完全沒有注意到我寫過這些。非常感謝你!順便說一句,我從來沒有犯過這個錯誤。 – coltonon

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