TIA Fragen zum SCL-Code

bkizilkaya

Level-1
Beiträge
93
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag

Ich programmiere ein 4 Gewinnt. Ich kann schon spielen einfach ohne auswertung.
Die Auswertung habe ich angefangen zu programmiern.
Unten seht ihr meinen Code für die Auswertung. Wenn man noch den Restlichen Code braucht einfach fragen.

Code:
#Sieg_Rot := 0;

FOR #a := 1 TO 7  BY 1 DO
 FOR #b := 0 TO 5 BY 1 DO
   IF #Rot_Speicher[#a,#b] = 1 THEN
     #Sieg_Rot := #Sieg_Rot + 1;
   ELSE
     #Sieg_Rot := 0;
   END_IF;
 END_FOR;
END_FOR;

IF #Sieg_Rot = 1 THEN
  #Rot_Sieg := 1;
ELSE
  #Rot_Sieg := 0;
END_IF;

Gruss
 
IF #Sieg_Rot = 1 THEN
#Rot_Sieg := 1;
ELSE
#Rot_Sieg := 0;
END_IF;
[/CODE]
Warum tut man sich so 'ne IF-Orgie an anstatt einfach zu schreiben:
Code:
#Rot_Sieg := #Sieg_Rot;
:confused:
PS: OK, vergiß das, Sieg_Rot kann ja auch größer als 1 sein. :oops:

Mal davon abgesehen, müßten es nicht eigentlich 4 Steine und dies diagonal, neben- oder übereinander sein?
Zum Einen wird Sieg_Rot nur auf 1 abgefragt und zum Zweiten wird ja auch weiter addiert, wenn der letzte Stein der Reihe rot war und der erste Stein der nächsten Reihe es auch ist. Und zum Dritten kann ich die Abfrage auf diagonal oder übereinander gar nicht sehen.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja ich weiss schon.

Ich wollte zuerst nur die vertikalen testen bevor ich die restlichen testen will.

Mein problem ist es das die IF abfrage nicht funktioniert und die For schleife ist jetzt auch nicht am funktionieren
 
Hucki
Wie würdest du es machen. Unten siehst du meine ganzen Code vom Programm.

Code:
//Alle Zellen mit Null füllen
IF "Reset" = true THEN 
FOR #x := 1 TO 7 BY 1 DO                 
  FOR #y := 0 TO 5 BY 1 DO        
    #Grün_Speicher[#x,#y] := 0;
    #Rot_Speicher[#x,#y] := 0;
    
   END_FOR;          
 END_FOR;
END_IF;

// Auswertung ob grüner spieler an der reihe
IF #wahlschalter_rot = true  THEN
  

// Abfrage für die Veränderung von den Schalters
#in1:= #IN;
IF #in1 AND NOT #mem THEN
  #out:= true;
 
  
IF #eingang_1 = TRUE THEN       
  #x:= 1;        
  ELSIF       
  #eingang_2 = TRUE THEN        
  #x:= 2;        
  ELSIF       
  #eingang_3 = TRUE THEN        
  #x:= 3;        
  ELSIF       
  #eingang_4 = TRUE THEN        
  #x:= 4;        
  ELSIF       
  #eingang_5 = TRUE THEN        
  #x:= 5;        
  ELSIF       
  #eingang_6 = TRUE THEN        
  #x:= 6;        
  ELSIF       
  #eingang_7 = TRUE THEN        
  #x:= 7;
ELSE #x := 0;  
END_IF;    

#y:=0;
#Gefunden:= 0;

WHILE #Gefunden = 0  DO
 IF  #Grün_Speicher[#x,#y] = 0 AND #Rot_Speicher[#x,#y] = 0 THEN
      #Grün_Speicher[#x,#y] := 1;
         #Gefunden:= 1;
    ELSE
      #y:=#y+1;
      IF #y = 5 THEN
        #Gefunden:= 1;
      END_IF;
    END_IF; 
  END_WHILE;
  
