2017-10-03 1 views
1

나는 배치 파일에 익숙하지 않다. 그리고 이것은 배치 파일에 대해 조금 알고있는 사람에게는 어리석은 질문이지만 나는 C++이나 다른 프로그래밍에서하는 것처럼 원하는 결과를 얻을 수 없다. 내가하려고했던 것은 2x2 배열 각각에 대해 요소에 세 개의 1을 무작위로 저장하는 것입니다. 미리 감사드립니다. 전체 코드는 다음과 같습니다 :이 경우 루프 또는 goto를 사용하여 코드를 어떻게 줄입니까?

@echo off 
setlocal EnableDelayedExpansion 
rem ========Creating four 2x2 zero arrays 
for /l %%z in (0,1,3) do (
    for /l %%y in (0,1,1) do (
     for /l %%x in (0,1,1) do (
      set map[%%x][%%y][%%z]=0 
     ) 
    ) 
) 
rem ========Putting three 1s in elements randomly **(How do I shorten this part?)** 
set /a count=3 
:while0 
    set /a i=!Random!%%2 
    set /a j=!Random!%%2 
    set /a sth=map[!i!][!j!][0] 
    if !sth! EQU 0 (
     set map[!i!][!j!][0]=1 
     set /a count-=1 
    ) 
    if not !count! EQU 0 GOTO while0 
set /a count=3 
:while1 
    set /a i=!Random!%%2 
    set /a j=!Random!%%2 
    set /a sth=map[!i!][!j!][1] 
    if !sth! EQU 0 (
     set map[!i!][!j!][1]=1 
     set /a count-=1 
    ) 
    if not !count! EQU 0 GOTO while1 
set /a count=3 
:while2 
    set /a i=!Random!%%2 
    set /a j=!Random!%%2 
    set /a sth=map[!i!][!j!][2] 
    if !sth! EQU 0 (
     set map[!i!][!j!][2]=1 
     set /a count-=1 
    ) 
    if not !count! EQU 0 GOTO while2 
set /a count=3 
:while3 
    set /a i=!Random!%%2 
    set /a j=!Random!%%2 
    set /a sth=map[!i!][!j!][3] 
    if !sth! EQU 0 (
     set map[!i!][!j!][3]=1 
     set /a count-=1 
    ) 
    if not !count! EQU 0 GOTO while3 
rem ========Result 
echo !map[0][0][0]!!map[1][0][0]! 
echo !map[0][1][0]!!map[1][1][0]! 
echo. 
echo. 
echo !map[0][0][1]!!map[1][0][1]! 
echo !map[0][1][1]!!map[1][1][1]! 
echo. 
echo. 
echo !map[0][0][2]!!map[1][0][2]! 
echo !map[0][1][2]!!map[1][1][2]! 
echo. 
echo. 
echo !map[0][0][3]!!map[1][0][3]! 
echo !map[0][1][3]!!map[1][1][3]! 
echo. 
echo. 
pause 

답변

0
@ECHO OFF 
setlocal EnableDelayedExpansion 
rem ========Creating four 2x2 zero arrays 
:restart 
for /l %%z in (0,1,3) do (
    for /l %%y in (0,1,1) do (
     for /l %%x in (0,1,1) do (
      set map[%%x][%%y][%%z]=0 
     ) 
    ) 
) 
:: loading array randomly with 1s 
FOR /L %%c IN (1,1,3) DO (
SET /a x=!random! %% 2, y=!random! %% 2, z=!random! %% 4 
for /l %%z in (0,1,3) do (
    for /l %%y in (0,1,1) do (
    for /l %%x in (0,1,1) do (
    IF %%z==!z! IF %%y==!y! IF %%x==!x! (
    IF !map[%%x][%%y][%%z]! == 1 GOTO restart 
    SET /a map[%%x][%%y][%%z]=1 
    ) 
    ) 
) 
) 
) 
:: display 
FOR /L %%z IN (0,1,3) DO (
FOR /L %%y IN (0,1,1) DO ECHO !map[0][%%y][%%z]!!map[1][%%y][%%z]! 
ECHO. 
) 
GOTO :EOF 

