2017-09-17 77 views
-2

我一直在拼圖,出於某種原因,這是行不通的。移動瓷磚BATCH

每張幻燈片都是隨機字母「a,b,c,d,e,f,g,h,i,j,k,l,m,n,o」我知道50%的時間這可能是一個難以解決的難題(不知道如何避免它,除了有常量)

除了它無法解決一半的時間運動不起作用,可能是因爲瓷磚是字母而不是數字?這些動作是由wasd鍵控制的(w = up,a = left,s = down,d = right)

最後一點是這可以更簡單/有效嗎?

echo ____ ____ ____ ____ 
echo ^| ^| ^| ^| ^| 
echo ^| %slide1% ^| %slide2% ^| %slide3% ^| %slide4% ^| 
echo ^|____^|____^|____^|____^| 
echo ^| ^| ^| ^| ^| 
echo ^| %slide5% ^| %slide6% ^| %slide7% ^| %slide8% ^| 
echo ^|____^|____^|____^|____^| 
echo ^| ^| ^| ^| ^| 
echo ^| %slide9% ^| %slide10% ^| %slide11% ^| %slide12% ^| 
echo ^|____^|____^|____^|____^| 
echo ^| ^| ^| ^| ^| 
echo ^| %slide13% ^| %slide14% ^| %slide15% ^| %slide16% ^| 
echo ^|____^|____^|____^|____^| 

choice /c wasdr /n 
if %errorlevel% == 1 goto movew 
if %errorlevel% == 2 goto movea 
if %errorlevel% == 3 goto moves 
if %errorlevel% == 4 goto moved 
if %errorlevel% == 5 goto reset 
:movew 
if %pos% GEQ 13 goto display 
set /a helper=%pos% + 4 
set /a slide%pos%=!slide%helper%! 
set slide%helper%=%default% 
set /a pos=%pos% + 4 
:movea 
if %pos% == 4 goto display 
if %pos% == 8 goto display 
if %pos% == 12 goto display 
if %pos% == 16 goto display 
set /a helper=%pos% + 1 
set /a slide%pos%=!slide%helper%! 
set slide%helper%=%default% 
set /a pos=%pos% + 1 
goto display 
:moves 
if %pos% LEQ 4 goto display 
set /a helper=%pos% - 4 
set /a slide%pos%=!slide%helper%! 
set slide%helper%=%default% 
set /a pos=%pos% - 4 
goto display 
:moved 
if %pos% == 1 goto display 
if %pos% == 5 goto display 
if %pos% == 9 goto display 
if %pos% == 13 goto display 
set /a helper=%pos% - 1 
set /a slide%pos%=!slide%helper%! 
set slide%helper%=%default% 
set /a pos=%pos% - 1 
goto display 

感謝,

+0

你考慮的是,可以移動的唯一瓦片的正上方,下方和空方的兩側這四個磚有名字(字母),並因此而不是移動WENS的? ,你可以說移動。然後移動一個交換Rx和Rspace的問題... – Magoo

+0

選擇通過從Rspace +/- 1和+/- 4查看來顯示爲「choice」的字母 - 檢查後(左Rs %% 4 neq 1, right Rs %% 4 neq 0,up Rs-4 gtr 0 down Rs + 4 lss 17),拿起字母,把它們放在一個變量中,加'q'退出運氣並使用'choice/c%varname%/N'。你明白'delayedexpansion'是這樣的!!varname:〜%errorlevel,1%!'是字母移動(當然,你必須在'varname'的開頭添加一個字符)。 – Magoo

+0

您的原始設計使用正方形Rx(x = 1..16)中的數字。現在你正在使用字母。如果Rs是空格,那麼如果s = 1,則只能向右或向下移動。 s = 2,3,Left; Right; Down s = 4,L; D s = 5,R; U; D等等如果s mod 4不是= 1(編碼爲'if S %% 4 neq 1 ')你可以移動R等等。因此,對於任何S,可以選擇移動的瓦片是L,R,U,D的S-1,S + 1,S-4和S + 4,只要它們通過測試(如'如果S %% 4 neq 1',如果測試失敗則排除S-1(左側))。因此,從可以移動到空間中的瓦片中拾取(2-4)字母,添加「q」以退出... – Magoo

回答

0

回答你的問題是: 「是的!」。

但是,在這種情況下,您的下一個問題將是「如何?」當然,回答這個新問題的唯一方法是顯示代碼。所以在這裏,它是:

@echo off 
setlocal EnableDelayedExpansion 

set "size=4" 
set "empty= " 

:label-5 reset 
rem Populate the puzzle with random numbers 
set /A size2=size*size-1 
set "numbers=" 
for /L %%i in (1,1,%size2%) do (
    set "number= %%i" 
    set "numbers=!numbers!!number:~-2!" 
) 
set "numbers=%numbers%%empty%" 
set "nums=%numbers%" 
set /A n=size2+1 
for /L %%j in (1,1,%size%) do (
    for /L %%i in (1,1,%size%) do (
     set /A num=!random!%%n*2, numP2=num+2, n-=1 
     for /F "tokens=1,2" %%m in ("!num! !numP2!") do (
     set "slide[%%j][%%i]=!nums:~%%m,2!" 
     if "!nums:~%%m,2!" equ "%empty%" set /A i=%%i, j=%%j 
     set "nums=!nums:~0,%%m!!nums:~%%n!" 
    ) 
    ) 
) 

:refresh 
rem Show the puzzle 
set "nums=" 
< NUL (
    cls 
    for /L %%i in (1,1,%size%) do set /P "=.____" 
    echo . 
    for /L %%j in (1,1,%size%) do (
     for /L %%i in (1,1,%size%) do set /P "=| " 
     echo ^| 
     for /L %%i in (1,1,%size%) do set /P "=| !slide[%%j][%%i]! " & set "nums=!nums!!slide[%%j][%%i]!" 
     echo ^| 
     for /L %%i in (1,1,%size%) do set /P "=|____" 
     echo ^| 
    ) 
) 
if "%nums%" equ "%numbers%" goto completed 

:getKey 
rem Move the empty square 
choice /C wasdrx /N 
if errorlevel 5 goto label-%errorlevel% Reset or eXit 
set /A "mod2=%errorlevel% %% 2, newJ=j+(%errorlevel%-2)*mod2, newI=i+(%errorlevel%-3)*^!mod2" 
if not defined slide[%newJ%][%newI%] goto getKey 
for /F "tokens=1,2" %%i in ("%newI% %newJ%") do set "slide[%j%][%i%]=!slide[%%j][%%i]!" & set "slide[%%j][%%i]=%empty%" 
set /A i=newI, j=newJ 
goto refresh 

:completed 
echo Completed^^^! 

:label-6 exit