Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <OLED_I2C.h>
- #define WIDTH 64 // 64 по умолчанию
- #define HEIGHT 22 // 22 по умолчанию
- #define CELL_STACK_SIZE (int)ceil( (WIDTH*HEIGHT)/8 ) // Количество байт для хранения всех рисуемых ячеек
- #define DOWN_SHIFT 19 // Сдвиг вниз первой ячейки на пиксели
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- OLED myOLED(A4, A5, A4);
- byte cell_stack[CELL_STACK_SIZE]; // Состояние стака из 8 ячеек (вкл/выкл)
- byte cell_point[WIDTH*HEIGHT] = {0}; // Количество очков у каждой ячейки
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- bool bit_check(int i) { // Проверка указанного бита в массиве ячеек
- return cell_stack[ (int)floor(i / 8) ] & 128 >> (i % 8) ;
- }
- void setup() {
- myOLED.begin();
- for (int i = 0; i < CELL_STACK_SIZE; i++) { // Инициализация состояний для каждой ячейки
- cell_stack[i] = random(0, 256); // Случайные состояния
- }
- }
- void loop() {
- myOLED.clrScr();
- for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
- if ( bit_check(i) ) {
- // Отрисовка ячейки
- myOLED.drawRect( 2*(i % WIDTH), 2*(int)floor(i / WIDTH) + DOWN_SHIFT, 2*(i % WIDTH) + 1, 2*(int)floor(i / WIDTH) + DOWN_SHIFT + 1 );
- }
- cell_point[i] = 0; // Обнуление поинтов каждой ячейки в начале каждого шага
- if ( (int)floor(i/WIDTH) != HEIGHT - 1 && bit_check(i+WIDTH) ) {
- cell_point[i]++ ;
- }
- if ( (int)floor(i/WIDTH) != 0 && bit_check(i-WIDTH) ) {
- cell_point[i]++ ;
- }
- if ( i % WIDTH != WIDTH - 1 && bit_check(i+1) ) {
- cell_point[i]++ ;
- }
- if ( i % WIDTH != 0 && bit_check(i-1) ) {
- cell_point[i]++ ;
- }
- }
- for (int i = 0; i < CELL_STACK_SIZE*8; i++) { // Правило рождения
- if (cell_point[i] == 3) {
- cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] | (i % 8);
- }
- if ( (cell_point[i] == 4) && (cell_point[i] == 0) ) { // Правило смерти
- cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] ^ (i % 8);
- }
- }
- myOLED.update();
- delay(100);
- }
Advertisement
Add Comment
Please, Sign In to add comment