Guest User

Untitled

a guest
Jun 29th, 2024
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.70 KB | None | 0 0
  1. #include <OLED_I2C.h>
  2.  
  3. #define WIDTH 24 // 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. #define RANDOM_START true // Рандмоные биты в начале
  11.  
  12. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  13.  
  14. OLED myOLED(A4, A5, A4);
  15.  
  16. byte cell_stack[CELL_STACK_SIZE] = {0}; // Состояние стака из 8 ячеек (вкл/выкл)
  17. byte cell_point[WIDTH*HEIGHT] = {0}; // Количество очков у каждой ячейки
  18.  
  19. byte cell_area = 0; // доступность четырёх внешних ячеек
  20. #define RIGHT_CELL_EXIST 0b00000001
  21. #define UP_CELL_EXIST 0b00000010
  22. #define LEFT_CELL_EXIST 0b00000100
  23. #define DOWN_CELL_EXIST 0b00001000
  24.  
  25. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26.  
  27. byte bit_check(int i) { // Проверка указанного бита по номеру
  28. return cell_stack[ (int)floor(i / 8) ] & 128 >> (i % 8) ;
  29. }
  30.  
  31. void bit_on(int i) { // Поменять бит на 1 по номеру
  32. cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] | ( 128 >> (i % 8) );
  33. }
  34.  
  35. void bit_off(int i) { // Поенять бит на 0 по номеру
  36. cell_stack[ (int)floor(i / 8) ] = cell_stack[ (int)floor(i / 8) ] ^ ( 128 >> (i % 8) );
  37. }
  38.  
  39. void bit_on_cr(int x, int y) { // Поменять бит на 1 по координатам
  40. int i = x + (WIDTH*y);
  41. bit_on(i);
  42. }
  43.  
  44. void bit_off_cr(int x, int y) { // Поменять бит на 0 по координатам
  45. int i = x + (WIDTH*y);
  46. bit_off(i);
  47. }
  48.  
  49. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50.  
  51. void setup() {
  52.  
  53. myOLED.begin();
  54. if (RANDOM_START) {
  55. for (int i = 0; i < CELL_STACK_SIZE; i++) {
  56. cell_stack[i] = random(0,256);
  57. }
  58. }
  59. else {
  60. bit_on_cr(2,2);
  61. bit_on_cr(2,3);
  62. bit_on_cr(2,1);
  63. }
  64.  
  65. }
  66.  
  67. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68.  
  69. void loop() {
  70.  
  71. myOLED.clrScr();
  72.  
  73. for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
  74.  
  75. if ( bit_check(i) ) {
  76. myOLED.drawRect( (i % WIDTH)*2, ( 2*(int)floor(i/WIDTH) ) + DOWN_SHIFT,
  77. ( (i % WIDTH)*2) + 1, ( 2*(int)floor(i/WIDTH) ) + 1 + DOWN_SHIFT );
  78. }
  79.  
  80. cell_point[i] = 0; // Обнуление поинтов каждой ячейки в начале каждого шага
  81. cell_area = 0;
  82.  
  83. ///////////////////////////// Поиск существующих ячеек
  84.  
  85. if ( (int)floor(i/WIDTH) != HEIGHT - 1) {
  86. cell_area = cell_area | DOWN_CELL_EXIST;
  87. }
  88. if ( (int)floor(i/WIDTH) != 0) {
  89. cell_area = cell_area | UP_CELL_EXIST;
  90. }
  91. if ( i % WIDTH != WIDTH - 1) {
  92. cell_area = cell_area | RIGHT_CELL_EXIST;
  93. }
  94. if ( i % WIDTH != 0) {
  95. cell_area = cell_area | LEFT_CELL_EXIST;
  96. }
  97.  
  98. ////////////////////////////// Поиск живых ячеек
  99.  
  100. if (cell_area & DOWN_CELL_EXIST) {
  101. if ( bit_check(i+WIDTH) ) {
  102. cell_point[i]++;
  103. }
  104.  
  105. if (cell_area & LEFT_CELL_EXIST) {
  106. if ( bit_check(i+WIDTH-1) ) {
  107. cell_point[i]++;
  108. }
  109. }
  110. if (cell_area & RIGHT_CELL_EXIST) {
  111. if ( bit_check(i+WIDTH+1) ) {
  112. cell_point[i]++;
  113. }
  114. }
  115.  
  116. }
  117.  
  118. if (cell_area & UP_CELL_EXIST) {
  119. if ( bit_check(i-WIDTH) ) {
  120. cell_point[i]++;
  121. }
  122.  
  123. if (cell_area & LEFT_CELL_EXIST) {
  124. if ( bit_check(i-WIDTH-1) ) {
  125. cell_point[i]++;
  126. }
  127. }
  128. if (cell_area & RIGHT_CELL_EXIST) {
  129. if ( bit_check(i+WIDTH+1) ) {
  130. cell_point[i]++;
  131. }
  132. }
  133.  
  134. }
  135.  
  136.  
  137. if (cell_area & LEFT_CELL_EXIST) {
  138. if ( bit_check(i-1) ) {
  139. cell_point[i]++;
  140. }
  141. }
  142. if (cell_area & RIGHT_CELL_EXIST) {
  143. if ( bit_check(i+1) ) {
  144. cell_point[i]++;
  145. }
  146. }
  147.  
  148.  
  149. } // Конец цикла
  150.  
  151. for (int i = 0; i < CELL_STACK_SIZE*8; i++) {
  152. if (!bit_check(i) && cell_point[i] == 3) { // Правило рождения
  153. bit_on(i);
  154. }
  155. else if ( bit_check(i) && (cell_point[i] != 2 && cell_point[i] != 3) ) { // Правило смерти
  156. bit_off(i);
  157. }
  158. }
  159.  
  160.  
  161. myOLED.update();
  162. delay(1000);
  163.  
  164. }
Advertisement
Add Comment
Please, Sign In to add comment