Canfly Avrora
8 мая 2025, 05:06

Игра Жизнь в ASCII

Создано с помощью Canfly Avrora
8 мая 2025

python import time import os import random

def create_board(rows, cols): """Создает пустую доску для игры.""" return [[' ' for _ in range(cols)] for _ in range(rows)]

def print_board(board): """Выводит доску в консоль.""" # Добавляем рамку для лучшей визуализации border = '+' + '-' * len(board[0]) + '+' print(border) for row in board: print('|' + ''.join(row) + '|') print(border)

def get_neighbors(board, row, col): """Возвращает количество живых соседей для клетки.""" rows = len(board) cols = len(board[0]) live_neighbors = 0

# Проверяем всех 8 соседей с учетом тороидальной топологии
for i in range(-1, 2):
    for j in range(-1, 2):
        if i == 0 and j == 0:
            continue  # Пропускаем саму клетку
        # Используем модульную арифметику для создания тороидальной сетки
        neighbor_row = (row + i) % rows
        neighbor_col = (col + j) % cols
        if board[neighbor_row][neighbor_col] == '*':
            live_neighbors += 1
            
return live_neighbors

def next_generation(board): """Вычисляет следующее поколение доски.""" rows = len(board) cols = len(board[0]) new_board = create_board(rows, cols)

for r in range(rows):
    for c in range(cols):
        neighbors = get_neighbors(board, r, c)
        if board[r][c] == '*':  # Живая клетка
            if neighbors < 2 or neighbors > 3:
                new_board[r][c] = ' '  # Умирает от одиночества или перенаселения
            else:
                new_board[r][c] = '*'  # Выживает
        else:  # Мертвая клетка
            if neighbors == 3:
                new_board[r][c] = '*'  # Оживает

return new_board

def generate_random_state(rows, cols, density=0.3): """Генерирует случайное начальное состояние с заданной плотностью живых клеток.""" state = [] for r in range(rows): for c in range(cols): if random.random() < density: state.append((r, c)) return state

def run_game(rows, cols, generations, initial_state=None, delay=0.2): """Запускает игру.""" board = create_board(rows, cols)

# Если начальное состояние не задано, генерируем случайное
if initial_state is None:
    initial_state = generate_random_state(rows, cols)

# Заполняем начальное состояние
for r, c in initial_state:
    if 0 <= r < rows and 0 <= c < cols:  # Проверка границ
        board[r][c] = '*'

generation = 0
try:
    while generation < generations:
        os.system('cls' if os.name == 'nt' else 'clear')  # Очищаем консоль
        print(f"Поколение: {generation + 1}")
        print_board(board)
        
        # Проверка на стабильное состояние или пустую доску
        new_board = next_generation(board)
        if new_board == board:
            print("Стабильное состояние достигнуто!")
            break
            
        # Проверка на пустую доску
        if all(cell == ' ' for row in new_board for cell in row):
            print("Все клетки умерли!")
            break
            
        board = new_board
        generation += 1
        time.sleep(delay)  # Задержка между поколениями
except KeyboardInterrupt:
    print("\nИгра остановлена пользователем.")

def main(): """Основная функция для запуска игры с пользовательскими настройками.""" print("Игра 'Жизнь' Конвея") print("-------------------")

# Предустановленные фигуры
patterns = {
    "глайдер": [(1, 2), (2, 3), (3, 1), (3, 2), (3, 3)],
    "блок": [(1, 1), (1, 2), (2, 1), (2, 2)],
    "мигалка": [(1, 0), (1, 1), (1, 2)],
    "планер": [(0, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
}

# Настройки по умолчанию
rows = 20
cols = 40
generations = 100
delay = 0.2

# Выбор начального состояния
print("\nВыберите начальное состояние:")
print("1. Случайное")
for i, pattern_name in enumerate(patterns.keys(), 2):
    print(f"{i}. {pattern_name}")

choice = input("Ваш выбор (по умолчанию: 1): ").strip() or "1"

if choice == "1":
    initial_state = None  # Будет сгенерировано случайно
else:
    try:
        pattern_name = list(patterns.keys())[int(choice) - 2]
        initial_state = patterns[pattern_name]
        print(f"Выбрана фигура: {pattern_name}")
    except (ValueError, IndexError):
        print("Неверный выбор. Используется случайное состояние.")
        initial_state = None

# Запускаем игру
run_game(rows, cols, generations, initial_state, delay)

if name == "main": main()

Игра Жизнь в ASCII | Canfly Avrora