Browse Source

HW_09 (conditions) + Whac-A-Mole done

Graf15 2 years ago
parent
commit
48929f6eec

BIN
js/Whac-A-Mole/aim.png


BIN
js/Whac-A-Mole/bam.mp3


BIN
js/Whac-A-Mole/game.zip


+ 187 - 0
js/Whac-A-Mole/index.html

@@ -0,0 +1,187 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Document</title>
+    <link rel="stylesheet" href="style.css">
+    <script src="index.js"></script>
+    <script>
+
+
+    </script>
+</head>
+
+<body>
+    <div class="header">Score:<span id="score">0</span></div>
+    <div id="buttonStart"><img src="round_button.png">Гасить русню!</div>
+    <div class="playing_field" id = "playingField">
+        <div class="rectangle">
+            <div class="beaverHome">
+                <div class="beaver" id="beaver1"></div>
+            </div>
+        </div>
+        <div class="rectangle">
+            <div class="beaverHome" >
+                <div class="beaver" id="beaver2"></div>
+            </div>
+        </div>
+        <div class="rectangle">
+            <div class="beaverHome">
+                <div class="beaver"  id="beaver3"></div>
+            </div>
+        </div>
+        <div class="rectangle">
+            <div class="beaverHome">
+                <div class="beaver" id="beaver4"></div>
+            </div>
+        </div>
+        <div class="rectangle">
+            <div class="beaverHome">
+                <div class="beaver" id="beaver5"></div>
+            </div>
+        </div>
+    </div>
+    <div class="cursor"></div>
+</body>
+<script>
+
+    let scoreValue = 0
+    let TimeVision = 3000
+
+    const cursor = document.querySelector('.cursor')
+
+    
+
+    beaver1.onclick = () => {
+        beaver1.style.pointerEvents = "none"
+        scoreValue += 10;
+        score.innerText = scoreValue;
+        beaver1.style.backgroundColor = "red"
+        beaver1.style.transform = 'translate(-50% , -50%) rotateX(90deg)'
+        cry()
+    }
+    beaver2.onclick = () => {
+        beaver2.style.pointerEvents = "none"
+        scoreValue += 10;
+        score.innerText = scoreValue
+        beaver2.style.backgroundColor = "red"
+        beaver2.style.transform = 'translate(-50% , -50%) rotateX(90deg)'
+        cry()
+    }
+    beaver3.onclick = () => {
+        beaver3.style.pointerEvents = "none"
+        scoreValue += 10;
+        score.innerText = scoreValue
+        beaver3.style.backgroundColor = "red"
+        beaver3.style.transform = 'translate(-50% , -50%) rotateX(90deg)'
+        cry()
+    }
+    beaver4.onclick = () => {
+        beaver4.style.pointerEvents = "none"
+        scoreValue += 10;
+        score.innerText = scoreValue
+        beaver4.style.backgroundColor = "red"
+        beaver4.style.transform = 'translate(-50% , -50%) rotateX(90deg)'
+        cry()
+    }
+    beaver5.addEventListener('click', () => {
+        beaver5.style.pointerEvents = "none"
+        scoreValue += 10;
+        score.innerText = scoreValue
+        beaver5.style.backgroundColor = "red"
+        beaver5.style.transform = 'translate(-50% , -50%) rotateX(90deg)'
+        cry()
+    })
+
+    const playAudio = () =>{
+      let myAudio = new Audio;
+      myAudio.src = "bam.mp3";
+      myAudio.play();
+
+      cursor.style.transition = ".05s"
+      cursor.style.width = "150px"
+      cursor.style.height = "150px"
+      setTimeout(() => {
+        cursor.style.transition = ""
+        cursor.style.width = "100px"
+        cursor.style.height = "100px"
+      },200)
+   }
+
+   const cry = () =>{
+      let audioCry = new Audio;
+      audioCry.src = "mujskoy-krik-korotkiy.mp3";
+      audioCry.play();
+   }
+
+   window.addEventListener('click', playAudio)
+   
+
+    let beaverDefaultFunction = () => {
+        const arrbeaver = document.querySelectorAll('.beaver')
+        for (let elemBeaver of arrbeaver) {
+            elemBeaver.style.backgroundColor = "";
+            elemBeaver.style.top = "-50%";
+            elemBeaver.style.pointerEvents = "auto"
+            elemBeaver.style.transform = "translate(-50% , -50%)"
+        }
+    }
+
+    let beaverUpFunction = () => {
+
+
+
+        if (TimeVision > 2000) {
+        if (Math.random() > 0.5) beaver1.style.top = "50%"
+        if (Math.random() > 0.5) beaver2.style.top = "50%"
+        if (Math.random() > 0.5) beaver3.style.top = "50%"
+        if (Math.random() > 0.5) beaver4.style.top = "50%"
+        if (Math.random() > 0.5) beaver5.style.top = "50%"
+        setTimeout(beaverDefaultFunction,TimeVision)
+        TimeVision += -200;
+        } else {
+            clearInterval(interval)
+            playingField.style.visibility = 'hidden'
+            setTimeout( () => {
+                buttonStart.style.display = 'flex'
+                TimeVision = 3000
+            }, 500)            
+            setTimeout( () => {
+                buttonStart.style.opacity = '1'
+                buttonStart.style.boxShadow = '0 4px 22px rgba(0,0,0, 0.25), inset 0 3px 0 rgba(255,255,255, 0.2), 0 3px 0 rgba(0,0,0, 0.1), inset 0 0 22px rgba(0,0,0, 0.1)'
+
+            }, 500)
+        
+        }
+    }
+
+    let interval
+
+
+
+    window.addEventListener('mousemove', e => {
+        cursor.style.top = e.pageY + 'px'
+        cursor.style.left = e.pageX + 'px'
+    })
+
+    buttonStart.addEventListener('click', () => {
+        buttonStart.style.boxShadow = 'inset 0 0 22px rgba(0,0,0,0.2), 0 3px 0 rgba(255,255,255,0.4),inset 0 3px 0 rgba(0,0,0,0.1), inset 0 0 22px rgba(0,0,0,0.1)'
+
+        setTimeout( () => {
+            buttonStart.style.opacity = '0'
+            playingField.style.visibility = 'visible'
+        }, 500)
+        setTimeout( () => {
+            buttonStart.style.display = 'none'
+        }, 500)
+
+        setTimeout( () => 0 , 500)
+        interval = setInterval(beaverUpFunction, 5000)
+    })
+
+</script>
+
+</html>

+ 0 - 0
js/Whac-A-Mole/index.js


BIN
js/Whac-A-Mole/mujskoy-krik-korotkiy.mp3


BIN
js/Whac-A-Mole/putin.png


BIN
js/Whac-A-Mole/round_button.png


+ 129 - 0
js/Whac-A-Mole/style.css

@@ -0,0 +1,129 @@
+*,
+*:before,
+*:after {
+  box-sizing: border-box;
+}
+
+
+body {
+    margin: 0;
+    background-color: darkgreen;
+    overflow: hidden;
+    position: relative;
+    cursor: none;
+    position: relative;
+  }
+
+.header {
+    height: 10vh;
+    display: flex;
+    justify-content: end;
+    justify-items: center;
+    color:white;
+    padding: 20px 30px;
+    font-size: 30px;
+    font-weight: bolder;
+    user-select: none;
+}
+
+#score {
+    color:red;
+    padding: 0 20px;
+    user-select: none;
+}
+
+.playing_field {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    flex-wrap: wrap;
+    height: calc(90vh);
+    visibility: hidden;
+}
+
+.rectangle {
+    width: calc((100% / 3) - 20px);
+    margin: 10px;
+    height: calc(90vh / 2 - 20px);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    visibility: inherit;
+}
+
+.beaverHome {
+    width: 50%;
+    aspect-ratio: 1;
+    background-color: orange;
+    border-radius: 50%;
+    position: relative;
+    overflow: hidden;
+    visibility: inherit;
+}
+
+.beaver {
+    width: 100%;
+    height: 100%;
+    /*background-color: brown;*/
+    background-image: url(putin.png);
+    background-position: center;
+    background-size: cover;
+    background-repeat: no-repeat;
+    position: absolute;
+    top: -50%;
+    left: 50%;
+    transform: translate(-50% , -50%);
+    transition: 0.5s;
+    visibility: inherit;
+}
+
+
+.cursor {
+    width: 100px;
+    height: 100px;
+    position: absolute;
+    background-image: url('aim.png');
+    background-size: cover;
+    top: 0px;
+    left: 0px;
+    transform: translate(-50% , -50%);
+    pointer-events: none;
+}
+
+#buttonStart{
+    max-width: 200px;
+    height: 100px;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    transition: 0.2s;
+    background-color: #006400;
+    display: flex;
+    align-items: center;
+    text-align: center;
+    padding: 10px;
+    border-radius: 10px;
+    color: white;
+    font-size: 30px;
+    font-weight:500;
+    letter-spacing: 2px;
+    user-select: none;
+    font-family: Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif;
+    box-shadow: 0 4px 22px rgba(0,0,0, 0.25), inset 0 3px 0 rgba(255,255,255, 0.2), 0 3px 0 rgba(0,0,0, 0.1), inset 0 0 22px rgba(0,0,0, 0.1);
+}
+
+#buttonStart img {
+    width: 30%;
+    margin-right: 10px;
+}
+
+
+
+
+
+
+
+
+
+

+ 63 - 0
js/js_09_conditions/index.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="stylesheet" href="style.css">
+    <title>Document</title>
+</head>
+<body>
+    <script>
+/*countries and cities
+fetch('https://raw.githubusercontent.com/russ666/all-countries-and-cities-json/master/countries.min.json').then(res => res.json())
+     .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+        })
+По аналогии с предыдущем заданием, реализуйте интерфейс выбора страны и города:
+по закрузке данных наполняйте select#countries элементами option с названиями стран;
+так же назначьте обработчик события onchange в select#countries, который:
+удаляет старый контент select#cities (достаточно занести в innerHTML или innerText пустую строку)
+добавляет в select#cities элементы option с городами из выбранной только что страны.
+Таким образом, при изменении страны будет меняться список городов в select#cities*/
+
+{
+    fetch('https://raw.githubusercontent.com/russ666/all-countries-and-cities-json/master/countries.min.json').then(res => res.json())
+     .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+
+            const countries = document.createElement('select')
+            const cities = document.createElement('select')
+
+            for (country in data){
+                const optionCounty = document.createElement('option')
+                optionCounty.innerText = optionCounty.value = country
+                countries.append(optionCounty)                
+            }
+
+            countries.onchange = () => {
+                cities.innerText = ''
+                for (city of data[countries.value]){
+                    const optionCity = document.createElement('option')
+                    optionCity.innerText = optionCity.value = city
+                    cities.append(optionCity)
+
+                }
+            }
+
+            document.body.append(countries)
+            document.body.append(cities)
+
+        })
+
+}
+
+    </script>
+</body>
+</html>

+ 344 - 0
js/js_09_conditions/index.js

@@ -0,0 +1,344 @@
+// blocks
+{
+    let a = 10
+    {
+        let b = 20
+        {
+            let c = 30
+            //a === 10, b === 20, c === 30
+            
+            b++
+            a *= 10
+        }
+        {
+            let c = 50
+            //a === 100, b === 21, c === 50
+            b += 500
+        }
+        {
+            const a = 100500
+            const d = "value"
+            //a === 100500, b === 521, c === нет переменной, d === value
+            {
+                let a = -50
+                b     = 1000
+                debugger;//a === -50, b === 1000, c === нет переменной, d === value
+            }
+            debugger;//a === 100500, b === 1000, c === нет переменной, d === value
+        }
+        debugger;//a === 100, b === 1000
+    }
+    debugger;//a === 100
+}
+//Ответьте на вопросы в комментариях и сверьтесь с отладчиком. console.log специально не писал */
+
+/* comparison if*/
+{
+    var age = +prompt("Сколько вам лет?", "");
+    if (age < 0) {
+        alert("ещё не родился");
+    }
+    else {
+        if (age < 18) {
+            alert("школьник");
+        }
+        else {
+            if (age < 30) {
+                alert("молодеж");
+            }
+            else {
+                if (age < 45) {
+                    alert("зрелость");
+                }
+                else {
+                    if (age < 60) {
+                        alert("закат");
+                    }
+                    else {
+                        if (age >= 60) {
+                            alert("как пенсия?");
+                        }
+                        else {
+                            alert("то ли киборг, то ли KERNESS");
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+//Добавьте условие отрицательного возраста в пример выше. Расставьте недостающие (но синтаксически необязательные) фигурные скобки. Выкиньте лишнее из текущего кода
+
+/*switch: sizes
+Сделайте задание Comparison: sizes используя switch*/
+
+//Comparison: sizes
+//Сделайте перевод перевод из нашей системы размеров в американскую или любую на выбор. Используйте prompt, условия сравнения и alert.
+
+
+{
+    const sizeUA = prompt('введи размер верхней одежды, платья, брюк в системе UA (40, 42, 44, .., 54), а я перевду в буквенную USA');
+    let result;
+    switch (sizeUA) {
+        case "37":
+        case "38":
+        case "39":
+            result = "Детский размер"
+            break;
+        case "40":
+        case "41":
+            result = "S"
+            break;
+        case "42":
+        case "43":
+            result = "M"
+            break;
+        case "44":
+        case "45":
+        case "46":
+            result = "L"
+            break;
+        case "47":
+        case "48":
+        case "49":
+        case "50":
+            result = "XL"
+            break;
+        case "51":
+        case "52":
+        case "53":
+        case "54":
+            result = "XXL"
+            break;
+    }
+    alert(`ваш размер "${result}" в системе USA`)
+}
+
+/*switch: if
+Перепишите пример ниже, используя if.*/
+let color = prompt("Введите цвет","");
+switch (color){
+    case "red": document.write("<div style='background-color: red;'>красный</div>");
+    case "black": document.write("<div style='background-color: black; color: white;'>черный</div>");
+                break;
+    case "blue": document.write("<div style='background-color: blue;'>синий</div>");
+    case "green": document.write("<div style='background-color: green;'>зеленый</div>");
+                break;
+    default: document.write("<div style='background-color: gray;'>Я не понял</div>");
+}
+
+{
+    let color = prompt("Введите цвет","");
+    
+    if (color === "red"){
+        document.write("<div style='background-color: red;'>красный</div>");
+        document.write("<div style='background-color: black; color: white;'>черный</div>")
+    }
+    if (color === "black"){
+        document.write("<div style='background-color: black; color: white;'>черный</div>")
+    }
+
+
+    if (color === "blue"){
+        document.write("<div style='background-color: blue;'>синий</div>");
+        document.write("<div style='background-color: green;'>зеленый</div>");
+    }
+    if (color === "green"){
+        document.write("<div style='background-color: green;'>зеленый</div>");
+    }  
+    
+    if ( !(color == "red" || color === "black" || color === "blue" || color === "green") ){
+        document.write("<div style='background-color: gray;'>Я не понял</div>")
+    }
+}
+
+/*noswitch
+Напишите функцию noSwitch, которая принимает объект со значениями-функциями, ключ для объекта и запускает одну из функций из объекта если ключ найден, иначе - запускает default:
+const noSwitch = (key, cases, defaultKey='default') => {
+    //проверка наличия key в cases
+    //если есть - достать значение по ключу. это будет функция. Запустить ее
+    //если нет - извлечь из объекта cases значение по ключу, имя которого лежит в переменной defaultKey. Запустить 
+    //пущай функция noSWitch возвращает то, что возвращает одна из функций из объекта
+}
+
+*/
+{
+    const noSwitch = (key, cases, defaultKey='default') => {
+        if (key in cases){
+            return cases[key]()
+        }else{
+            return cases[defaultKey]()
+        }
+    }
+
+
+    const drink = prompt("Что вы любите пить")
+    noSwitch(drink, {
+        воду: () =>  console.log('Самый здоровый выбор!'),
+        чай(){ 
+            console.log('Вкусная и полезная штука. Не переусердствуйте с сахаром')
+        },
+        "пиво": () => console.log('Хорошо летом, да в меру'),
+        виски: function(){
+            console.log('Да вы, батенька, эстет! Не забудьте лед и сигару')
+        },
+        default(){
+            console.log('шото я не понял')
+        }
+    })
+}
+
+/*closure calc
+fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
+     .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+        })
+Напишите внутри анонимной функции, переданной в then (data =>):
+цикл, который перебирает курсы;
+на каждой итерации создается кнопка (document.createElement)
+текст кнопки - название валюты (innerHTML или innerText)
+Назначьте обработчик события на этой кнопке (onclick = () => {.....}). Функция-обработчик должна быть написана прямо в теле цикла
+Обработчик должен спрашивать сумму используя prompt и переводить эту суммы из валюты, написанной на кнопке в USD
+Найдите замыкания. Для доступа к валютам из data.rates используйте [], . тут не поможет. Кнопки добавляйте в специальный контейнер (div например), созданный в HTML, или, на худой конец, в body*/
+
+{
+    fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
+        .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+
+            for (rate in data.rates) {
+                console.log(rate)
+                const cource = data.rates[rate]
+                const div = document.createElement('div')
+                const button = document.createElement('button')
+                button.innerText = rate
+                button.classList.add('button')
+                div.append(button)
+                document.body.append(div)
+                button.onclick = () => {
+                    alert(cource)
+                    const value = +prompt('какую сумму будем менять?')
+                    const result = value / cource
+                    alert(result)
+                }
+
+
+            }
+        })
+}
+
+/* closure calc 2
+Создайте HTML файл с :
+<select id='from'> - исходная валюта
+<select id='to'> - валюта в которую происходит обмен
+<div id='rate'> - кросскурс между валютами
+<input type='number' id='amount' /> - сумма в исходной валюте
+<div id='result'> - сумма в валюте, в которую хотим поменять
+Используя заготовку из предыдущего задания, наполните select-ы тэгами option с названиями валют, используя цикл
+document.createElement
+innerText для option
+from.append или to.append
+За пределами цикла назначьте обработчики onchange для элементов select и oninput для элемента input, используя их id. По этим событиям обновляйте текст в div#rate и div#result
+Для чтения текущего значения select используйте свойство value: from.value или to.value*/
+
+{
+    fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
+        .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+            const from = document.createElement('select')
+            from.id = "from"
+            const to = document.createElement('select')
+            to.id = "to"
+            document.body.append(from)
+            document.body.append(to)
+            const rateNow = document.createElement('div')
+            rateNow.id = 'rateNow'
+            document.body.append(rateNow)
+            const amount = document.createElement('input')
+            amount.id = 'amount'
+            amount.type = 'number'
+            document.body.append(amount)
+            const result = document.createElement('div')
+            result.id = 'result'
+            document.body.append(result)
+           
+            for (rate in data.rates) {
+                console.log(rate)
+                const cource = data.rates[rate]
+                const option = document.createElement('option')
+                option.innerText = rate
+                option.classList.add('option')
+                option.value = rate
+                const option2 = document.createElement('option')
+                option2.innerText = rate
+                option2.classList.add('option')
+                option2.value = rate
+                from.append(option);
+                to.append(option2);
+            }
+            from.onchange = to.onchange = amount.oninput = () => {
+                rateNow.innerText = (data.rates[to.value] / data.rates[from.value]).toFixed(4)
+                result.innerText = (data.rates[to.value] / data.rates[from.value] * amount.value).toFixed(2)
+            }
+
+        })
+}
+
+/*countries and cities
+fetch('https://raw.githubusercontent.com/russ666/all-countries-and-cities-json/master/countries.min.json').then(res => res.json())
+     .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+        })
+По аналогии с предыдущем заданием, реализуйте интерфейс выбора страны и города:
+по закрузке данных наполняйте select#countries элементами option с названиями стран;
+так же назначьте обработчик события onchange в select#countries, который:
+удаляет старый контент select#cities (достаточно занести в innerHTML или innerText пустую строку)
+добавляет в select#cities элементы option с городами из выбранной только что страны.
+Таким образом, при изменении страны будет меняться список городов в select#cities*/
+
+{
+    fetch('https://raw.githubusercontent.com/russ666/all-countries-and-cities-json/master/countries.min.json').then(res => res.json())
+     .then(data => {
+            //эта функция запускается когда данные скачиваются.
+            //остальной код работает РАНЬШЕ.
+            //только ТУТ есть переменная data со скачанными данными
+            console.log(data) //изучите структуру, получаемую с сервера в консоли
+
+            const countries = document.createElement('select')
+            const cities = document.createElement('select')
+
+            for (country in data){
+                const optionCounty = document.createElement('option')
+                optionCounty.innerText = optionCounty.value = country
+                countries.append(optionCounty)                
+            }
+
+            countries.onchange = () => {
+                cities.innerText = ''
+                for (city of data[countries.value]){
+                    const optionCity = document.createElement('option')
+                    optionCity.innerText = optionCity.value = city
+                    cities.append(optionCity)
+
+                }
+            }
+
+            document.body.append(countries)
+            document.body.append(cities)
+
+        })
+
+}
+

+ 27 - 0
js/js_09_conditions/style.css

@@ -0,0 +1,27 @@
+*,
+*:before,
+*:after {
+  box-sizing: border-box;
+}
+
+body {
+    margin: 0;
+    height: 100vh;
+    background-color: darkgrey;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+
+select, #amount {
+  padding: 10px;
+  margin: 20px;
+  min-width: 300px;
+}
+
+#rateNow, #result{
+  padding: 10px;
+  width: 100px;
+  background-color: antiquewhite;
+  margin: 10px;
+}