ELSE
  #out:=false;
  
END_IF;

#mem:=#in1;
#horizontal:= #x;
#vertikal := #y;
  
END_IF;


 // Auswertung ob roter spieler an der reihe 
   IF #wahlschalter_grün = true   THEN
 
  // Abfrage für die Veränderung von den Schalters

  #in1:= #IN;
IF #in1 AND NOT #mem THEN
  #out:= true;
 
  
IF #eingang_1 = TRUE THEN       
  #x:= 1;        
  ELSIF       
  #eingang_2 = TRUE THEN        
  #x:= 2;        
  ELSIF       
  #eingang_3 = TRUE THEN        
  #x:= 3;        
  ELSIF       
  #eingang_4 = TRUE THEN        
  #x:= 4;        
  ELSIF       
  #eingang_5 = TRUE THEN        
  #x:= 5;        
  ELSIF       
  #eingang_6 = TRUE THEN        
  #x:= 6;        
  ELSIF       
  #eingang_7 = TRUE THEN        
  #x:= 7;
ELSE #x := 0;  
END_IF;    


#y:=0;
#Gefunden:= 0;
WHILE #Gefunden = 0  DO
    IF #Rot_Speicher[#x,#y] = 0 AND #Grün_Speicher[#x,#y] = 0 THEN
      #Rot_Speicher[#x,#y] := 1;
         #Gefunden:= 1;
    ELSE
      #y:=#y+1;
      IF #y = 5 THEN
        #Gefunden:= 1;
      END_IF;
    END_IF; 
END_WHILE;
  
  ELSE
  #out:=false;
  
END_IF;

#mem:=#in1;
#horizontal:= #x;
#vertikal := #y;

END_IF;
 
Also erstmal verstehe ich nicht, warum Du zwei Spielfelder anlegst.
Ich würde nur eins verwenden und der Wert der jeweiligen Adresse zeigt Dir dann an: 0=leer 1=Spieler1 und 2= Spieler2.

Beim Einwerfen weißt Du ja zum Einen, wer dran ist, und Zum Anderen, welche Spalte er gewählt hat.
Du gibst also die Spalte vor und fängst mit der Zeile 1 an und arbeitest Dich nach oben, bis Du eine Zelle mit dem Wert 0 findest. Dort trägst Du die Nummer des aktuellen Spielers ein.

Wichtig ist, Dir diese Zelle für die Auswertung zu merken, denn nur diese Zelle kann den Gewinn des Spiels vollständig gemacht haben. Und auch nur der Spieler, der gerade dran ist, kann gerade gewonnen haben.

Dann zur Auswertung ->
1. Spalte:
Nach oben - ist kein Gewinn möglich, weil leer. :)
Nach unten - ist die aktuelle Spaltenadresse noch kleiner als 4, kann dort kein Gewinn stattgefunden haben und die Auswertung somit übersprungen werden. Ansonsten von der aktuellen Zeilenadresse fortlaufend nach unten schauen, ob dort die gleiche Spielernummer eingetragen ist. Wenn nicht, aus der Schleife aussteigen.

2. Zeile:
nach links: ist die aktuelle Spaltennummer kleiner 3 - Auswertung überspringen, sonst siehe Spalte (nur nach links schauen)
nach rechts: ist die aktuelle Spaltennummer größer 4 - Auswertung überspringen, sonst siehe Spalte (nur nach rechts schauen)

3. Diagonale:
nach links unten: ...
nach rechts unten: ...

Du brauchst also 5 Schleifen, die beginnend an der aktuellen Adresse entweder zum Gewinn führen oder jeweils abgebrochen werden, wenn ein Spielstein des Gegners auftaucht oder das Spielfeld beendet ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
2. und 3. ist so nicht richtig durchdacht von mir, denn man kann ja auch einen mittleren Stein als letztes einwerfen.
(Bei der Spalte geht das logischer weise nicht.)

