Last active
September 13, 2021 18:57
-
-
Save fabiommendes/6f9a1932af0a9796f7d26048d0f7f97c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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