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 18:07]
Ivo Blöchliger [Weitere Demos]
lehrkraefte:blc:informatik:glf20:oxoaccel [2020/12/16 10:37] (current)
Ivo Blöchliger [Weitere Demos]
Line 235: Line 235:
 <hidden Shaker Tetris> <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. 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 shakertetris.py>+<code python shakertetris.py>
 from oxocard import * from oxocard import *
 from ivobuttons import * from ivobuttons import *
Line 342: Line 342:
 </code> </code>
 </hidden> </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.1607879273.txt.gz
  • Last modified: 2020/12/13 18:07
  • by Ivo Blöchliger