Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
4ea4fd3
delete unneeded directories, save READMEs into README directory. Crea…
hector-ledesma Jun 20, 2020
8d97a87
PyCharm related file changes
hector-ledesma Jun 20, 2020
d54add8
Init
hector-ledesma Jun 20, 2020
c75f09f
Implement run_game method
hector-ledesma Jun 20, 2020
feb4ddd
Create sparse_set_state.py
hector-ledesma Jun 20, 2020
6f5631c
Implement methods in sparse_set_state.py
hector-ledesma Jun 20, 2020
341937e
Create sparse_set_rules.py
hector-ledesma Jun 20, 2020
0e64ebd
Implement sparse_set_rules.py methods
hector-ledesma Jun 20, 2020
9e24631
Import copy in sparse_set_state.py
hector-ledesma Jun 20, 2020
8d2f5c9
Create state.py
hector-ledesma Jun 20, 2020
fe568c9
Implement abstract class State
hector-ledesma Jun 20, 2020
1e151bf
Create rule.py
hector-ledesma Jun 20, 2020
1fab20f
Implement abstract class Rule
hector-ledesma Jun 20, 2020
1bf6a63
Import abstract classes to sparse_set_rules.py and sparse_set_state.p…
hector-ledesma Jun 20, 2020
59b1557
This tutorial was a bust
hector-ledesma Jun 20, 2020
947fba1
implement minimal pygame program that creates a window
hector-ledesma Jun 21, 2020
8a48052
Main loop prints mouse location when click is released
hector-ledesma Jun 21, 2020
57ce659
Create second window when first window is closed.
hector-ledesma Jun 21, 2020
b187c06
Successfully render in a single square
hector-ledesma Jun 21, 2020
7c96641
delete main.py
hector-ledesma Jun 21, 2020
0daf32b
Create main.py
hector-ledesma Jun 21, 2020
fa76ef2
Implement all logic from the tutorial
hector-ledesma Jun 21, 2020
130b3b5
Rename main to gog_tut.py. Create draft.py
hector-ledesma Jun 21, 2020
0b7f8bc
Bring in the main.py file from PyGame branch for reference
hector-ledesma Jun 21, 2020
7cb7eb2
Create 2D array
hector-ledesma Jun 21, 2020
41cbbbf
Working on find_neighbors() method
hector-ledesma Jun 22, 2020
f95df3e
First pass implementation of find_neighbors() method
hector-ledesma Jun 22, 2020
862c119
Fix positioning of board printing.
hector-ledesma Jun 22, 2020
1531ae6
Implement a counter for "Generation"
hector-ledesma Jun 22, 2020
45c1c0e
Refactor printing board code into its own method
hector-ledesma Jun 22, 2020
51fc7e6
Reformat conway's algorithm into update_board() method
hector-ledesma Jun 22, 2020
6322438
Update game loop to use refactored methods
hector-ledesma Jun 22, 2020
9acb3ca
Update .gitignore
hector-ledesma Jun 22, 2020
649e0dc
Add comments explaining methods. Update get neighbors method to accep…
hector-ledesma Jun 22, 2020
092b19a
Pygame perfectly renders in a grid proportional to the max size of th…
hector-ledesma Jun 22, 2020
4026eb0
Window now portrays which cells are alive or dead
hector-ledesma Jun 22, 2020
10150b0
Clean up printing functions. Refactor window size into a property, th…
hector-ledesma Jun 22, 2020
74d2f6d
Can enter and exit edit mode. Effectively pausing and unpausing. Can …
hector-ledesma Jun 22, 2020
bac015d
Move the time.sleep() method call so UI is a ton more responsive whil…
hector-ledesma Jun 22, 2020
833ef05
Refactor some code
hector-ledesma Jun 23, 2020
91dcd22
CLEAR_BUTTON and PLAYBACK_BUTTONs render onto the right place
hector-ledesma Jun 23, 2020
82e89da
Playback and Clear grid functionality implemented
hector-ledesma Jun 23, 2020
e209011
Click on cell registers right index with Top padding applied
hector-ledesma Jun 23, 2020
a4035af
Render Generation indicator text onto screen
hector-ledesma Jun 23, 2020
2d50f27
Set font size dynamically
hector-ledesma Jun 24, 2020
636f6a7
Correctly lay out preset buttons
hector-ledesma Jun 24, 2020
f9e422d
Preset buttons properly load in presets
hector-ledesma Jun 24, 2020
451d3c5
Text added to all buttons
hector-ledesma Jun 24, 2020
df0c5fb
Fix bottom buttons size
hector-ledesma Jun 24, 2020
64a372a
Use the time module to control algorithm speed without ever pausing t…
hector-ledesma Jun 24, 2020
558f551
Reset generation when clicking clear, random, a preset, or the board
hector-ledesma Jun 24, 2020
8072135
Change window size
hector-ledesma Jun 24, 2020
e15aef1
Add code formatting that prints code of clicked cell in order to easi…
hector-ledesma Jun 24, 2020
b29f96d
Add rules.txt file containing rules of the game. Add button that open…
hector-ledesma Jun 25, 2020
a4e1314
Add comments to some of the code
hector-ledesma Jun 26, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,21 @@
**yarn-debug.log*
**yarn-error.log*
**yarn.lock

