2014-02-20 86 views
1

我正在嘗試使批量掃雷,但我有奇怪的錯誤。當我運行該文件時,它會放置5個地雷。然後它穿過其餘的廣場並檢查每個廣場附近有多少個地雷。我的問題是,它只感覺到向東南方向輸出。東南碼與任何其他方向的碼不同。這對我來說非常混亂。似乎沒有其他人有這個錯誤。這是一個輸出示例:批處理如果聲明錯誤

M 0 1 0 0 
0 1 0 M 0 
M 0 M 0 0 
0 0 1 0 0 
0 0 0 M 0 

答案將不勝感激。

@echo off 
setlocal enableDelayedExpansion 
setlocal ENABLEEXTENSIONS 
title Batch Minesweeper 
color 80 
set setX=1 
set setY=1 
set testX=1 
set testY=1 
set plrX=1 
set plyY=1 
set mines=0 
set mineNum=0 
set N= 
set NE= 
set E= 
set SE= 
set S= 
set SW= 
set W= 
set NW= 
set rect1_1= 
set rect2_1= 
set rect3_1= 
set rect4_1= 
set rect5_1= 
set rect1_2= 
set rect2_2= 
set rect3_2= 
set rect4_2= 
set rect5_2= 
set rect1_3= 
set rect2_3= 
set rect3_3= 
set rect4_3= 
set rect5_3= 
set rect1_4= 
set rect2_4= 
set rect3_4= 
set rect4_4= 
set rect5_4= 
set rect1_5= 
set rect2_5= 
set rect3_5= 
set rect4_5= 
set rect5_5= 
set mine1_1=0 
set mine2_1=0 
set mine3_1=0 
set mine4_1=0 
set mine5_1=0 
set mine1_2=0 
set mine2_2=0 
set mine3_2=0 
set mine4_2=0 
set mine5_2=0 
set mine1_3=0 
set mine2_3=0 
set mine3_3=0 
set mine4_3=0 
set mine5_3=0 
set mine1_4=0 
set mine2_4=0 
set mine3_4=0 
set mine4_4=0 
set mine5_4=0 
set mine1_5=0 
set mine2_5=0 
set mine3_5=0 
set mine4_5=0 
set mine5_5=0 
cls 
echo Batch Minesweeper 
echo. 
echo [1] - Play 
echo [2] - Info 
echo [3] - Exit 
echo. 
echo Batch Minesweeper made by Matt Pauly 
choice /c 123 /n /m "" 
if %errorlevel%==1 goto startGame 
if %errorlevel%==1 goto info 
if %errorlevel%==1 goto end 

:startGame 
cls 
set /a ranX=%RANDOM% * 5/32768 + 1 
set /a ranY=%RANDOM% * 5/32768 + 1 
if not %mines%==5 (
    if !mine%ranX%_%ranY%!==0 (
     set mine%ranX%_%ranY%=M 
     set /a mines=%mines% + 1 
     goto startGame 
     ) 
    goto startGame 
    ) 
goto setup 

:setup 
cls 
echo Loading... 
set curVal=%setX%_%setY% 
if %curVal%==1_6 goto display 
if %setX%==6 (
    set setX=1 
    set /a setY=%setY% + 1 
    goto setup 
    ) 
if !mine%setX%_%setY%!==M (
    set /a setX=%setX% + 1 
    goto setup 
    ) 
