Написать игру "Жизнь" Джона Конвея с графическим интерфейсом.

Игра "Жизнь" Джона Конвея с графическим интерфейсом

Задача: Разработать игру "Жизнь" Джона Конвея, используя Python и библиотеку tkinter для создания графического интерфейса.

import tkinter as tk

class GameOfLife:
    def __init__(self, master, rows=20, cols=20, cell_size=20):
        self.master = master
        self.rows = rows
        self.cols = cols
        self.cell_size = cell_size
        self.cells = {}
        self.timer = None
        self.running = False
        self.grid = [[0]*cols for _ in range(rows)]
        self.init_grid()

    def init_grid(self):
        for i in range(self.rows):
            for j in range(self.cols):
                cell_frame = tk.Frame(
                    self.master, 
                    width=self.cell_size, 
                    height=self.cell_size, 
                    highlightbackground="gray", 
                    highlightthickness=1
                )
                cell_frame.grid(row=i, column=j)
                cell_frame.bind("", self.toggle_cell)
 self.cells[(i, j)] = cell_frame

    def toggle_cell(self, event):
        cell = event.widget
        row, col = cell.grid_info()['row'], cell.grid_info()['column']
        if self.grid[row][col] == 0:
            self.grid[row][col] = 1
            cell.config(bg="black")
        else:
            self.grid[row][col] = 0
            cell.config(bg="white")

    def run(self):
        self.running = True
        self.next_generation()

    def stop(self):
        self.running = False
        if self.timer:
            self.master.after_cancel(self.timer)
            self.timer = None

    def next_generation(self):
        new_grid = [[0]*self.cols for _ in range(self.rows)]
        for i in range(self.rows):
            for j in range(self.cols):
                new_grid[i][j] = self.calculate_new_state(i, j)
                color = "black" if new_grid[i][j] == 1 else "white"
                self.cells[(i, j)].config(bg=color)
        self.grid = new_grid
        if self.running:
            self.timer = self.master.after(100, self.next_generation)

    def calculate_new_state(self, row, col):
        directions = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
        live_neighbors = 0
        for dr, dc in directions:
            r, c = row + dr, col + dc
            if 0 <= r < self.rows and 0 <= c < self.cols and self.grid[r][c] == 1:
                live_neighbors += 1
        if self.grid[row][col] == 1 and live_neighbors in (2, 3):
            return 1
        elif self.grid[row][col] == 0 and live_neighbors == 3:
            return 1
        else:
            return 0

root = tk.Tk()
app = GameOfLife(root)
app.run()
root.mainloop()

Результат выполнения кода

Игра "Жизнь" реализована с графическим интерфейсом, где пользователи могут кликать по клеткам для изменения их состояния и наблюдать за эволюцией системы. Игра продолжает выполняться, переходя от одного поколения клеток к другому согласно правилам игры "Жизнь".

Пользователь может начать или остановить процесс эволюции, используя соответствующие кнопки управления, которые можно добавить для улучшения интерактивности приложения.    

Категория: Практические упражнения Python | Добавил: Admin (04.05.2024)
Просмотров: 87 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *: