Guest User

Untitled

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