Ineinander geschachtelte for
-Schlaufen:
line
und move
in der Dokumentation ansetColor(makeColor(255, 0, 0, 100))
wird zum Beispiel ein transparentes Rot dargestellt.pushState()
und popState()
(siehe Beispiel Kapitel 2.11) anzuschauen. for c in 'abcd': print c
Neber der Möglichkeit, Farben als Strings anzugeben, besteht immer auch die Möglichkeit, Farben als RGB-Werte mit setColor(makeColor(r,g,b))
zu definieren. $r$, $g$, $b$ sind dabei die Rot-, Grün- und Blau-Anteile zwischen $0$ und $255$. Farben auswählen kann man mit einem ColorPicker
setColor()
werden. Verwende dabei mindestens drei Farben.definiereFarbe
zu schreiben.from gpanel import * # Globale Variablen zur Steurung kachelsize = 4 kachelno = 4 makeGPanel(0, kachelno*kachelsize, 0, kachelno*kachelsize) #Spielbrett tiles = [[-1, 2 ,4, 8], [16, 32 , 64, 128 ], [256, 512, 1024, 2048], [ -1 , -1, -1 , -1 ]] # Funktion zeichnet Kachel. # Argumente: olx, oly x und y Koordinate oben links # shownumber: Zahl die angezeigt werden soll # size: Grösse der Kachel def zeichneKachel(olx, oly, color, shownumber="", size=kachelsize): setColor(color) fillRectangle(olx,oly,olx+size,oly-size) if shownumber <> "": text(olx+size/2,oly-size/2,str(tiles[i][j]), Font("Courier", Font.PLAIN, 24),"black","white") # Funktion gibt Farbe auf Grund von Kachelwert zurück # Argumente: Kachelwert -1,2,4,...,2049 def definiereFarbe(kachelwert): # hier die Funktion definieren return("green") #loop durch zeilen for i in range(0, kachelno): #loop durch spalten for j in range(0, kachelno): #zeichne die Kachel i,j mit definierter Farbe zeichneKachel(0+j*kachelsize, kachelno*kachelsize-i*kachelsize, definiereFarbe(tiles[i][j]), str(tiles[i][j])) getKeyCodeWait() dispose()
Für 2048 müssen wir Elemente in Listen verschieben und ändern. Löse dazu folgende Aufgaben:
[3,8,-1,3]
nach rechts schiebt. Achtung: '-1' steht dabei für «leer» %aus [[-1, 2, 4, 8], [16, 32, 64, 128], [256, 512, 1024, 2048], [-1, -1, -1, -1]] % wird [[-1, 256, 16, -1], [-1, 512, 32, 2], [-1, 1024, 64, 4], [-1, 2048, 128, 8]]
Listen sind zwar iterierbare Objekte, manchmal ist es aber hilfreich die Indices zu verwenden: Zwei von der Ausgabe her äquivalente Lösungen zur Ausgabe jedes Elements sind unten.
items = [2,-1,8,4] for i in range(len(items)): print(items[i]) for el in items: print(el)
Als kleine Hilfestellung noch die untenstehende Funktion printDoubleLists(lists)
. Diese gibt eine geschachtelte Liste wie sie z.B. in 2048 vorkommen, auf der Konsole aus.
import sys tiles = [[-1, 2 ,4, 8], [16, 32 , 64, 128 ], [256, 512, 1024, 2048], [ -1 , -1, -1 , -1 ]] def printDoubleLists(lists): for i in range(len(lists)): for j in range(len(lists[i])): sys.stdout.write(str(lists[i][j])) sys.stdout.write("\t") sys.stdout.write("\n") printDoubleLists(tiles)