Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| lehrkraefte:blc:informatik:ffprg1-2019:arrays-anwendung2 [2019/03/26 08:30] – created Ivo Blöchliger | lehrkraefte:blc:informatik:ffprg1-2019:arrays-anwendung2 [2019/03/26 08:35] (current) – [Variante Vektorgeometrie] Ivo Blöchliger | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Wer hat gewonnen? ====== | ||
| + | **Ausgangslage**: | ||
| + | Zu schreiben ist eine Funktion, die überprüft ob 3 (oder allgemeiner $n$) gleiche Einträge " | ||
| + | |||
| + | Die Grösse vom Spielfeld ist '' | ||
| + | |||
| + | ===== Variante "viele if" ===== | ||
| + | Für ein 3x3-Feld könnte man mit einem Haufen if-Abfragen das Feld überprüfen, | ||
| + | if feld[0][0]!=" | ||
| + | return feld[0][0] | ||
| + | ... | ||
| + | ... | ||
| + | return " " | ||
| + | |||
| + | Sobald das Feld grösser als 3x3 ist (z.B. 7x6 für Vier gewinnt), ist das natürlich völlig unpraktikabel. | ||
| + | |||
| + | ===== Variante Vektorgeometrie ===== | ||
| + | Die Grundidee ist die gleiche wie bei der Parameterdarstellung der Geraden in der Vektorgeometrie. Man definiert einen Startpunkt und einen Richtungsvektor, | ||
| + | |||
| + | D.h. Man startet z.B. im Punkt (0,2) und verschiebt dann schrittweise um den Vektor $\binom{1}{-1}$, | ||
| + | |||
| + | punkt = startpunkt | ||
| + | anzahl = 0 | ||
| + | was = " " | ||
| + | while (punkt noch im feld): | ||
| + | | ||
| + | if inhalt==" | ||
| + | anzahl = 0 | ||
| + | was = " " | ||
| + | else: | ||
| + | if inhalt==was: | ||
| + | | ||
| + | if anzahl==3 | ||
| + | return was # Plus eventuell melden, wo | ||
| + | else: | ||
| + | | ||
| + | was = inhalt | ||
| + | punkt = punkt + richtung | ||
| + | |||
| + | |||
| + | Was jetzt noch fehlt, sind die Startpunkte für die Überprüfung und die Richtungsvektoren. Die Idee ist, die Startpunktskoordinaten in einer for-Schleife zu erzeugen. | ||
| + | |||
| + | ==== Variante "noch ein bisschen effizienter" | ||
| + | Es muss nicht jedes Mal das ganze Feld überprüft werden. Es reicht, von der Position aus zu zählen, wo das Feld verändert wurde. Dazu muss in die vier Richtungen (d.h. horizontal, vertikal und 2 diagonal) vorwärts **und** rückwärts gezählt werden. | ||
| + | |||
| + | Dazu schreibt man am einfachsten eine for-Schleife über die möglichen Richtungen: | ||
| + | |||
| + | for dir in [[1, | ||
| + | anzahl = In Richtung '' | ||
| + | anzahl += In Richtung '' | ||
| + | anzahl +=1 # Die Position selbst zählen | ||
| + | if anzahl==3: | ||
| + | | ||
| + | return False # Kein Sieg | ||