Игра Жизнь в ASCII
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()