🧬 Π§Π°ΡΡ‚ΡŒ 48: Π˜ΡΠΊΡƒΡΡΡ‚Π²Π΅Π½Π½Π°Ρ Тизнь с ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠ΅ΠΉ (Conway’s Game of Life 3D)

ΠœΡ‹ создадим Ρ‚Ρ€Π΅Ρ…ΠΌΠ΅Ρ€Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ³Ρ€Ρ‹ «Π–ΠΈΠ·Π½ΡŒ» ΠšΠΎΠ½Π²Π΅Ρ, Π³Π΄Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ Π² 3D-пространствС!

3D Game of Life:

cpp

#define GRID_SIZE 8
#define CELL_COUNT (GRID_SIZE * GRID_SIZE * GRID_SIZE)

// Бостояния ΠΊΠ»Π΅Ρ‚ΠΎΠΊ (0=ΠΌΠ΅Ρ€Ρ‚Π²Π°, 1=ΠΆΠΈΠ²Π°, 2=дСлится)
uint8_t grid[GRID_SIZE][GRID_SIZE][GRID_SIZE];
uint8_t newGrid[GRID_SIZE][GRID_SIZE][GRID_SIZE];

// Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΊΠ»Π΅Ρ‚ΠΊΠΈ
uint8_t cellCycle[3] = {1, 2, 0};  // Π–ΠΈΠ²Π° -> ДСлится -> ΠœΠ΅Ρ€Ρ‚Π²Π°

// ΠŸΠΎΠ΄ΡΡ‡Π΅Ρ‚ сосСдСй Π² 3D (26 сосСдСй)
uint8_t countNeighbors3D(uint8_t x, uint8_t y, uint8_t z) {
    uint8_t count = 0;
    for (int8_t dx = -1; dx <= 1; dx++) {
        for (int8_t dy = -1; dy <= 1; dy++) {
            for (int8_t dz = -1; dz <= 1; dz++) {
                if (dx == 0 && dy == 0 && dz == 0) continue;
                uint8_t nx = (x + dx + GRID_SIZE) % GRID_SIZE;
                uint8_t ny = (y + dy + GRID_SIZE) % GRID_SIZE;
                uint8_t nz = (z + dz + GRID_SIZE) % GRID_SIZE;
                if (grid[nx][ny][nz] > 0) count++;
            }
        }
    }
    return count;
}

// Π­Π²ΠΎΠ»ΡŽΡ†ΠΈΡ (3D ΠΏΡ€Π°Π²ΠΈΠ»Π°)
void evolve3D() {
    memset(newGrid, 0, sizeof(newGrid));
    
    for (uint8_t x = 0; x < GRID_SIZE; x++) {
        for (uint8_t y = 0; y < GRID_SIZE; y++) {
            for (uint8_t z = 0; z < GRID_SIZE; z++) {
                uint8_t neighbors = countNeighbors3D(x, y, z);
                
                if (grid[x][y][z] > 0) {
                    // Живая ΠΊΠ»Π΅Ρ‚ΠΊΠ°
                    if (neighbors < 2 || neighbors > 6) {
                        // Π‘ΠΌΠ΅Ρ€Ρ‚ΡŒ
                        newGrid[x][y][z] = 0;
                    } else if (neighbors >= 4 && neighbors <= 5) {
                        // Π”Π΅Π»Π΅Π½ΠΈΠ΅
                        newGrid[x][y][z] = 2;
                    } else {
                        // ΠžΡΡ‚Π°Π΅Ρ‚ΡΡ ΠΆΠΈΠ²ΠΎΠΉ
                        newGrid[x][y][z] = 1;
                    }
                } else {
                    // ΠœΠ΅Ρ€Ρ‚Π²Π°Ρ ΠΊΠ»Π΅Ρ‚ΠΊΠ° - Ρ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅
                    if (neighbors == 3) {
                        newGrid[x][y][z] = 1;
                    }
                }
            }
        }
    }
    
    // ОбновляСм ΡΠ΅Ρ‚ΡŒ ΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Ρ‹
    memcpy(grid, newGrid, sizeof(grid));
    
    // Π‘Ρ‚Π°Ρ€Π΅Π½ΠΈΠ΅ ΠΊΠ»Π΅Ρ‚ΠΎΠΊ
    for (uint8_t x = 0; x < GRID_SIZE; x++) {
        for (uint8_t y = 0; y < GRID_SIZE; y++) {
            for (uint8_t z = 0; z < GRID_SIZE; z++) {
                if (grid[x][y][z] > 0) {
                    grid[x][y][z] = cellCycle[grid[x][y][z] % 3];
                }
            }
        }
    }
}

// Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ случайной ΠΆΠΈΠ·Π½ΠΈ
void initLife() {
    randomSeed(analogRead(A0));
    for (uint8_t x = 0; x < GRID_SIZE; x++) {
        for (uint8_t y = 0; y < GRID_SIZE; y++) {
            for (uint8_t z = 0; z < GRID_SIZE; z++) {
                grid[x][y][z] = (random(100) < 30) ? 1 : 0;
            }
        }
    }
}

// Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ 3D ΠΆΠΈΠ·Π½ΠΈ Π½Π° OLED (проСкция)
void renderLife3D() {
    clearScreen();
    
    // Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слоя Z ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ†ΠΈΡŽ
    for (uint8_t z = 0; z < GRID_SIZE; z++) {
        uint8_t offsetY = z * 2;
        for (uint8_t x = 0; x < GRID_SIZE; x++) {
            for (uint8_t y = 0; y < GRID_SIZE; y++) {
                if (grid[x][y][z] > 0) {
                    uint8_t screenX = x * 4 + z * 2;
                    uint8_t screenY = y * 4 + offsetY;
                    if (screenX < 64 && screenY < 64) {
                        drawPixel(screenX, screenY, 1);
                    }
                }
            }
        }
    }
    
    updateDisplay();
}

void setup() {
    initOLED();
    initLife();
}

void loop() {
    // Π­Π²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅ΠΌ 10 ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠΉ Π·Π° Ρ€Π°Π·
    for (uint8_t gen = 0; gen < 10; gen++) {
        evolve3D();
    }
    renderLife3D();
    delay(100);
}

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΡ‚ΡŒΡΡ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *