Timkor

newYearFirWithRunningLights

Jan 30th, 2021 (edited)
409
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // i t
  2.  
  3.  
  4. // програма виводить ялинку c гірляндою.
  5. // запускати в https://js.ide.shpp.me/
  6.  
  7.  
  8. let height = 42; // глобальна змінна це погано  // висота без ніжки - бажано не менше 20
  9.  
  10. // основна функція не декомпозована, щоб зберегти структуру учбової програми, що виводить ялинку
  11. async function createFirAndSnow() {
  12.     let phrase = 'Стати гарним програмістом у 2021 році'; // будь-яке побажання на цей рік
  13.     phrase = phrase.replace(/ /g, '*');
  14.     let year = 2021;             // рік)
  15.     let templatePhraseWords = ('шанс початок zero можливості шанс Ш++ посмішка котики Java праця' +
  16.         'школа Ш++ результат участь Shpp повага люди код любов p2p культура JavaScript добро').replace(/ /g, '*').split('*');
  17.  
  18.     let phraseWords = phrase.split('*');
  19.     let textConsole = document.querySelector(".main");
  20.     let j = 0;
  21.  
  22.     while (j++ <= year) {          // цикл виводить ялинку 2021 раз, але кожний раз трохи змінену
  23.         let pictureContent = '';   // рядок з кадром малюнка
  24.         let spaceNum = height - 1; // пробілів до верхівки - пів нижньої (ширшої) гілки, а вона дорівнює (висота * 2 - 1)
  25.                                    // з кожним рядком буде зменшуватися -= 1
  26.         let starNum = 1;           // кількість зірок на верхівці, з кожним рядком буде збільшуватися += 2
  27.         let row = 0;
  28.         let i = 0;                 // просто лічильник
  29.         let letterIndex = 0;       // індекс літери
  30.         while (row < height) {     // перебираємо рядки від 0 до висоти ялинки
  31.  
  32.             // виводимо сніжинки зліва
  33.             i = 0;
  34.             while (i < spaceNum) {
  35.                 pictureContent += addAttrToContent((Math.random() > 0.9 && (year > j)) ?
  36.                     phrase[i % phrase.length] : ('&nbsp&nbsp'), '#0CDBC3', i, spaceNum);
  37.                 i++;
  38.             }
  39.  
  40.             // виводимо ялинку
  41.             i = 0;
  42.             while (i < starNum) {
  43.                 if (phrase[(letterIndex + 1)] === ' ') {
  44.                     //alert('space detected');
  45.                 }
  46.                 pictureContent += addAttrToContent(phrase[(letterIndex++) % (phrase.length)], '#0D8314', i, starNum, row);
  47.                 i++;
  48.             }
  49.            
  50.             // виводимо сніжинки зправа ялинки, з пробілами це не обов'язково
  51.             i = 0;
  52.             while (i < spaceNum) {
  53.                 pictureContent += addAttrToContent((Math.random() > 0.9 && (year > j)) ?
  54.                     phrase[i % phrase.length] : ('&nbsp&nbsp'), '#0CDBC3', i, spaceNum);
  55.                 i++;
  56.             }
  57.             pictureContent += '<br>'; // переводимо рядок, зазвичай console.log();
  58.  
  59.             spaceNum -= 1; // готуємо кількість пробілів у наступному рядку
  60.             starNum += 2; // готуємо кількість ялинкових символів у наступному рядку
  61.             row++;
  62.         }
  63.  
  64.         let footerSpace = ''; // ніжка
  65.         for (let i = 0; i < height * 1.3; i++) {
  66.             footerSpace += addAttrToContent('&nbsp', '#0CDBC3',i, height + 2);
  67.         }
  68.         for (let i = 1; i < 10; i++) {
  69.             pictureContent += footerSpace;
  70.             if (i % 3 === 0) {
  71.                 pictureContent += '<br>';
  72.             }
  73.         }
  74.        
  75.         textConsole.innerHTML = pictureContent;
  76.         await sleep(60); // швидкість кадрів в мс
  77.         phrase = phrase[phrase.length - 1] + phrase.substring(0, phrase.length - Math.random() * 2.2021 - 1);
  78.  
  79.         if (phrase.length < Math.random() * 0.2021 + 1 || year === j + 1) {
  80.  
  81.             phrase += ' ' + shuffleArray(phraseWords.concat(phraseWords, templatePhraseWords)).join('*');
  82.         }
  83.     }
  84. }
  85.  
  86.  
  87. // затримка
  88. function sleep(ms) {
  89.     return new Promise(resolve => setTimeout(resolve, ms));
  90. }
  91.  
  92. // перемішує елементи масиву в рандомному порядку
  93. function shuffleArray(array) {
  94.     for (let i = array.length - 1; i > 0; i--) {
  95.         let j = Math.floor(Math.random() * (i + 1));
  96.         [array[i], array[j]] = [array[j], array[i]];
  97.     }
  98.     return array;
  99. }
  100. // додаємо атрибути до кожного елементу що виводиться
  101. function addAttrToContent(content, color, index, width, row = 1) {
  102.     let fontSize;
  103.     if (row !== 1 && (row + index) % 21 === 0) {
  104.     // if (row === 0 ) { // for topStar only
  105.         fontSize = 21;
  106.         content = '*'
  107.         index = Math.floor(Math.random()*100);
  108.     } else {
  109.         fontSize = (height - Math.abs(width / 2 - index)) * width / 200 + 2;
  110.     }
  111.    
  112.     let borderRadius = '25%';
  113.     let textColor = '#FFFFFF';
  114.     let colors = ['#D43807', '#0759D4', '#7F07D4', '#69F507', '#69F507', '#DBC40C'];
  115.     //let colors = ['#69F507'];
  116.     if (content === '*') {
  117.         color = colors[Math.floor(index  % colors.length)];
  118.         textColor = color;
  119.         borderRadius = '50%'
  120.     }
  121.     content = `<span style="font-size:${fontSize}px;
  122.                    border-radius:${borderRadius};
  123.                    background-color:${color};
  124.                    color: ${textColor}">
  125.                     ${content}
  126.                </span>`;
  127.  
  128.     return content;
  129. }
  130.  
  131. createFirAndSnow();
  132.  
  133. // не перейменовув змінні відповідаючи за пробіли та зірки .
  134. // Гарного коду.)
  135.  
Add Comment
Please, Sign In to add comment