중간 블록을 삽입 할 1의 개수를 설정합니다. 3 개의 난수가 선택되어 x, yz에 할당되고 3 개의 중첩 된 for/L 명령은 x..z의 각 가능한 값 조합에 편의상 편의를 위해 metaviariable을 설정합니다. 루프가 올바른 조합을 선택하면지도의 해당 점이 테스트됩니다. 1 인 경우 다시 시작하십시오. 그렇지 않은 경우 1으로 설정하십시오.

표시 루틴이 분명해 보입니다.

+0

내가하려고 무엇보다 우선이 대답을 수락하지 마십시오 do는 3 개의 1을 각각의 2x2 배열에 무작위로 저장하여 12 개의 1이 있어야하지만 코드가 총 3 개의 1을 생성하는 것으로 보이며 컴파일하는 데 오랜 시간이 걸리는 것처럼 보입니다. – jacknip

1
@echo off 
setlocal EnableDelayedExpansion 

rem ========Creating four 2x2 one arrays 
for /l %%z in (0,1,3) do (
    for /l %%y in (0,1,1) do (
     for /l %%x in (0,1,1) do (
      set map[%%x][%%y][%%z]=1 
     ) 
    ) 
) 

rem ========Putting one 0 in an element randomly 
for /l %%z in (0,1,3) do (
    set /a i=!Random!%%2 
    set /a j=!Random!%%2 
    set map[!i!][!j!][%%z]=0 
) 

rem ========Result 
for /l %%z in (0,1,3) do (
    echo !map[0][0][%%z]!!map[1][0][%%z]! 
    echo !map[0][1][%%z]!!map[1][1][%%z]! 
    echo/ 
    echo/ 
) 

pause 

편집 : 새로운 버전의 제로 변수 수의 새로운 요구 사항을 충족합니다.

@echo off 
setlocal EnableDelayedExpansion 

rem ========Creating four 2x2 arrays using three 1s and one 0 to populate each 
for /l %%z in (0,1,3) do (
    set "digits=1110" & set "num=4" 
    for /l %%y in (0,1,1) do (
     for /l %%x in (0,1,1) do (
      rem Get a random number between 0 and "num" 
      set /A ran=!random!%%num, ranP1=ran+1, num-=1 
      rem Use it to extract a random digit from "digits" 
      for /F "tokens=1,2" %%i in ("!ran! !ranP1!") do (
       set "map[%%x][%%y][%%z]=!digits:~%%i,1!" 
       set "digits=!digits:~0,%%i!!digits:~%%j!" 
      ) 
     ) 
    ) 
) 

rem ========Result 
for /l %%z in (0,1,3) do (
    echo !map[0][0][%%z]!!map[1][0][%%z]! 
    echo !map[0][1][%%z]!!map[1][1][%%z]! 
    echo/ 
    echo/ 
) 

pause 
+0

답장을 보내 주셔서 감사합니다.하지만 둘 이상의 0이 있다면 어떻게해야합니까? – jacknip

+0

그런 경우, 그것은 다른 질문입니다 ** **). ** 편집을 참조하십시오 ... – Aacini

+0

그래서? 내 새 코드가 문제를 해결 했습니까? 그렇다면 초록색 확인 표시를 통해 최상의 답변으로 선택할 수 있습니다 ... – Aacini

0

Aacini의 코드는(때문에 제목 텍스트로), 조금 단축 :

@Echo Off 
SetLocal EnableDelayedExpansion 

Rem ========Creating four 2x2 one arrays 
For /L %%A In (0 1 3) Do For /L %%B In (0 1 1) Do For /L %%C In (0 1 1 
) Do Set "m[%%C%%B%%A]=1" 

Rem ========Putting one 0 in an element randomly 
For /L %%A in (0 1 3 
) Do Set/A B=!Random!%%2,C=!Random!%%2&Set "m[!B!!C!%%A]=0") 

Rem ========Result 
For /L %%A In (0 1 3 
) Do Echo !m[00%%A]!!m[10%%A]!&Echo !m[01%%A]!!m[11%%A]!&Echo(&Echo(

Pause 

가 그들의

관련 문제