.idea/CS-Build-Week-1.iml

.idea/inspectionProfiles/profiles_settings.xml

.idea/inspectionProfiles/Project_Default.xml

.idea/misc.xml

.idea/modules.xml

.idea/vcs.xml

__pycache__/

Pipfile

Pipfile.lock
3 changes: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

File renamed without changes.
File renamed without changes.
File renamed without changes.
289 changes: 289 additions & 0 deletions draft.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
import copy
import pygame
import time
import os
from random import randint

def find_neighbors(i, j, arr, max):
neighbors = []
total = 0

#Find top left
if i - 1 >= 0 and j - 1 >= 0:
neighbors.append(arr[i-1][j-1])
#Find top middle
if i - 1 >= 0:
neighbors.append(arr[i-1][j])
#Find top right
if i - 1 >= 0 and j + 1 < max:
neighbors.append(arr[i-1][j+1])
#Find left
if j - 1 >= 0:
neighbors.append(arr[i][j-1])
#Find right
if j + 1 < max:
neighbors.append(arr[i][j+1])
#Find bottom left
if i + 1 < max and j - 1 >= 0:
neighbors.append(arr[i+1][j-1])
#Find bottom middle
if i + 1 < max:
neighbors.append(arr[i+1][j])
#Find bottom right
if i + 1 < max and j + 1 < max:
neighbors.append(arr[i+1][j+1])

for num in neighbors:
total += num

return total

def print_board(board):
for m in board:
for o in m:
print(o, end='\t')
print()

def update_board(max, board):
# Make a full copy of our board.
# This allows us to make a proper update,
# as otherwise we'd be trying to make updates with the wrong values
new_arr = copy.deepcopy(board)
for y in range(max):
for x in range(max):
# Using values 0 and 1 lets us simply add up all living cells
# can use this value to apply the rules of conway's game of life very easily
neighbors = find_neighbors(y, x, board, max)

# If cell is alive
if board[y][x] == 1:
if neighbors < 2 or neighbors > 3:
new_arr[y][x] = 0
# If cell is dead
else:
if neighbors == 3:
new_arr[y][x] = 1
return new_arr

def clear_board(max):
empty = [ [0] * max for i in range(max) ]
return empty

def board_preset(option, max):
mid = int(max / 2 - 1)
preset = clear_board(max)
# Glider preset
if option is 1:
preset[mid][mid] = 1
preset[mid - 1][mid] = 1
preset[mid - 2][mid] = 1
preset[mid - 2][mid + 1] = 1
preset[mid - 1][mid + 2] = 1
# --- preset
elif option is 2:
# preset[mid][mid] = 1
# preset[mid][mid-1] = 1
# preset[mid][mid+1] = 1
preset[mid - 2][mid] = 1
preset[mid - 2][mid - 2] = 1
preset[mid - 1][mid - 2] = 1
preset[mid][mid - 2] = 1
preset[mid + 2][mid] = 1
preset[mid + 2][mid - 2] = 1
preset[mid + 1][mid - 2] = 1
preset[mid - 2][mid + 2] = 1
preset[mid - 1][mid + 2] = 1
preset[mid][mid + 2] = 1
preset[mid + 1][mid + 2] = 1
preset[mid + 2][mid + 2] = 1
# Small Exploder preset
elif option is 3:
preset[mid][mid] = 1
preset[mid-1][mid] = 1
preset[mid][mid-1] = 1
preset[mid][mid+1] = 1
preset[mid+1][mid-1] = 1
preset[mid+1][mid+1] = 1
preset[mid+2][mid] = 1
return preset

def random_board(max):
random = clear_board(max)
for row in range(max):
for column in range(max):
random[row][column] = randint(0, 1)
return random

def main():
gen = 0
max = 25
l = [ [0] * max for i in range(max) ]
# Window Formulas
WINDOW = 1000
CELL_SIZE = int(WINDOW / max) - 5
BOTTOM_PADDING = int(WINDOW / 5)
TOP_PADDING = CELL_SIZE * 3
BUTTON_SIZE = int(BOTTOM_PADDING / 3)
FONT_SIZE = int(WINDOW * 0.050)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# Buttons
PLAYBACK_BUTTON = pygame.Rect(WINDOW - int(BUTTON_SIZE * 3) - 25, WINDOW + (BUTTON_SIZE) + TOP_PADDING, BUTTON_SIZE * 3, BUTTON_SIZE)
CLEAR_BUTTON = pygame.Rect(WINDOW - int(BUTTON_SIZE * 3 + 25)*2, WINDOW + (BUTTON_SIZE) + TOP_PADDING, BUTTON_SIZE * 3, BUTTON_SIZE)
RANDOM_BUTTON = pygame.Rect(WINDOW - int(BUTTON_SIZE * 3 + 25)*3, WINDOW + (BUTTON_SIZE) + TOP_PADDING, BUTTON_SIZE * 3, BUTTON_SIZE)
PRESET_BUTTON1 = pygame.Rect(20, WINDOW + BUTTON_SIZE + TOP_PADDING, BUTTON_SIZE, BUTTON_SIZE)
PRESET_BUTTON2 = pygame.Rect(40 + BUTTON_SIZE, WINDOW + BUTTON_SIZE + TOP_PADDING, BUTTON_SIZE, BUTTON_SIZE)
PRESET_BUTTON3 = pygame.Rect(60 + BUTTON_SIZE * 2, WINDOW + BUTTON_SIZE + TOP_PADDING, BUTTON_SIZE, BUTTON_SIZE)
SPEEDUP_BUTTON = pygame.Rect(WINDOW - BUTTON_SIZE - 20, TOP_PADDING / 10, BUTTON_SIZE, BUTTON_SIZE)
SPEEDDOWN_BUTTON = pygame.Rect(WINDOW - (BUTTON_SIZE + 20) * 3, TOP_PADDING / 10, BUTTON_SIZE, BUTTON_SIZE)
SPEED_BUTTON = pygame.Rect(WINDOW - (BUTTON_SIZE + 20) * 2, TOP_PADDING / 10, BUTTON_SIZE, BUTTON_SIZE)
RULES_BUTTON = pygame.Rect(WINDOW - (BUTTON_SIZE + 20) * 4, TOP_PADDING / 10, BUTTON_SIZE, BUTTON_SIZE)

#PyGame
pygame.init()
pygame.display.set_caption("Hector Ledesma - Conway's Game of Life")
screen = pygame.display.set_mode((WINDOW, WINDOW + BOTTOM_PADDING + TOP_PADDING))

edit = True
time_base = 1
speed_multiplier = 1

l[int(max / 2 - 1)][int(max / 2 - 1)] = 1

