====== 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)