Ich würd' also bei der Zeile und den beiden Diagonalen jeweils an einem der möglichen Enden anfangen und dann die komplette Reihe prüfen.
 
Hucki
Wie würdest du es machen.
Bis hierhin und dem Test der Spalte ungefähr so:
Code:
[FONT=courier new]VAR_INPUT
    EB: BYTE;                                                                       // Eingangsbyte für vertikale Auswahl (Reihe)
    RESET: BOOL;                                                                    // Spielfeld leeren
END_VAR

VAR_IN_OUT
    SPIELER: BOOL;                                                                  // Spielerauswahl -> 0 = Spieler 1 (ROT), 1 = Spieler 1 (GELB)
                                                                                    // wird intern nach Spielzug umgeschaltet,
                                                                                    // kann extern vorgegeben werden
END_VAR

VAR
    SPIELFELD: ARRAY [1 .. 7, 1 .. 6] OF INT;                                       // Spielfeld (7 Spalten, 6 Zeilen)
    SPIELZUEGE: ARRAY [1 .. 42, 0 .. 2] OF INT;                                     // Speicher Spielzüge (max. 7 x 6 = 42 Spielzüge,
                                                                                    //                          0 enthält Spalte 
                                                                                    //                          1 enthält Zeile
                                                                                    //                          2 enthält Spieler)
    SPIELZUG_Nr: INT;                                                               // Zähler Spielzüge
    EB_OLD: BYTE;                                                                   // Bytemerker für Eingangsbyte
END_VAR

VAR_TEMP
    Spielzug: BOOL;                                                                 // Neuen Spielzug versuchen
    Fehler: BOOL;                                                                   // Spielzug korrekt absolviert
    Gewinn: BOOL;                                                                   // Spielzug mit Gewinn absolviert
    Spalte: INT;                                                                    // Index-Variable horizontal (7 Spalten nebeneinander)
    Zeile: INT;                                                                     // Index-Variable vertikal   (6 Zeilen übereinander)
    Folge: INT;                                                                     // Folge gleicher Spielsteine für Gewinnauswertung