start_time = time.time()
while True:
screen.fill((0,0,0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
return 0
if event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
x = pos[0]
y = pos[1]
if PLAYBACK_BUTTON.collidepoint(x, y):
if not edit:
start_time = time.time()
edit = not edit
elif edit and CLEAR_BUTTON.collidepoint(x,y):
l = clear_board(max)
gen = 0
elif edit and y < WINDOW + TOP_PADDING and y > TOP_PADDING:
gen = 0
x2 = int(x / (CELL_SIZE + 5))
y2 = int((y - TOP_PADDING) / (CELL_SIZE + 5))

mid = int(max / 2 - 1)
where_x = ""
where_y = ""

if x2 > mid:
where_x = f'+ {x2 - mid}'
elif x2 < mid:
where_x = f'- {mid - x2}'

if y2 > mid:
where_y = f'+ {y2 - mid}'
elif y2 < mid:
where_y = f'- {mid - y2}'

print(f'preset[mid {where_y}][mid {where_x}] = 1')

# print(f"X:{x2} Y2:{y} Y2:{y2}")
l[y2][x2] = 0 if l[y2][x2] is 1 else 1
elif edit and RANDOM_BUTTON.collidepoint(x, y):
l = random_board(max)
gen = 0
elif edit and (PRESET_BUTTON1.collidepoint(x, y) or PRESET_BUTTON2.collidepoint(x, y) or PRESET_BUTTON3.collidepoint(x, y)):
gen = 0
if PRESET_BUTTON1.collidepoint(x, y):
l = board_preset(1, max)
elif PRESET_BUTTON2.collidepoint(x, y):
l = board_preset(2, max)
elif PRESET_BUTTON3.collidepoint(x, y):
l = board_preset(3, max)
elif edit and (SPEEDUP_BUTTON.collidepoint(x, y) or SPEEDDOWN_BUTTON.collidepoint(x, y)):
if SPEEDUP_BUTTON.collidepoint(x,y):
speed_multiplier += 1
if SPEEDDOWN_BUTTON.collidepoint(x,y):
speed_multiplier = speed_multiplier - 1 if speed_multiplier - 1 != 0 else speed_multiplier
elif RULES_BUTTON.collidepoint(x, y):
os.startfile('rules.txt')

# Renders grid onto screen
for i in range(max):
for j in range(max):
color = 'magenta' if l[i][j] == 1 else 'white'
pygame.draw.rect(screen, pygame.Color(color), pygame.Rect(j*(5+CELL_SIZE), i*(5+CELL_SIZE) + TOP_PADDING, CELL_SIZE, CELL_SIZE))

if not edit:
current_time = time.time()
print(f'start: {start_time}\ncurrent: {current_time}\n{current_time - start_time}\n')
if current_time - start_time >= (time_base / speed_multiplier):
l = update_board(max, l)
gen += 1
start_time = time.time()
# pygame.time.wait(int((time_base / speed) * 1000))

#Generation text
gen_font = pygame.font.SysFont('Arial', FONT_SIZE)
text_surface = gen_font.render(f'Generation: {gen}', True, WHITE)
text_rect = text_surface.get_rect()
text_rect.centery = TOP_PADDING/2
text_rect.left = 20
screen.blit(text_surface, text_rect)

#Preset 1 text
pre1_surface = gen_font.render('1', True, BLACK)

# Preset 2 text
pre2_surface = gen_font.render('2', True, BLACK)

# Preset 3 text
pre3_surface = gen_font.render('3', True, BLACK)

# Speed text
speed_surface = gen_font.render(f'x {speed_multiplier}', True, BLACK)

# Speed Up text
speedup_surface = gen_font.render(f'>>', True, BLACK)

# Speed Down text
speeddown_surface = gen_font.render(f'<<', True, BLACK)

# Random text
random_surface = gen_font.render(f'Random', True, BLACK)

# Clear text
clear_surface = gen_font.render(f'Clear', True, BLACK)

# Playback Button
playback_surface = gen_font.render(f' ► / ❚❚', True, BLACK)

# Info Button
rules_surface = gen_font.render(f' i', True, BLACK)

pygame.draw.rect(screen, pygame.Color('white'), PLAYBACK_BUTTON)
screen.blit(playback_surface, PLAYBACK_BUTTON)
pygame.draw.rect(screen, pygame.Color('white'), CLEAR_BUTTON)
screen.blit(clear_surface, CLEAR_BUTTON)
pygame.draw.rect(screen, pygame.Color('white'), RANDOM_BUTTON)
screen.blit(random_surface, RANDOM_BUTTON)
pygame.draw.rect(screen, pygame.Color('white'), PRESET_BUTTON1)
screen.blit(pre1_surface, PRESET_BUTTON1)
pygame.draw.rect(screen, pygame.Color('white'), PRESET_BUTTON2)
screen.blit(pre2_surface, PRESET_BUTTON2)
pygame.draw.rect(screen, pygame.Color('white'), PRESET_BUTTON3)
screen.blit(pre3_surface, PRESET_BUTTON3)
pygame.draw.rect(screen, pygame.Color('white'), SPEEDUP_BUTTON)
screen.blit(speedup_surface, SPEEDUP_BUTTON)
pygame.draw.rect(screen, pygame.Color('white'), SPEEDDOWN_BUTTON)
screen.blit(speeddown_surface, SPEEDDOWN_BUTTON)
pygame.draw.rect(screen, pygame.Color('white'), SPEED_BUTTON)
screen.blit(speed_surface, SPEED_BUTTON)
pygame.draw.rect(screen, pygame.Color('white'), RULES_BUTTON)
screen.blit(rules_surface, RULES_BUTTON)
pygame.display.update()

if __name__ == '__main__':
main()
Binary file removed github-settings.png
Binary file not shown.
Loading