2017-09-17 10 views
-2

私はパズルに取り組んでいますが、何らかの理由でこれが動作しません。移動タイルBATCH

各スライドはランダムな文字「a、b、c、d、e、f、g、h、i、j、k、l、m、n、o」です。これは解決できないパズルかもしれません(定数を除いてそれを避ける方法を知らないでください)

タイルは文字で数字ではないので動きの半分は解決できません。 (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するのではなく、したがって、あなたはこれらの4つのタイルは、名前(文字)を持っているの下と空の角のいずれかの側に移動することができます唯一のタイルは、直接上記のものであることを検討しているとあなたはakehと言うことができます。 ... – Magoo

+0

チェックの後、Rspace +/- 1と+/- 4を見て、 'choice'として表示する文字を選択します(左のRs %% 4 neq 1、 Rs%4 neq 0、Rs + 4 gtr 0 up Rs + 4 lss 17)、文字をピックアップして変数に入れ、運を止めるために 'q 'を追加し、' choice/c%varname%/n'。あなたは 'delayedexpansion'を理解していますので、'!varname:〜%errorlevel、1%! 'は文字の移動です(' varname'の先頭に文字を追加する必要があります)。 – Magoo

+0

元のデザインでは、Rx(x = 1..16)の四角形の数字が使用されています。今あなたは手紙を使っています。 Rsがスペースの場合、s = 1の場合、右または下に移動することしかできません。 s = 4、L; D s = 5、R; U; Dなどのように '' s mod 4 not = 1'なら 's %% 4 neq 1 ')あなたはRなどを移動することができます。したがって、任意のSに対して、L、R、U、DのS-1、S + 1、S-4およびS + 4は、テスト(テストが失敗した場合、S-1(左)を除外する '' S %% 4 neq 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 
関連する問題