set /a testY=%setY% + 1 
set testX=%setX%  
set N=!mine%testX%_%testY%! 
set /a testY=%setY% + 1 
set /a testX=%setX% + 1 
set NE=!mine%testX%_%testY%!  
set testY=%setY% 
set /a testX=%setX% + 1 
set E=!mine%testX%_%testY%! 
set /a testY=%setY% + 1 
set /a testX=%setX% - 1 
set SE=!mine%testX%_%testY%!  
set testY=%setY% 
set /a testX=%setX% - 1 
set S=!mine%testX%_%testY%! 
set /a testY=%setY% - 1 
set /a testX=%setX% - 1 
set SW=!mine%testX%_%testY%!  
set /a testY=%setY% + 1 
set testX=%setX%  
set W=!mine%testX%_%testY%! 
set /a testY=%setY% - 1 
set /a testX=%setX% + 1 
set NW=!mine%testX%_%testY%! 
set mineNum=0 
if defined N if "%N%"=="M" set /a mineNum=%mineNum% + 1 
if defined NW if "%NW%"=="M" set /a mineNum=%mineNum% + 1 
if defined W if "%W%"=="M" set/a mineNum=%mineNum% + 1 
if defined SW if "%S%"=="M" set /a mineNum=%mineNum% + 1 
if defined S if "%S%"=="M" set /a mineNum=%mineNum% + 1 
if defined SE if "%SE%"=="M" set /a mineNum=%mineNum% + 1 
if defined E if "%E%"=="M" set /a mineNum=%mineNum% + 1 
if defined NE if "%NE%"=="M" set /a mineNum=%mineNum% + 1 
set mine%setX%_%setY%=%mineNum% 
set /a setX=%setX% + 1 
goto setup 

:display  
cls 
::echo 5 %rect1_5% %rect2_5% %rect3_5% %rect4_5% %rect5_5% 
::echo. 
::echo 4 %rect1_4% %rect2_4% %rect3_4% %rect4_4% %rect5_4% 
::echo. 
::echo 3 %rect1_3% %rect2_3% %rect3_3% %rect4_3% %rect5_3% 
::echo. 
::echo 2 %rect1_2% %rect2_2% %rect3_2% %rect4_2% %rect5_2% 
::echo. 
::echo 1 %rect1_1% %rect2_1% %rect3_1% %rect4_1% %rect5_1% 
::echo. 
::echo  a b c d e 
echo 5 %mine1_5% %mine2_5% %mine3_5% %mine4_5% %mine5_5% 
echo. 
echo 4 %mine1_4% %mine2_4% %mine3_4% %mine4_4% %mine5_4% 
echo. 
echo 3 %mine1_3% %mine2_3% %mine3_3% %mine4_3% %mine5_3% 
echo. 
echo 2 %mine1_2% %mine2_2% %mine3_2% %mine4_2% %mine5_2% 
echo. 
echo 1 %mine1_1% %mine2_1% %mine3_1% %mine4_1% %mine5_1% 
echo. 
echo  a b c d e 
pause 

:info 

:end 
exit 
+1

也許你想了解'for'命令,從'FOR/L%x in(1,1,5)DO echo%x'開始學習。接下來嘗試在(1,1,5)DO回波%x_%y中爲/ L%y在(1,1,5)DO中的FOR/L%x。最後用'set mine%x_%y = 0'替換'echo%x_%y'來初始化你的礦場爲零。 –

回答

2

您的主要問題是行尾空格。在傳統的set語句中,任何尾部空格都包含在分配的值中,並且"M""M "是完全不同的東西,因此如果您有set X=!something!,則分配的值與set X=!something!分配的值不同。

您還有一個問題,在您將X與您的Y混淆。例如,設置W使用XY+1完成 - 與設置N相同。這應該是X-1Y

+0

將它加載到一個文本編輯器中,該文本編輯器可以選擇刪除尾隨空白,這樣您就可以將其保存起來而不會出現尾隨空格。 – foxidrive

+0

我刪除了尾部空格,但它仍然不完全工作。 X和Y搞砸了,但我不知道爲什麼。 – Yulap

+0

仍然有你的X和Ys困惑。對於'N'的計算與例如'E'的計算相同; 「SE」實際上是NW,「S」是E.,如果「%S%」==「..'應該定義爲SW,如果」%SW%「==」......「 '把它們全部修好(記住 - 北部是Y + 1,南部Y-1,東部X + 1和西部 - 好吧,那麼現在會是什麼?),它一切正常! – Magoo