lehrkraefte:blc:informatik:glf20:oxoaccel

Spiele auf der OxoCard mit dem Beschleunigungssensor

Der folgende Code sollte auf direkt auf der OxoCard getestet werden (macht sonst kaum Spass).

accel.py
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()

Punkt mit Trail

Punkt mit Trail

trail.py
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()
 

Sand

Sand

Hinweis: Auf Ihrer OxoCard könnte sich noch eine fehlerhafte ivobuttons-Bibliothek befinden. Laden Sie dazu die Datei install.py auf die OxoCard, siehe

shaker.py
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()
 

Shaker Tetris

Shaker Tetris

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.

shakertetris.py
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<n:
        x,y = pos[p][0], pos[p][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[p][0], pos[p][1] = a,b
                fastDot(pos[p][0], pos[p][1], farben[p])
                fastRepaint()                
                for x in range(8):
                    f = fastGetDot(x,0)
                    if f!=BLACK and f==fastGetDot(x,1) and f==fastGetDot(x,2):
                        print("x=%d" % x)
                        for flash in range(10):
                            for y in range(3):
                                fastDot(x,y,WHITE)
                            fastRepaint()
                            sleep(0.1)
                            for y in range(3):
                                fastDot(x,y,f)
                            fastRepaint()
                            sleep(0.1)
 
                        i=0
                        while i<n:
                            if pos[i][0]==x and pos[i][1]<3:
                                fastDot(pos[i][0],pos[i][1],BLACK);
                                del pos[i]
                                del farben[i]
                                if i<=p:
                                    p-=1
                                n-=1
                            else:
                                i+=1
                    fastRepaint()
 
        p+=1                    
 
 
 

Labyrinth

Labyrinth

Durch Neigen der OxoCard gelangen Sie von der oberen linken Ecke in die untere rechte Ecke.

laby.py
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<laby['size'] and yy>=0 and yy<laby['size']:
                f = farben[laby['feld'][xx][yy]]
            fastDot(x,y,f)
    fastDot(3,3,GREEN)
    fastRepaint()
 
 
enableRepaint(False)  # Damit es auch im Simulator einigermassen läuft.
 
acc = Accelerometer.create()
generate()
zeichnen()
 
dimmwerte = [0,1,2,3,4,6,8,10,13,16,20,25,30,36,43,51,60,70,82,96,115,130,150,180,215,255]
 
while True:
    ac = acc.getValues()  # Aktuelle Beschleunigung auslesen
    zeit = getms()           # Aktuelle Zeit
    pos = [laby['x'], laby['y']]
    for i in range(2):       # i=0 für x-Koordinate, i=1 für y-Koordinate
        if abs(ac[i])>1 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)
 
 
  • lehrkraefte/blc/informatik/glf20/oxoaccel.txt
  • Last modified: 2020/12/16 10:37
  • by Ivo Blöchliger