conway.py

Created by ciel

Created on September 05, 2021

5.06 KB


ABOUT♡

Here’s a little game of life for NumWorks, in Python, in memory of John Conway.
If you don’t know about the Game of Life, I strongly advise you to go check this wiki
And if you want to improve the Game of Life, here’s the GitHub repo

USAGE

start(number of generations, length, width)
There’s default values so don’t worry you can directly enter start()


from kandinsky import *
import random
import time

length_of_screen, width_of_screen, living_cells = 320,200,0 #the width isn't the real width of the screen because we need room to place the generation counter

def init_map(width, length, map):#init map randomly
    for y in range(width):
        for x in range(length):
            map[y][x] = random.randint(0, 1)

def print_map(width, length, map):  # draw the map in an adaptive way to fit in the screen
    squale = (320/length)
    squale = int(squale)
    beginingX,beginingY,limitX,limitY = 0,0,squale,squale#size of each pixel
    pX, pY = 0, 0#the pointers
    for y in range(width):
        for x in range(length):
            if map[y][x] == 1:
                for pX in range(beginingX,limitX):
                    for pY in range(beginingY, limitY):
                        set_pixel(pX,pY, color(0, 0, 0))
            elif map[y][x] == 0:
                for pX in range(beginingX, limitX):
                    for pY in range(beginingY, limitY):
                        set_pixel(pX, pY, color(255, 255, 255))
            beginingX = beginingX + squale
            limitX = beginingX + squale
        beginingY = beginingY + squale
        limitY = beginingY + squale
        beginingX = 0  

def clean_map():#earase everything on the screen 
    for y in range(width_of_screen):
        for x in range(length_of_screen):
            set_pixel(x, y, color(255, 255, 255))

def logic(width, length, map, generation_counter):#aply the rules of the game 
    new_map = [[0 for x in range(length)] for y in range(width)]
    living_cells = 0
    for y in range(width):
        for x in range(length):
            num = []
            if y == 0 and x == 0:  # en haut à gauche
                num.append(map[y][x+1])
                num.append(map[y+1][x+1])
                num.append(map[y+1][x])
            if y == 0 and x == length-1:  # en haut à droite
                num.append(map[y+1][x])
                num.append(map[y+1][x-1])
                num.append(map[y][x-1])
            if y == width-1 and x == length-1:  # en bas à droite
                num.append(map[y][x-1])
                num.append(map[y-1][x-1])
                num.append(map[y-1][x])
            if y == width-1 and x == 0:  # en bas à gauche
                num.append(map[y-1][x])
                num.append(map[y-1][x+1])
                num.append(map[y][x+1])
            elif y == 0 and x != 0 and x != length - 1:  # première ligne
                num.append(map[y][y+1])
                num.append(map[y+1][x+1])
                num.append(map[y+1][x])
                num.append(map[y+1][x-1])
                num.append(map[y][x-1])
            elif x == 0 and y != 0 and y != width - 1:  # première colonne
                num.append(map[y-1][x])
                num.append(map[y-1][x+1])
                num.append(map[y][x+1])
                num.append(map[y+1][x+1])
                num.append(map[y+1][x])
            elif y == width-1 and x != 0 and x != length - 1:  # dernière ligne
                num.append(map[y][x+1])
                num.append(map[y-1][x+1])
                num.append(map[y-1][x])
                num.append(map[y-1][x-1])
                num.append(map[y][x-1])
            elif x == length - 1 and y != 0 and y != width - 1:  # dernière colonne
                num.append(map[y+1][x])
                num.append(map[y-1][x])
                num.append(map[y-1][x-1])
                num.append(map[y][x-1])
                num.append(map[y+1][x-1])
            elif x != 0 and x != length-1 and y != 0 and y != width-1:
                num.append(map[y-1][x+1])
                num.append(map[y][x+1])
                num.append(map[y+1][x+1])
                num.append(map[y+1][x])
                num.append(map[y+1][x-1])
                num.append(map[y][x-1])
                num.append(map[y-1][x-1])
                num.append(map[y-1][x])
            living_cells_arround = num.count(1)
            died_cells_around = num.count(0)
            if living_cells_arround == 3:
                new_map[y][x] = 1
                living_cells += 1
            if living_cells_arround == 2 and map[y][x] == 1:
                new_map[y][x] = 1
                living_cells += 1
            elif living_cells_arround != 2 and living_cells_arround != 3:
                new_map[y][x] = 0
    for y in range(width):
        for x in range(length):
            map[y][x] = new_map[y][x]  # merge the older vers with the new one
    draw_string("gen {}".format(generation_counter), 10, 204)
    draw_string("died {}".format((width*length)-living_cells), 80, 204)
    draw_string("living {}".format(living_cells), 180, 204)

def start(generations = 8,length = 32, width = 20):#40*25
    map = [[0 for x in range(length)] for y in range(width)]
    generation_counter = 1
    init_map(width, length, map)
    print_map(width, length, map)
    draw_string("gen 0",10,204)
    for i in range(1,generations):
        time.sleep(1.16)
        logic(width, length, map, generation_counter)
        clean_map()
        print_map(width, length, map)
        generation_counter += 1 ;