lehrkraefte:blc:informatik:glf20:oxoaccel

This is an old revision of the document!


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.

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                    
 
 
 
  • lehrkraefte/blc/informatik/glf20/oxoaccel.1607879273.txt.gz
  • Last modified: 2020/12/13 18:07
  • by Ivo Blöchliger