Guest User

Untitled

a guest
Jun 19th, 2024
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.50 KB | None | 0 0
  1. #include <OLED_I2C.h>
  2.  
  3. #define WIDTH 64 // 64 по умолчанию
  4. #define HEIGHT 22 // 22 по умолчанию
  5.  
  6. #define CELL_STACK_SIZE (int)ceil( (WIDTH*HEIGHT)/8 ) // Количество байт для хранения всех рисуемых ячеек
  7.  
  8. #define DOWN_SHIFT 19 // Сдвиг вниз первой ячейки на пиксели
  9.  
  10. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11.  
  12. OLED myOLED(A4, A5, A4);
  13.  
  14. byte cell_stack[CELL_STACK_SIZE]; // Состояние стака из 8 ячеек (вкл/выкл)
  15. byte cell_point[WIDTH*HEIGHT] = {0}; // Количество очков у каждой ячейки
  16.  
  17. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18.  
  19. bool bit_check(int i) { // Проверка указанного бита в массиве ячеек
  20. return cell_stack[ (int)floor(i / 8) ] & 128 >> (i % 8) ;
  21. }
  22.  
  23. void setup() {
  24.  
  25. myOLED.begin();
  26.  
  27. for (int i = 0; i < CELL_STACK_SIZE; i++) { // Инициализация состояний для каждой ячейки
  28.  
  29. cell_stack[i] = random(0, 256); // Случайные состояния
  30.  
  31. }
  32. }
  33.  
  34. void loop() {
  35.  
  36. myOLED.clrScr();
  37.  
  38. for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
  39.  
  40. if ( bit_check(i) ) {
  41. // Отрисовка ячейки
  42. myOLED.drawRect( 2*(i % WIDTH), 2*(int)floor(i / WIDTH) + DOWN_SHIFT, 2*(i % WIDTH) + 1, 2*(int)floor(i / WIDTH) + DOWN_SHIFT + 1 );
  43.  
  44. }
  45.  
  46. cell_point[i] = 0; // Обнуление поинтов каждой ячейки в начале каждого шага
  47.  
  48. if ( (int)floor(i/WIDTH) != HEIGHT - 1 && bit_check(i+WIDTH) ) {
  49. cell_point[i]++ ;
  50. }
  51. if ( (int)floor(i/WIDTH) != 0 && bit_check(i-WIDTH) ) {
  52. cell_point[i]++ ;
  53. }
  54. if ( i % WIDTH != WIDTH - 1 && bit_check(i+1) ) {
  55. cell_point[i]++ ;
  56. }
  57. if ( i % WIDTH != 0 && bit_check(i-1) ) {
  58. cell_point[i]++ ;
  59. }
  60.  
  61. }
  62.  
  63. for (int i = 0; i < CELL_STACK_SIZE*8; i++) { // Правило рождения
  64. if (cell_point[i] == 3) {
  65. cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] | (i % 8);
  66. }
  67. if ( (cell_point[i] == 4) && (cell_point[i] == 0) ) { // Правило смерти
  68. cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] ^ (i % 8);
  69. }
  70. }
  71.  
  72. myOLED.update();
  73. delay(100);
  74.  
  75. }
Advertisement
Add Comment
Please, Sign In to add comment