Advertisement
Timkor

NewYearFir

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