====== Spiele auf der OxoCard mit dem Beschleunigungssensor ====== Der folgende Code sollte auf direkt auf der OxoCard getestet werden (macht sonst kaum Spass). from oxocard import * from ivobuttons import * from oxoaccelerometer import * # Zustand vom Spiel pos = [0,0] # x- und y-Koordinaten in einer Liste, pos[0], und pos[1] farbe = RED naechste = [0,0] # Zeit, ab wann die nächste Bewegung in x- und y-Richtung stattfinden darf. # Beschleunigungssensor acc = Accelerometer.create() # Funktionen zum Zeichnen und löschen des Spielzustands def zeichnen(): global pos, farbe # Veriablen von ausserhalb dieser Funktion verwenden fastDot(pos[0], pos[1], farbe) fastRepaint() def loeschen(): global pos fastDot(pos[0], pos[1], BLACK) # Begrenzt einen Wert zwischen 0 und 7 (damit man sicher auf dem Display bleibt). def clip(v): if v<0: v=0 if v>7: v=7 return v zeichnen() pneu = [0,0] # Variable für neue Position while True: ac = acc.getValues() # Aktuelle Beschleunigung auslesen pneu[0], pneu[1] = pos[0], pos[1] # Kopie der Position zeit = getms() # Aktuelle Zeit for i in range(2): # i=0 für x-Koordinate, i=1 für y-Koordinate if abs(ac[i])>1 and zeit>naechste[i]: # Mehr als 1 m/s^2 Beschleunigung in x- bzw. y-Richtung und nächste Bewegung kann schon stattfinden dir = 1 # Richtung positiv if ac[i]<0: # Ausser wenn Beschleunigung negativ dir = -1 if i==1: # Vorzeichenwechsel für y dir = -dir pneu[i] = clip(pos[i]+dir) # Neue Position, garantiert auf Display dank oben definierter clip-Funktion # Kleine Beschleunigung, länger bis zur nächsten Bewegung warten, grosse Beschleunigung -> wenig warten. naechste[i] = zeit + 200 - abs(ac[i]*20) # Nur wenn sich etwas geändert hat auch neu zeichnen. # Arrays sind dann gleich (==) wenn alle Elemente gleich sind. if pneu!=pos: loeschen() pos[0], pos[1] = pneu[0], pneu[1] zeichnen() ===== Weitere Demos ===== from oxocard import * from ivobuttons import * from oxoaccelerometer import * # Zustand vom Spiel pos = [0,0] # x- und y-Koordinaten in einer Liste, pos[0], und pos[1] farbe = RED # Farbe vom Punkt naechste = [0,0] # Zeit, ab wann die nächste Bewegung in x- und y-Richtung stattfinden darf. # Position und Farben vom Trail ntrail = 12 trail = [[0,0] for i in range(ntrail)] farben = [(255-i*20,0,i*20) for i in range(ntrail)] farben[ntrail-1]=BLACK trailstart = 0 wegmit = getms() # Maximale Zeit bis der Trail nachkommt # Beschleunigungssensor acc = Accelerometer.create() # Funktionen zum Zeichnen und löschen des Spielzustands def zeichnen(): global pos, farbe, trail, farben, trailstart, ntrail # Veriablen von ausserhalb dieser Funktion verwenden for i in range(ntrail): t = (i+trailstart)%ntrail fastDot(trail[t][0], trail[t][1], farben[i]) fastDot(pos[0], pos[1], farbe) fastRepaint() def loeschen(): global pos, trail, trailstart fastDot(pos[0], pos[1], BLACK) t = trailstart-1 # Negative Indizies sind ok und greifen von hinten auf die Liste zu fastDot(trail[t][0], trail[t][1], BLACK) def trailsave(): global pos, trail, trailstart trailstart = (trailstart+ntrail-1)%ntrail trail[trailstart][0] = pos[0] trail[trailstart][1] = pos[1] # Begrenzt einen Wert zwischen 0 und 7 (damit man sicher auf dem Display bleibt). def clip(v): if v<0: v=0 if v>7: v=7 return v zeichnen() pneu = [0,0] # Variable für neue Position while True: ac = acc.getValues() # Aktuelle Beschleunigung auslesen pneu[0], pneu[1] = pos[0], pos[1] # Kopie der Position zeit = getms() # Aktuelle Zeit for i in range(2): # i=0 für x-Koordinate, i=1 für y-Koordinate if abs(ac[i])>1 and zeit>naechste[i]: # Mehr atls 1 m/s^2 Beschleunigung in x- bzw. y-Richtung und nächste Bewegung kann schon stattfinden dir = 1 # Richtung positiv if ac[i]<0: # Ausser wenn Beschleunigung negativ dir = -1 if i==1: # Vorzeichenwechsel für y dir = -dir pneu[i] = clip(pos[i]+dir) # Neue Position, garantiert auf Display dank oben definierter clip-Funktion # Kleine Beschleunigung, länger bis zur nächsten Bewegung warten, grosse Beschleunigung -> wenig warten. naechste[i] = zeit + 100 - abs(ac[i]*10) # Nur wenn sich etwas geändert hat auch neu zeichnen. # Arrays sind dann gleich (==) wenn alle Elemente gleich sind. if pneu!=pos: trailsave() wegmit = zeit loeschen() pos[0], pos[1] = pneu[0], pneu[1] zeichnen() if zeit-wegmit>100: wegmit=zeit loeschen() trailsave() zeichnen() Hinweis: Auf Ihrer OxoCard könnte sich noch eine fehlerhafte ivobuttons-Bibliothek befinden. Laden Sie dazu die Datei install.py auf die OxoCard, siehe from oxocard import * from ivobuttons import * from oxoaccelerometer import * # Zustand vom Spiel # Positionen und Farben vom Trail n = 24 pos = [[i%8,i//8] for i in range(n)] farben = [(255-i*10,0,i*10+15) for i in range(n)] # Beschleunigungssensor acc = Accelerometer.create() for i in range(8): if i<4 or i>4: fastDot(i,3,GREEN) # Funktionen zum Zeichnen und löschen des Spielzustands def zeichnen(): global pos, farben,n # Variablen von ausserhalb dieser Funktion verwenden for i,p in enumerate(pos): fastDot(p[0], p[1], farben[i]) fastRepaint() def loeschen(): global pos, farben,n # Variablen von ausserhalb dieser Funktion verwenden for i,p in enumerate(pos): fastDot(p[0], p[1], BLACK) # Begrenzt einen Wert zwischen 0 und 7 (damit man sicher auf dem Display bleibt). def clip(v): if v<0: v=0 if v>7: v=7 return v zeichnen() pneu = [0,0] # Variable für neue Position while True: ac = acc.getValues() # Aktuelle Beschleunigung auslesen dir = [0,0] for c in range(2): # i=0 für x-Koordinate, i=1 für y-Koordinate dir[c] = 1 # Richtung positiv if ac[c]<0: # Ausser wenn Beschleunigung negativ dir[c] = -1 dir[1]=-dir[1] # Vorzeichenwechsel in y-Richtung for i in range(n): x,y = pos[i][0], pos[i][1] a,b = clip(x+dir[0]), clip(y+dir[1]) if a!=x or b!=y: change = False if fastGetDot(a,b)==BLACK: change = True elif (abs(a-x)+abs(b-y))==2: if fastGetDot(a,y)==BLACK: b=y change = True elif fastGetDot(x,b)==BLACK: a=x change = True if change: fastDot(x,y, BLACK) pos[i][0], pos[i][1] = a,b fastDot(pos[i][0], pos[i][1], farben[i]) fastRepaint() Versuchen Sie in der oberen Hälfte, vertikal die drei gleichen Farben hinzukriegen. Dieser verschwinden dann. Ziel ist es, alle Pixel zum Verschwinden zu bringen. from oxocard import * from ivobuttons import * from oxoaccelerometer import * # Zustand vom Spiel # Positionen und Farben vom Trail n = 24 pos = [[i%8,i//8] for i in range(n)] choice = [RED, YELLOW, MAGENTA, BLUE] farben = [choice[(i//3)%4] for i in range(n)] # Beschleunigungssensor acc = Accelerometer.create() for i in range(8): if i<4 or i>4: fastDot(i,3,GREEN) # Funktionen zum Zeichnen und löschen des Spielzustands def zeichnen(): global pos, farben,n # Variablen von ausserhalb dieser Funktion verwenden for i,p in enumerate(pos): fastDot(p[0], p[1], farben[i]) fastRepaint() def loeschen(): global pos, farben,n # Variablen von ausserhalb dieser Funktion verwenden for i,p in enumerate(pos): fastDot(p[0], p[1], BLACK) # Begrenzt einen Wert zwischen 0 und 7 (damit man sicher auf dem Display bleibt). def clip(v): if v<0: v=0 if v>7: v=7 return v zeichnen() pneu = [0,0] # Variable für neue Position while True: ac = acc.getValues() # Aktuelle Beschleunigung auslesen dir = [0,0] for c in range(2): # i=0 für x-Koordinate, i=1 für y-Koordinate dir[c] = 1 # Richtung positiv if ac[c]<0: # Ausser wenn Beschleunigung negativ dir[c] = -1 dir[1]=-dir[1] # Vorzeichenwechsel in y-Richtung p=0 while p Durch Neigen der OxoCard gelangen Sie von der oberen linken Ecke in die untere rechte Ecke. from oxocard import * from ivobuttons import * from oxoaccelerometer import * from random import randrange # Funktion randrange importieren # Gamestate als Dictionary, d.h. wie eine Liste aber mit Namen als Indizes laby = { "size" : 7, # Muss ungerade sein! "feld": None, # Wird das Feld enthalten "x": 1, # Position vom Punkt "y": 1, "next": [0,0], # Zeit zum nächsten Zeichnen } def myArrayShuffle(a): # Zufälliges verwürfeln eines Arrays l = len(a) for i in range(l): j = randrange(i,l) a[i],a[j] = a[j],a[i] def generate(): # Erzeugt ein zufälliges Labyrinth global laby laby['feld'] = [[1 if (x==0 or y==0 or x==laby['size']-1 or y==laby['size']-1) else (2 if x%2==0 or y%2==0 else 3) for x in range(laby['size'])] for y in range(laby['size'])] todo = [[1,1]] laby['feld'][1][1]=0 dirs = ((1,0),(0,1),(-1,0),(0,-1)) ind = [0,1,2,3] while len(todo)>0: index = max(len(todo)-1-int(randrange(101)**2/2000),0) pos = todo[index] del todo[index] myArrayShuffle(ind) for d in ind: a,b = pos[0]+dirs[d][0], pos[1]+dirs[d][1] if laby['feld'][a][b]==2: aa,bb = a+dirs[d][0], b+dirs[d][1] if laby['feld'][aa][bb]==3: laby['feld'][a][b] = 0 laby['feld'][aa][bb] = 0 todo.append(pos) todo.append((aa,bb)) break laby['x']=1 laby['y']=1 def dimmen(m, farben): for i in range(len(farben)): farben[i]=tuple(map(lambda x:min(m,x),farben[i])) def zeichnen(m=255): global laby farben = [BLACK, RED, BLUE, YELLOW] dimmen(m,farben) for x in range(8): xx = laby['x']+x-3 for y in range(8): yy = laby['y']+y-3 f = BLACK if xx>=0 and xx=0 and yy1 and zeit>laby['next'][i]: # Mehr als 1 m/s^2 Beschleunigung in x- bzw. y-Richtung und nächste Bewegung kann schon stattfinden dir = 1 # Richtung positiv if ac[i]<0: # Ausser wenn Beschleunigung negativ dir = -1 if i==1: # Vorzeichenwechsel für y dir = -dir pos[i] += dir # Kleine Beschleunigung, länger bis zur nächsten Bewegung warten, grosse Beschleunigung -> wenig warten. laby['next'][i] = zeit + 200 - abs(ac[i]*20) if (pos[0]!=laby['x'] or pos[1]!=laby['y']) and laby['feld'][pos[0]][pos[1]]==0: laby['x'] = pos[0] laby['y'] = pos[1] zeichnen() if (laby['x']==laby['size']-2 and laby['y']==laby['size']-2): for i in range(len(dimmwerte)-1,-1,-1): zeichnen(dimmwerte[i]) laby['size']+=4 generate() for i in dimmwerte: zeichnen(i)