Skip to content

Instantly share code, notes, and snippets.

@fabiommendes
Last active September 13, 2021 18:57
Show Gist options
  • Save fabiommendes/6f9a1932af0a9796f7d26048d0f7f97c to your computer and use it in GitHub Desktop.
Save fabiommendes/6f9a1932af0a9796f7d26048d0f7f97c to your computer and use it in GitHub Desktop.
import pyxel
from copy import deepcopy
LARGURA = 80
ALTURA = 60
# Liga/desliga simulação
pausa = True
# Tabuleiro de booleanos mostrando as células preenchidas
life = [[False] * LARGURA for _ in range(ALTURA)]
#
# Funções update/draw do pyxel
#
def update():
global pausa, life
# Desenha/apaga células com o mouse
if pyxel.btn(pyxel.MOUSE_LEFT_BUTTON):
x = pyxel.mouse_x
y = pyxel.mouse_y
life[y][x] = True
elif pyxel.btn(pyxel.MOUSE_RIGHT_BUTTON):
x = pyxel.mouse_x
y = pyxel.mouse_y
life[y][x] = False
# Troca o estado pausado
if pyxel.btnp(pyxel.KEY_SPACE):
pausa = not pausa
# Atualiza a simulação
if not pausa and pyxel.frame_count % 2 == 0:
life = update_life(life)
def draw():
pyxel.cls(pyxel.COLOR_BLACK)
# Desenha o tabuleiro
for i in range(ALTURA):
for j in range(LARGURA):
if life[i][j] == True:
pyxel.pset(j, i, pyxel.COLOR_WHITE)
# Destaca a posição atual do mouse
x = pyxel.mouse_x
y = pyxel.mouse_y
col = pyxel.COLOR_PURPLE
pyxel.pset(x, y, col)
# Desenha o símbolo de pausa
if pausa:
pyxel.rect(LARGURA / 2 - 1, ALTURA / 2, 1, 3, pyxel.COLOR_PURPLE)
pyxel.rect(LARGURA / 2 + 1, ALTURA / 2, 1, 3, pyxel.COLOR_PURPLE)
def update_life(life):
"""
Executa uma rodada da simulação e retorna uma cópia com
o novo estado da simulação.
"""
# - Célula morta fica viva se tiver exatamente 3 vizinhos vivos
# - Célula viva fica morta se tiver 1 ou menos ou 4 ou mais vizinhos vivos
life_new = deepcopy(life)
for i in range(ALTURA):
for j in range(LARGURA):
n = n_vizinhos(life, i, j)
is_alive = life[i][j]
if not is_alive and n == 3:
life_new[i][j] = True
elif is_alive and (n > 3 or n < 2):
life_new[i][j] = False
return life_new
def n_vizinhos(m, x, y):
n = 0
n += get_xy(m, x - 1, y - 1)
n += get_xy(m, x - 1, y)
n += get_xy(m, x - 1, y + 1)
n += get_xy(m, x, y - 1)
n += get_xy(m, x, y + 1)
n += get_xy(m, x + 1, y - 1)
n += get_xy(m, x + 1, y)
n += get_xy(m, x + 1, y + 1)
return n
def get_xy(m, x, y):
try:
return m[x][y]
except IndexError:
return False
pyxel.init(LARGURA, ALTURA)
pyxel.run(update, draw)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment