kostenloser Webspace werbefrei: lima-city


MS Batch: set funktioniert nicht

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    momar-blog

    momar-blog hat kostenlosen Webspace.

    Hallo,
    ich versuche gerade, TicTacToe mit einer Batch-Datei hinzukriegen. Aber der Set-Befehl funktioniert nicht richtig:

    REM Setze Standardwerte:
    set a1= 
    set a2= 
    [...]
    set p1=X
    set p2=O
    set pn=X
    
    [...]
    
    :game
    
    [...]
    
    REM Von aktuellem Spieler %pn% zu besetzendes Feld %n% abfragen
    set /p n="Spieler %pn%: Feld (z.B. b2): "
    
    REM U.-Variable des Feldes besetzen
    if (%n%=="a1") set a1=%pn%
    if (%n%=="a2") set a2=%pn%
    [...]
    
    REM Der andere Spieler ist jetzt dran
    if (%pn%==%p1%) set %pn%=%p2%
    if (%pn%==%p2%) set %pn%=%p1%
    
    REM Zurückspringen
    goto game


    Die Umgebungsvariablen werden zwar am Anfang gesetzt, aber bei den Zeilen "if (%n%=="xy") set xy=%pn%" passiert scheinbar nichts. habe ich irgendwas übersehen?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hey ;)

    Ich kann dir deine Frage leider nicht beantworten, aber vielleicht an einer anderen Stelle helfen.

    1) "Debuggen":
    In deinem Fall könnte es sehr hilfreich sein, wenn du dir Zwischenausgaben mit echo ausgeben lässt. (z.B. Geht das Script überhaupt in die if? Was haben die Variablen für einen Wert vor bzw. nach der if, u.ä....)
    Vielleicht findest du ja dann deinen Fehler.

    2) Ich denke, dass du da einen kleinen Logik-Fehler beim "Spieler wechseln" hast:
    REM Der andere Spieler ist jetzt dran
    if (%pn%==%p1%) set %pn%=%p2%
    if (%pn%==%p2%) set %pn%=%p1%

    Wenn pn gleich p1 -> Setze pn = p2
    // Wenn die obere Bedingung true war, ist pn jetzt ganz sicher p2, folglich ist die nächste Bedingung auch true...
    Wenn pn gleich p2 -> Setze pn = p1.

    => pn wird nach diesen 2 if's (sofern in mind. eine hineingegangen wird) auf jeden Fall den Wert von p1 haben.

    Lösung: else if. (In dem Fall ginge er nur in die 2. if, wenn die 1. if nicht ausführt wurde.)

    lg
    Sincer
  4. Autor dieses Themas

    momar-blog

    momar-blog hat kostenlosen Webspace.

    Vielen Dank sincer,
    "Debuggen" mache ich ja (ich dachte das muss nicht unbedingt hier mit rein), aber vorher und nachher ist das Ergebnis gleich wie das am Anfang. Da ändert sich überhaupt nichts.
    Der zweite Punkt ist mir jetzt auch aufgefallen, danke.
    Wie geht das mit dem else? Ich habe von der Grammatik von Batch wenig Ahnung.
  5. t********g

    if (%pn%==%p1%) (
    set pn=%p2%
    else (
    set pn=%p1%
    ))

    Bei set waren 2 % zuviel. Siehe set /?

    Manchmal muss man das %Wert% noch in Anführungsstriche setzen.
  6. Autor dieses Themas

    momar-blog

    momar-blog hat kostenlosen Webspace.

    Danke tid-gaming,
    Das mit den %s ist mir noch nicht aufgefallen, danke.

    Und das if habe ich anscheinend etwas blöd verwendet:
    es muss "if %x% == %y% REM Was machen" statt "if (%x%==%y%) REM Was machen" heißen!

    Ein Else scheint es nach langer Google Suche wirklich nicht zu geben, auch dein Beispiel funktioniert nicht. Was aber funktioniert ist folgendes:
    if not "wert1" == "wert2" GOTO else
     REM Wenn Wahr
     GOTO end
    :else
     REM Wenn Falsch
    :end


    Beitrag zuletzt geändert: 8.7.2011 14:56:31 von momar-blog
  7. t********g

    Hmm kann seien das es nur bei for Schleifen mit dem else funktioniert. Das hab ich noch nicht getestet.

    Aber else funktioniert da 100%.

    Siehe find /?|find /i "else"
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!