END_VAR


    // Spielfeld rücksetzen
    IF RESET THEN                                                                   // nur bei Reset ausführen (man könnte
        FOR Zeile:= 1 TO 6 BY 1 DO                                                  // die 6 Zeilen durchlaufen
            FOR Spalte:= 1 TO 7 BY 1 DO                                             // die 7 Spalten durchlaufen
                SPIELFELD[Spalte, Zeile]:= 0;                                       // Spieler aus Feld löschen
            END_FOR;
        END_FOR;
        FOR SPIELZUG_Nr:= 42 TO 1 BY -1 DO                                          // die maximal möglichen Spielzüge rückwärts durchlaufen
            SPIELZUEGE[SPIELZUG_Nr, 0]:= 0;                                         // Spalte  auf 0 setzen
            SPIELZUEGE[SPIELZUG_Nr, 1]:= 0;                                         // Zeile   auf 0 setzen
            SPIELZUEGE[SPIELZUG_Nr, 2]:= 0;                                         // Spieler auf 0 setzen
        END_FOR;                                                                    // SPIELZUG_Nr ist am Ende auf 1 zurückgesetzt
    END_IF;
    
    // Neuer Spielzug?
    Spielzug:= EB <> EB_OLD;                                                        // Eingangsbyte ungleich dem letzten Zyklus
    EB_OLD:= EB;                                                                    // Eingangsbyte für nächsten Zyklus speichern

    // nur bei neuem Spielzug ausführen
    IF Spielzug THEN                                                                // Wenn das Eingansbyte verändert wurde 

        // Initialisierung
        Fehler:= true;                                                              // Fehler initialisieren
        Gewinn:= false;                                                             // Gewinn initialisieren
    
        //Spaltenabfrage
        CASE BYTE_TO_INT (EB) OF
            0:      Spalte:= 0;                                                     // keine Spalte gewählt
            1:      Spalte:= 1;                                                     // Spalte 1 definieren
            2:      Spalte:= 2;                                                     // Spalte 2 definieren
            4:      Spalte:= 3;                                                     // Spalte 3 definieren
            8:      Spalte:= 4;                                                     // Spalte 4 definieren
            16:     Spalte:= 5;                                                     // Spalte 5 definieren
            32:     Spalte:= 6;                                                     // Spalte 6 definieren
            64:     Spalte:= 7;                                                     // Spalte 7 definieren
            ELSE:   Spalte:= -1;                                                    // falsche (mehrfache) Auswahl
        END_CASE;

        // Leeres Feld suchen
        IF Spalte > 0 THEN                                                          // nur wenn eine (korrekte) Spalte ausgewählt wurde
            // Leere Zeile suchen
            FOR Zeile:= 1 TO 6 BY 1 DO                                              // die 6 Zeilen durchlaufen
                IF SPIELFELD[Spalte, Zeile] = 0 THEN                                // wenn Spielfeld leer,
                    SPIELFELD[Spalte, Zeile]:= SEL (G:= SPIELER, IN0:= 1, IN1:= 2); // dann Spieler eintragen
                    SPIELZUEGE[SPIELZUG_Nr, 0]:= Spalte;                            //      Spalte  des Spielzuges merken
                    SPIELZUEGE[SPIELZUG_Nr, 1]:= Zeile;                             //      Zeile   des Spielzuges merken
                    SPIELZUEGE[SPIELZUG_Nr, 2]:= SPIELFELD[Spalte, Zeile];          //      Spieler des Spielzuges merken
                    Fehler:= false;                                                 //      Spielzug OK, Fehler rücksetzen
                    EXIT;                                                           //      FOR-Schleife verlassen
                END_IF;
            END_FOR;
        END_IF;                                                                     

        // Spielzug fehlerhaft?
        IF Fehler THEN                                                              // Fehlerauswertung
            ;
        ELSE                                                                        // Gewinnauswertung

            //Spalte prüfen
            IF SPIELZUEGE[SPIELZUG_Nr, 1] > 3 THEN
                Folge := 1;                                                         // Folge gleicher Spielsteine initieren
                Spalte:= SPIELZUEGE[SPIELZUG_Nr, 0];                                // Spalte des aktuellen Spielzuges auslesen
                Zeile := SPIELZUEGE[SPIELZUG_Nr, 1];                                // Zeile  des aktuellen Spielzuges auslesen
                REPEAT
                    Zeile:= Zeile - 1;                                              // letzten Wert für Zeile um eins verringern
                    Folge:= SEL (G:= SPIELFELD[Spalte, Zeile] =                     // Im Spielfeld der
                                    SEL (G:= SPIELER, IN0:= 1, IN1:= 2),            //      gleicher Spieler eingetragen?
                                 IN0:= 0,                                           // nein: Folge gleicher Spielsteine auf 1 rücksetzen
                                 IN1:= Folge + 1);                                  // ja:   Folge Spielsteine um 1 erhöhen
                UNTIL Folge = 0 OR Folge = 4 OR Zeile = 1                           // Schleife eventuell wiederholen
                END_REPEAT;
                Gewinn:= Folge = 4;                                                 // Gewinn setzen, wenn Folge=4
            END_IF;

        END_IF;                                                                     // Ende Fehler-/Gewinnprüfung

        // automatischer Spielerwechsel
        IF NOT (Fehler OR Gewinn) THEN                                              // korrekter Spielzug ohne Gewinn
            SPIELER:= NOT SPIELER;                                                  // Spieler wechseln
            SPIELZUG_Nr:= SPIELZUG_Nr + 1;                                          // nächster Spielzug
        END_IF;

    END_IF;                                                                         // Ende Spielzug
   

[/FONT]
PS: Ist aber nicht getestet, sondern nur die Umsetzung meiner Gedanken von oben. Die Untersuchung der 3 anderen möglichen Gewinnreihen erfolgt in ähnlicher Weise. Wichtig ist halt den richtigen Startpunkt und die entsprechende Zeilen-/Spaltenweiterschaltung zu finden.


