Advertisement
Guest User

Untitled

a guest
Nov 8th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.59 KB | None | 0 0
  1. import pygame
  2. import argparse
  3. from pygame.locals import *
  4.  
  5. from life import GameOfLife
  6. from ui import UI
  7.  
  8.  
  9. class GUI(UI):
  10.  
  11. def __init__(self, life: GameOfLife, cell_size: int = 10, speed: int = 10) -> None:
  12. super().__init__(life)
  13. self.cell_size = cell_size
  14. self.speed = speed
  15.  
  16. self.width = self.life.cols * cell_size
  17. self.height = self.life.rows * cell_size
  18. self.screen = pygame.display.set_mode((self.width, self.height))
  19.  
  20. def draw_lines(self) -> None:
  21. """ Отрисовать сетку """
  22. for x in range(0, self.width, self.cell_size):
  23. pygame.draw.line(self.screen, pygame.Color('black'),
  24. (x, 0), (x, self.height))
  25. for y in range(0, self.height, self.cell_size):
  26. pygame.draw.line(self.screen, pygame.Color('black'),
  27. (0, y), (self.width, y))
  28.  
  29. def draw_grid(self) -> None:
  30. """
  31. Отрисовка списка клеток с закрашиванием их в соответствующе цвета.
  32. """
  33. for y in range(self.life.rows):
  34. for x in range(self.life.cols):
  35. if self.life.curr_generation[y][x]:
  36. pygame.draw.rect(self.screen, pygame.Color('green'), (x * self.cell_size + 1, y * self.cell_size + 1, self.cell_size - 1, self.cell_size - 1))
  37.  
  38. def get_cell(self, x: int, y: int):
  39. return x // self.cell_size, y // self.cell_size
  40.  
  41. def run(self) -> None:
  42. # Copy from previous assignment
  43. pygame.init()
  44. clock = pygame.time.Clock()
  45. pygame.display.set_caption('Game of Life')
  46. self.screen.fill(pygame.Color('white'))
  47.  
  48. paused = False
  49. running = True
  50. while running:
  51. for event in pygame.event.get():
  52. if event.type == QUIT:
  53. running = False
  54. if event.type == KEYDOWN:
  55. if event.key == K_SPACE:
  56. paused = not paused
  57. if event.type == MOUSEBUTTONDOWN:
  58. if paused:
  59. x, y = self.get_cell(*pygame.mouse.get_pos())
  60. self.life.curr_generation[y][x] = abs(self.life.curr_generation[y][x] - 1)
  61.  
  62. self.screen.fill(pygame.Color('white'))
  63. self.draw_lines()
  64. self.draw_grid()
  65. # Отрисовка списка клеток
  66. # Выполнение одного шага игры (обновление состояния ячеек)
  67. if paused:
  68. pass
  69. else:
  70. if not self.life.is_max_generations_exceed:
  71. self.life.step()
  72. else:
  73. pygame.display.set_caption('Game of Life | Generations limit exceed')
  74. pygame.display.flip()
  75. clock.tick(self.speed)
  76. pygame.quit()
  77.  
  78.  
  79. if __name__ == '__main__':
  80. parser = argparse.ArgumentParser(description='Console Game of life')
  81. parser.add_argument('--width', type=int, default=640, help='Screen width, px')
  82. parser.add_argument('--height', type=int, default=480, help='Screen height, px')
  83. parser.add_argument('--cell-size', type=int, default=10, help='Cell size, px')
  84. parser.add_argument('--max-generations', type=int, default=float('inf'), help='Maximum generation count')
  85. args = parser.parse_args()
  86. game = GameOfLife((args.height // args.cell_size, args.width // args.cell_size), max_generations=args.max_generations)
  87. gui = GUI(game)
  88. gui.run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement