File: conway.py

package info (click to toggle)
firmware-microbit-micropython 1.0.1-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 25,448 kB
  • sloc: ansic: 83,496; cpp: 27,664; python: 2,475; asm: 274; makefile: 245; javascript: 41; sh: 25
file content (58 lines) | stat: -rw-r--r-- 1,842 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
'''
Conway's Game Of Life for the micro:bit

Press button A or tap the micro:bit to generate a fresh layout.
'''

import microbit
import random

arena1 = bytearray(7 * 7)
arena2 = bytearray(7 * 7)

def show():
    img = microbit.Image(5,5)
    for y in range(5):
        for x in range(5):
            img.set_pixel(x, y, arena1[8 + y * 7 + x]*9)
    microbit.display.show(img)

# do 1 iteration of Conway's Game of Life
def conway_step():
    global arena1, arena2
    for i in range(5 * 5): # loop over pixels
        i = 8 + (i // 5) * 7 + i % 5
        # count number of neighbours
        num_neighbours = (arena1[i - 8] +
                arena1[i - 7] +
                arena1[i - 6] +
                arena1[i - 1] +
                arena1[i + 1] +
                arena1[i + 6] +
                arena1[i + 7] +
                arena1[i + 8])
        # check if the centre cell is alive or not
        self = arena1[i]
        # apply the rules of life
        if self and not (2 <= num_neighbours <= 3):
            arena2[i] = 0 # not enough, or too many neighbours: cell dies
        elif not self and num_neighbours == 3:
            arena2[i] = 1 # exactly 3 neighbours around an empty cell: cell is born
        else:
            arena2[i] = self # stay as-is
    # swap the buffers (arena1 is now the new one to display)
    arena1, arena2 = arena2, arena1

while True:
    # randomise the start
    for i in range(5 * 5): # loop over pixels
        i = 8 + (i // 5) * 7 + i % 5
        arena1[i] = random.randrange(2) # set the pixel randomly
    show()
    microbit.sleep(1) # need to yield to update accelerometer (not ideal...)

    # loop while button a is not pressed
    while not microbit.button_a.is_pressed() and microbit.accelerometer.get_z() < -800:
        conway_step()
        show()
        microbit.sleep(150)