lehrkraefte:blc:informatik:glf20:oxoaccel

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:glf20:oxoaccel [2020/12/13 16:37]
Ivo Blöchliger
lehrkraefte:blc:informatik:glf20:oxoaccel [2020/12/16 10:37] (current)
Ivo Blöchliger [Weitere Demos]
Line 2: Line 2:
  
 Der folgende Code sollte auf direkt auf der OxoCard getestet werden (macht sonst kaum Spass). Der folgende Code sollte auf direkt auf der OxoCard getestet werden (macht sonst kaum Spass).
-<code python>+<code python accel.py>
 from oxocard import * from oxocard import *
 from ivobuttons import * from ivobuttons import *
Line 153: Line 153:
                  
 </code> </code>
 +</hidden>
 +
 +<hidden 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 
 +<code python 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,  # 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,  # 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()
 +        
 +</code>
 +</hidden>
 +
 +<hidden 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.
 +<code python 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,  # 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,  # 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                    
 +                
 +        
 +        
 +</code>
 +</hidden>
 +<hidden Labyrinth>
 +Durch Neigen der OxoCard gelangen Sie von der oberen linken Ecke in die untere rechte Ecke.
 +<code python 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)
 +            
 +        
 +</code>
 +</hidden>
 +
  • lehrkraefte/blc/informatik/glf20/oxoaccel.1607873833.txt.gz
  • Last modified: 2020/12/13 16:37
  • by Ivo Blöchliger