Bei der Suche nach dem Feld für den aktuellen Zug ist es einfacher, in den Zeilen von unten nach oben nach dem ersten leeren zu suchen.

Wenn ich jedoch an die Darstellung auf dem Bildschirm denke, wäre es natürlich optisch schöner, den Spielstein wie in real von oben in die Spalte "plumsen" zu lassen, bis es nicht mehr weitergeht. Damit man das auch sehen kann, müsste man das aber zeitlich verzögern, sprich die Leere-Feld-Suche über mehrere Zyklen verteilen. Das wäre dann für mich die Herausforderung bei der Erweiterung.
 
Zuletzt bearbeitet:
@all,
Code:
[FONT=courier new]SEL (G:= SPIELER, IN0:= 1, IN1:= 2)[/FONT]
kann ich z.B. auch durch
Code:
[FONT=Courier New]BOOL_TO_INT (SPIELER) + 1[/FONT]
ersetzen.
Welche Variante ist denn in der Praxis schneller und welche lesbarer?

Ich glaub', ich würd' mich doch eher für Letzteres entscheiden.
:confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Antwort

Ich habe 2 Spielfelder, weil ich eine Visualisierung habe die nicht erkenne kann ob es eine 1 oder 2 ist und sie trotzdem leuchtet.

Deswegen mit zwei spielfelder.

gruss
 
Ich habe die Simulationsprogramm SIMIT

Mein Lehrer hat die Simulation schon programmiert. Am anfang wollte ich auch nur mit einem Spielfelde.
Ich kann bis jetzt spielen d.h. die Spielfelder füllen sich mit rot oder grün.

Die Auswertung funktioniert noch nicht :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, wie dem auch sei, auf die Auswertung hat das eh' keinen nennenswerten Einfluss.


Sieh' Dir Dein Spielfeld an, an S5Z4 hast Du z.B. Deinen letzten Spielstein plaziert:

Code:
[FONT=courier new]6 [/FONT]o o o o o o o[FONT=courier new] 
[/FONT]5 o o o o o o o
4 o o o o X o o
3 o o o o o o o
2 o o o o o o o
1 o o o o o o o
x 1 2 3 4 5 6 7
Wie bereits gesagt, muss dieser Spielstein irgendwie in einen eventuellen Gewinn involviert sein. Daraus ergeben sich 4 mögliche Gewinreihen, die Du auf eine Folge von 4 Steinen untersuchen musst:

1. Spalte:
Code:
[FONT=courier new]6 [/FONT]o o o o o o o[FONT=courier new] 
[/FONT]5 o o o o o o o
4 o o o o X o o
3 o o o o ? o o
2 o o o o ? o o
1 o o o o ? o o
Spalte ist, wie ebenfalls bereits gesagt, relativ einfach, da der letzte Spielstein auch garantiert der letzte in der Spalte ist. (Den aktuellen Stein braucht man nicht prüfen, denn von dem weiß man, das er richtig ist. Also hat man schon einen der Folge.) Man braucht dann nur die Zeile immer um eins verringern und kann die Prüfung abbrechen, wenn ein anderer Spielstein auftaucht oder 4 gleiche Steine gefunden wurden oder die letzte Zeile erreicht ist:
Code:
            IF [I]"aktuelle Zeile"[/I] > 3 THEN         
                Folge := 1;                                                         // Folge gleicher Spielsteine initieren
                Spalte:= [I]"aktuelle Spalte"[/I];                                         // Spalte des aktuellen Spielzuges auslesen
                Zeile := [I]"aktuelle Zeile"[/I];                                          // Zeile  des aktuellen Spielzuges auslesen
                REPEAT
                    Zeile:= Zeile - 1;                                              // letzten Wert für Zeile um eins verringern
                    Folge:= SEL (G:= SPIELFELD[Spalte, Zeile] = [I]"aktuelle Spieler"[/I], // Im Spielfeld der gleicher Spieler eingetragen?
                                 IN0:= 0,                                           // nein: Folge gleicher Spielsteine auf 0 rücksetzen
                                 IN1:= Folge + 1);                                  // ja:   Folge Spielsteine um 1 erhöhen
                UNTIL Folge = 0 OR Folge = 4 OR Zeile = 1                           // Schleife eventuell wiederholen
                END_REPEAT;
                Gewinn:= Folge = 4;                                                 // Gewinn setzen, wenn Folge=4
            END_IF;


