Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 37

Thema: Fragen zum SCL-Code

  1. #11
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

  2. #12
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    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:
    6 o o o o o o o 
    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:
    6 o o o o o o o 
    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 "aktuelle Zeile" > 3 THEN         
                    Folge := 1;                                                         // Folge gleicher Spielsteine initieren
                    Spalte:= "aktuelle Spalte";                                         // Spalte des aktuellen Spielzuges auslesen
                    Zeile := "aktuelle Zeile";                                          // Zeile  des aktuellen Spielzuges auslesen
                    REPEAT
                        Zeile:= Zeile - 1;                                              // letzten Wert für Zeile um eins verringern
                        Folge:= SEL (G:= SPIELFELD[Spalte, Zeile] = "aktuelle Spieler", // 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:
    6 o o o o o o o 
    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:
    6 o o o o o o ? 
    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:
    6 o o ? o o o o 
    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.

  3. #13
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    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

  4. #14
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    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?
    Geändert von hucki (03.11.2013 um 03:04 Uhr)

  5. #15
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke für eure antworten.

    So wie ich gelöst habe geht das nicht?

  6. #16
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    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.

  7. #17
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    hier eine alte C/C++ Implementierung: 4 Gewinnt Auswertung

    wäre der Aufbau für SCL (un)geeignet - warum?

  8. #18
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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

  9. #19
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    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.

  10. #20
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hmmmm.....

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

    gruss

Ähnliche Themen

  1. TIA Fragen zum code
    Von bkizilkaya im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 21.10.2013, 12:21
  2. Exponent im SCL Code
    Von paula23 im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 08.09.2013, 19:40
  3. Fehlersuche SCL-Code
    Von Sinix im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 12.07.2011, 14:53
  4. Fehler im SCL Code
    Von Felse im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 18.06.2009, 12:33
  5. SCL code
    Von awl-scl im Forum Simatic
    Antworten: 21
    Letzter Beitrag: 14.01.2008, 17:02

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •