Адрес: ул. Б. Очаковская 32 Москва Россия
Наши официальные канал и чат в telegram, группа в ВКонтакте

Игра "Жизнь" Джона Конвея для yabasic

Ощутите историю знаменитого клеточного автомата «Жизнь», разработанного математиком Джоном Конвеем в 1970-е годы

Скачать бесплатные программы для Yabasic на Windows, Linux, MacOS, PlayStation 2
Аватара пользователя
Anton
Site Admin
Сообщения: 137
Зарегистрирован: Чт фев 08, 2024 7:03 pm
Откуда: Москва

Игра "Жизнь" Джона Конвея для yabasic

Сообщение Anton »

Игра "Жизнь" Джона Конвея для yabasic
Программа «Жизнь», созданная британским математиком Джоном Конвеем в 1970-х годах, представляет собой игру без участия игроков, где участник определяет исходное положение клеток, а затем следит за дальнейшим ходом процесса.

Игровое пространство — это двумерная поверхность, разбитая на ячейки, каждая из которых окружена восемью соседними ячейками и способна пребывать либо в активном («живом») состоянии, либо в неактивном («мертвом»). Развитие системы продолжается автоматически согласно заданным правилам, пока на игровом поле остаются активные элементы.

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

Код: Выделить всё

#!/usr/bin/yabasic
// Игра "Жизнь" Джона Конвея на Yabasic
// Авторы: John Horton Conway, адаптировано под Yabasic: Anton Shekhetov

open window 500, 500

// Создаем двумерный массив для представления состояния каждой клетки. Размерность массива зададим равной 50×50 клеток.
dim grid(50, 50) // Размерность массива зададим равной 50×50 клеток.

// Заполняем массив случайными значениями
for x = 1 to 50
    for y = 1 to 50
        grid(x, y) = int(ran(2))  // Получение строгих значений 0 или 1
    next y
next x


// Процедура для подсчета количества живых соседей
sub count_neighbors(x, y)
    neighbors = 0  // Переменная для хранения количества живых соседей
    for dx = -1 to 1  // По горизонтальной оси
        for dy = -1 to 1  // По вертикальной оси
            if dx = 0 AND dy = 0 THEN  // Пропускаем центральную клетку
                CONTINUE
            ENDIF
            
            // Рассчитываем координаты соседней клетки
            nx = x + dx
            ny = y + dy
            
            // Проверяем границы карты
            IF nx < 1 OR nx > 50 OR ny < 1 OR ny > 50 THEN
                CONTINUE
            ENDIF
            
            // Проверяем, является ли соседняя клетка живой
            IF grid(nx, ny) = 1 THEN
                neighbors = neighbors + 1  // Увеличили счётчик живых соседей
            ENDIF
        NEXT dy
    NEXT dx
    RETURN neighbors  // Возвращаем итоговое количество живых соседей
END SUB

// Процедура для обновления состояния клеток
sub update_grid()
    DIM temp_grid(50, 50)  // Временный массив для нового состояния клеток
    FOR x = 1 TO 50
        FOR y = 1 TO 50
            alive_neighbors = count_neighbors(x, y)
            IF grid(x, y) = 1 THEN  // Живая клетка
                IF alive_neighbors < 2 OR alive_neighbors > 3 THEN
                    temp_grid(x, y) = 0  // Умерла от одиночества или перенаселенности
                ELSE
                    temp_grid(x, y) = 1  // Продолжила жить
                ENDIF
            ELSE  // Мертвая клетка
                IF alive_neighbors = 3 THEN
                    temp_grid(x, y) = 1  // Возникновение новой жизни
                ELSE
                    temp_grid(x, y) = 0  // Осталась мертвой
                ENDIF
            ENDIF
        NEXT y
    NEXT x
    // Копируем новое состояние обратно в основной массив
    FOR x = 1 TO 50
        FOR y = 1 TO 50
            grid(x, y) = temp_grid(x, y)
        NEXT y
    NEXT x
END SUB

// Процедура для отображения текущего состояния сетки
sub render()
    clear window
    backcolor("255,255,255")
    for x = 1 to 50
        for y = 1 to 50
            if grid(x, y) = 1 then
				cb = 255-alive_neighbors*20  
				color("0,255,0")
                fill rectangle (x-1)*10, (y-1)*10, x*10, y*10
            endif
        next y
    next x
end sub

// Основной цикл игры
WHILE TRUE
    update_grid()      // Обновляем состояние клеток
    render()           // Перерисовываем сетку
    PAUSE(0.1)         // Пауза для плавности анимации
WEND
Пример работы программы:
live.gif
У вас нет необходимых прав для просмотра вложений в этом сообщении.