Als nächstes die Zeilenprüfung:
Code:
[FONT=courier new]6 [/FONT]o o o o o o o[FONT=courier new] 
[/FONT]5 o o o o o o o
4 ? ? ? ? X ? ?
3 o o o o o o o
2 o o o o o o o
1 o o o o o o o
x 1 2 3 4 5 6 7
Hier kann der Spielstein auch ein mittlerer sein. Also in der aktuellen Zeile bei Spalte 1 mit Folge=0 anfangen und die Prüfung abbrechen, wenn Folge=4 oder Spalte>7. Die Spaltenweiterschaltung würde ich hier (im Gegensatz zur Zeile bei der Spaltenprüfung) erst nach der Prüfung machen.


3. Erste Diagonale:
Code:
[FONT=courier new]6 [/FONT]o o o o o o ?[FONT=courier new] 
[/FONT]5 o o o o o ? o
4 o o o o X o o
3 o o o ? o o o
2 o o ? o o o o
1 o ? o o o o o
x 1 2 3 4 5 6 7
Auch hier kann der aktuelle Spielstein wieder ein mittlerer der Reihe sein. Also von ganz unten in Zeile 1 an prüfen. Die Spalte mit der begonnen wird, ist die aktuelle Spalte minus die aktuelle Zeile plus 1. Und dann nach oben arbeiten -> Zeile + 1 und Spalte + 1. die Prüfung kann abgebrochen werden, wenn Folge = 4 oder Spalte > 7 oder Zeile > 6.
Ein Problem kommt bei der Prüfung noch dazu, was man gleich bei der anderen Diagonale sieht.


3. Zweite Diagonale:
Code:
[FONT=courier new]6 [/FONT]o o ? o o o o[FONT=courier new] 
[/FONT]5 o o o ? o o o
4 o o o o X o o
3 o o o o o ? o
2 o o o o o o ?
1 o o o o o o o ?
x 1 2 3 4 5 6 7 8
Wie man sieht, können die Diagonalen auch außerhalb des Spielfelds beginnen. Wenn also die Spalte einen Wert außerhalb des Spielfelds hat, muss die Prüfung übersprungen werden, Folge bleibt dann einfach noch bei 0. Der Rest ist ähnlich wie bei der anderen Diagonale, nur das die Anfangsspalte anders berechnet wird und dann die Spalten rückwärts durchlaufen werden. Und andere Abbruchbedingungen natürlich.
 
Wenn er die Schleifen der Überprüfung in passenden Bereichen laufen lässt, braucht er nicht abfragen ob er sich außerhalb des Feldes bewegen kann.

Dann gäbe es vier Überprüfungen: horizontal, vertikal, diagonal nach rechts/oben, diagonal nach links/oben.

Mit den folgenden Grenzen für die Schleifen (Grafik nach prinzip Hucki, Fragezeichen bedeutet dass diese Felder geprüft werden):


Schleife Prüfung horizontal: Spalten 1 bis 5, Zeilen 1 bis 6
Code:
6                  6                  6                  6                  6                  
5                  5                  5                  5                  5                  
4                  4                  4                  4                  4                  
3                  3                  3                  3                  3                  
2                  2                  2                  2                  2                  
1 ? ? ? ?          1   ? ? ? ?        1     ? ? ? ?      1       ? ? ? ?    1         ? ? ? ?  
x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8

