2017-10-03 1 views
1

Ich bin neu zu Batch-Datei und das scheint wie eine dumme Frage für jemanden, der ein wenig über Batch-Datei weiß, aber ich kann nur nicht das gewünschte Ergebnis mit der Art, wie ich in C++ oder andere Programmierung tun würde. Was ich zu tun versuchte, war, drei 1s zufällig in die Elemente für jedes der 2x2 Arrays zu speichern. Danke im Voraus. Der vollständige Code ist unten:Wie kürze ich meinen Code, indem ich in diesem Fall loops oder goto verwende?

@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 

Antwort

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 

Der mittlere Block setzt die Anzahl der 1s einzufügen. Dann werden drei Zufallszahlen gewählt und x, y und z zugewiesen und die drei verschachtelten for/L Befehle einfach %%x..%%z für jede mögliche Wertkombination von x..z, aber in einem metaviariable der Bequemlichkeit. Wenn die Loops die richtige Kombination auswählen, wird dieser Punkt auf der Karte getestet. Wenn es 1 ist, beginnen Sie noch einmal. Wenn nicht, setze es auf 1.

Die Anzeige-Routine scheint offensichtlich.

+0

Was ich versuchte, zu Do ist, drei 1s zufällig in jedem der 2x2 Arrays zu speichern, also sollte es zwölf 1s geben, aber es scheint, dass Ihr Code nur drei 1s insgesamt erzeugt, und es sieht so aus, als würde es lange dauern, um zu kompilieren. – 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 

EDIT: Neue Version der neue Anforderung der variablen Anzahl von Nullen zu erfüllen.

@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

Danke für Ihre Antwort, aber was ist, wenn es mehr als eine Null gibt? – jacknip

+0

In so einem Fall ist es dann eine _andifferent question_ ** ';)' ** Siehe meine Bearbeitung ... – Aacini

+0

Also? Hat mein neuer Code dein Problem gelöst? Wenn ja, dann können Sie dies als beste Antwort über das grüne Häkchen auswählen ... – Aacini

0

Aacini den Code ein wenig verkürzt, (wegen Titeltext):

@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 

Bitte nehmen Sie nicht diese Antwort in Vorzug gegenüber ihren

Verwandte Themen