Schleife Prüfung vertikal: Spalten 1 bis 8, Zeilen 1 bis 3
Code:
6                  6                  6 ?                6                  6                  
5                  5 ?                5 ?                5                  5   ?              
4 ?                4 ?                4 ?                4   ?              4   ?              
3 ?                3 ?                3 ?                3   ?              3   ?              
2 ?                2 ?                2                  2   ?              2   ?              
1 ?                1                  1                  1   ?              1                  
x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8

Schleife Prüfung diagonal rechts/oben: Spalten 1 bis 5, Zeilen 1 bis 3
Code:
6                  6                  6                  6                  6                  
5                  5                  5                  5                  5                  
4       ?          4         ?        4           ?      4             ?    4               ?  
3     ?            3       ?          3         ?        3           ?      3             ?    
2   ?              2     ?            2       ?          2         ?        2           ?      
1 ?                1   ?              1     ?            1       ?          1         ?        
x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8

Schleife Prüfung diagonal links/oben: Spalten 4 bis 8, Zeilen 1 bis 3
Code:
6                  6                  6                  6                  6                  
5                  5                  5                  5                  5                  
4 ?                4   ?              4     ?            4       ?          4         ?        
3   ?              3     ?            3       ?          3         ?        3           ?      
2     ?            2       ?          2         ?        2           ?      2             ?    
1       ?          1         ?        1           ?      1             ?    1               ?  
x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8  x 1 2 3 4 5 6 7 8
 
Hallo Thomas,
warum willst Du soviele Reihen testen?
Der Gewinn kann doch nur in den 4 Reihen erfolgen, die das Feld kreuzen, in das der letzte Stein geworfen wurde.

PS: Einen ähnlichen Weg wollte ich auch erst nehmen, habe ihn dann aber verworfen, weil man m.M.n. so entweder 4x2 ineinander verschachtelte Schleifen oder das aufwendigere "Problem" hat, von den kreuzenden Diagonalen, die entsprechenden Spielfeldgrenzen zu berechnen. Deswegen rechne ich die Diagonale einfach immer bis in die erste Zeile. So hat man nur 4 einfache Schleifen, die sich dann bei einem Gewinn wahrscheinlich auch leichter abbrechen lassen (so man das will), oder?
 
Zuletzt bearbeitet:
Geht schon, wenn ich es auch etwas umständlich finde.

Du hast aber 2 Logikfehler in Deinem ersten Code:
1. Wenn Du eine Gewinnfolge gefunden hast, muss die Schleife unterbrochen werden. Ansonsten überschreiben die folgenden Prüfungen die 4er Folge wieder. Alternativ kannst Du auch innerhalb der Schleife ein eindeutiges Flag setzen, wenn Du 4 folgende Steine hast.
2. Musst Du auch in jeder Spalte wieder bei 0 beginnen. Jetzt nimmst Du die gleichen Steine aus der Vorspalte mit. Die könnte ja schließlich bis oben gefüllt sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag

Die Auswertung für die Spalten und Zeilen sind gemacht und funktionieren. Mein Problem ist noch die Diagonale.

Wenn ich eine geschachelte For-Schleife nehme dann geht es in der Theorie nicht.

D.h. Es wird ja die eine For-Schleife abgearbeitet und danach die andere, deswegen kann es auch nicht sein das es die Diagonale überprüft?

Habe ich recht?

Oder liege ich falsch.

Gruss
 
Genau so ist es.

Deswegen habe ich bei meinem Entwurf für die Auswertung überhaupt keine FOR_Schleife verwendet. Hat die Sache für mich erheblich einfacher gemacht und läuft im wesentlichen schon seit Post #7.
:ROFLMAO:
 
hmmmm.....:confused:

Ich möchte aber die Programmierung nicht ändern. Was denkst du geht es auch anderst wenn du es Spontan sagen könntest?

gruss
 
Zurück
Oben