From 7a5cdbef249672a5b783d1b651e5c9ec4d14da11 Mon Sep 17 00:00:00 2001 From: alexcoach Date: Sat, 27 Feb 2021 03:00:32 +0200 Subject: [PATCH 1/3] practice with objs --- calcConsruct.js | 22 ++++++++++++++++++++++ key.js | 14 ++++++++++++++ ladder.js | 23 +++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 calcConsruct.js create mode 100644 key.js create mode 100644 ladder.js diff --git a/calcConsruct.js b/calcConsruct.js new file mode 100644 index 0000000..3379760 --- /dev/null +++ b/calcConsruct.js @@ -0,0 +1,22 @@ +function Calculator(){ + this.read = function (){ + this.a = +prompt('Введите 1 число', ''); + this.b = +prompt('Введите 2 число', ''); + } + this.sum = function (){ + return this.a + this.b; + } + this.mul = function (){ + return this.a*this.b; + } +} + +let calculator = new Calculator(); +calculator.read(); +alert( "Sum=" + calculator.sum() ); +alert( "Mul=" + calculator.mul() ); + +/*В целом, с тем, как работает создание через конструктор, разобрался. +При этом, если создавать не через конструктор, +можно записывать просто - this read(), например - но в текущем варианте, +уже с использованием конструктора, это не будет работать - почему?*/ \ No newline at end of file diff --git a/key.js b/key.js new file mode 100644 index 0000000..8d328f9 --- /dev/null +++ b/key.js @@ -0,0 +1,14 @@ +let salaries = { + John: 100, + Ann: 160, + Pete: 130 +} + +let sum = 0; +for (let key in salaries){ + sum+=salaries[key]; + console.log(+sum); +} + +/* +Почему, при этом, если мы запишем в цикле sum+=salaries.key итогом будет NaN?*/ diff --git a/ladder.js b/ladder.js new file mode 100644 index 0000000..527e6a0 --- /dev/null +++ b/ladder.js @@ -0,0 +1,23 @@ +let ladder = { + step: 0, + up() { + this.step++; + return this; + }, + down() { + this.step--; + return this; + }, + showStep: function() { // показывает текущую ступеньку + alert( this.step ); + return this; + } +}; + + +ladder.up().up().down().up().up().up().showStep(); + +/* +Если использовать функции без return this - такая запись l18 не выполнится, +потребуется вводить функции пораздельно - почему? Не совсем понимаю особенности this, +что происходит с this в данном коде без использования return this и с использованием?*/ From f03e48215ab266daed435a4f3542893182bab28c Mon Sep 17 00:00:00 2001 From: alexcoach Date: Sat, 27 Feb 2021 07:03:33 +0200 Subject: [PATCH 2/3] done l4 --- index.html | 3 +++ ladder.js | 3 ++- main.js | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index a2942fe..07eb622 100644 --- a/index.html +++ b/index.html @@ -7,5 +7,8 @@ + \ No newline at end of file diff --git a/ladder.js b/ladder.js index 527e6a0..cf65653 100644 --- a/ladder.js +++ b/ladder.js @@ -20,4 +20,5 @@ ladder.up().up().down().up().up().up().showStep(); /* Если использовать функции без return this - такая запись l18 не выполнится, потребуется вводить функции пораздельно - почему? Не совсем понимаю особенности this, -что происходит с this в данном коде без использования return this и с использованием?*/ +что происходит с this в данном коде без использования return this и с использованием? +Кстати, это могло бы пригодиться в реализации лабиринта*/ diff --git a/main.js b/main.js index e69de29..cd8b134 100644 --- a/main.js +++ b/main.js @@ -0,0 +1,79 @@ +//Задание 1 + +function getObj (number){ + let obj = {};//Делаем объект, в который будем возвращать необходимые данные + let names = ['Сотни', 'Десятки', 'Единицы'];// Делаем в объекте массив с тремя элементами + if (number>=1000||number<0||isNaN(number)){//делаем проверку, предусмотренную заданием + console.log('Повторите ввод: число превышает 999 или введенное не является числом'); + return obj; + } + number = number.toString().split('');//переводим число в строку, из строки в массив + for (let i = number.length-1; i>=0; i--){//перебираем массив + obj[names[i]] = number[i];//Добавляем в объект + } + return obj;//Возвращаем созданные объект в Object +} + +let number = +prompt('Введите число от 0 до 999','999'); +let Object = getObj(number); +console.log(Object); + +//Задание 2 +/*Функция addToBasket создает объект (в качестве ключей объекта - id и amount) и +добавляет этот объект в массив basket. Было бы удобно подсчитать общее количество товаров +в объекте каталога*/ + +function addToBasket(){ + while (true){ + let id = +prompt('Введите товар из каталога: 1 - bike, 2 - car, 3 - ship, 4 - something. Если Вы больше не хотите совершать покупки, нажмите "Отмена", введите "0" или оставьте поле пустым', ''); + if (id == 0) return basket; + if (id > 4 || id < 1) alert('Нет такого товара в каталоге!'); + if (isNaN(id)) alert('Вы не выбрали товар! Введите число!') + if (id > 0 && id < 5) { + let amount = +prompt('Введите количество', '1'); + let prod = {}; + prod.id = id; + prod.amount = amount; + basket.push(prod); + } + } +} + +let products = { + 1: { + name: 'bike', + price: 300 + }, + 2: { + name: 'car', + price: 500 + }, + 3: { + name: 'ship', + price: 1000 + }, + 4: { + name: 'something', + price: 100 + } +} + +let basket = [];//Заранее создаем пустой массив для корзины +let sum = 0;//Изначальная стоимость товаров в корзине равна нулю + +basket = addToBasket(); +for (let i = 0; i Date: Sat, 27 Feb 2021 10:34:02 +0200 Subject: [PATCH 3/3] done l4+labirint and billions --- billions.js | 37 ++++++++ index.html | 4 +- labirint.js | 251 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 billions.js create mode 100644 labirint.js diff --git a/billions.js b/billions.js new file mode 100644 index 0000000..dc4c19c --- /dev/null +++ b/billions.js @@ -0,0 +1,37 @@ +let questions = [//Массив вопросов с объектами под каждый вопрос + { + question: 'Как называется столица России', + answers: 'а-Москва б-Вашингтон в-Берлин г-Токио', + trueA: 'а'//Такой ключ везде используется как правильный ответ и сравнивается с ответом пользователя + }, + { + question: 'В каком году началась Первая мировая война', + answers: 'а-1914 б-1917 в-1941 г-1939', + trueA: 'а' + }, + { + question: 'Какую фамилию носила императорская династия России', + answers: 'а-Рюрики б-Грозные в-Ивановы г-Романовы', + trueA: 'г' + } +] + +alert('Выбрав вариант ответа, запомните букву, его обзначающую, для последующего ввода в качестве ответа') +for (let i = 0; i <= questions.length; i++){//поочередно перебираем все объекты в массиве вопросов + if (i === questions.length){//длина массива больше, чем i последнего вопроса, значит на все ответили - победа + alert('Поздравляем! Вы миллионер!'); + break; + } + alert(questions[i].question);//выводим вопрос + alert(questions[i].answers);//варианты ответов + let userAnswer = prompt ('Введите букву с нужным вариантом ответа'); + if (userAnswer === questions[i].trueA) {//сравнение + alert('Правильно!'); + } else {//сравнение + alert(`Ошибка! Пройдено этапов: ${i} из ${questions.length}`); + break; + } +} + +/*Не знаю, на сколько я правильно понял, как должна была выглядеть эта игра, но +* получилось примерно так, хотя много чего можно и улучшить*/ \ No newline at end of file diff --git a/index.html b/index.html index 07eb622..1f65f39 100644 --- a/index.html +++ b/index.html @@ -9,6 +9,8 @@ + + +--> \ No newline at end of file diff --git a/labirint.js b/labirint.js new file mode 100644 index 0000000..88c15d7 --- /dev/null +++ b/labirint.js @@ -0,0 +1,251 @@ +// Данные: +// Игровое поле (прямоугольное, в каждой клетке есть свое состояние) +var gameBoard = { + cells: [], + width: 0, + height: 0, + gameFinished: false, + player: {} +} + +// Состояние игрока (координаты на игровом поле, направление, есть ли ключ) +var player = { + coords: { + x: 0, + y: 0 + }, + direction: 'Up', + haveKey: false, + gameBoard: {} +} +// Шаблон(ы) игрового поля +var BOARD = ["==========", + "= =", + "= K =", + "= =", + "= =", + "= E =", + "= =", + "= =", + "= =", + "=========="]; +var STARTPOSITION = { + x: 1, + y: 8, + direction: "Right" +} + +// Алгоритм: + +// Инициализация игры: +// Игровое поле: +// Копирование начального состояния из шаблона +gameBoard.init = function (template, player) { + this.height = template.length; + this.width = template[0].length; + this.cells = []; + for (var j = 0; j < this.height; j++) { + this.cells.push([]); + for (var i = 0; i < this.width; i++) { + this.cells[j].push({}); + switch (template[j][i]) { + case ' ': + this.cells[j][i].type = 'Free'; + break; + case 'K': + this.cells[j][i].type = 'Key'; + break; + case 'E': + this.cells[j][i].type = 'Exit'; + break; + default: + this.cells[j][i].type = 'Wall'; + break; + } + } + } + this.gameFinished = false; + this.player = player; +} + +// Состояние игрока +// начальные координаты + направление +// Ключ отсутствует +player.init = function (startPosition, gameBoard) { + this.coords.x = startPosition.x; + this.coords.y = startPosition.y; + this.direction = startPosition.direction; + this.haveKey = false; + this.gameBoard = gameBoard; +} + +gameBoard.init(BOARD, player); +player.init(STARTPOSITION, gameBoard); + +var LEFTDIRECTION = { + Left: 'Down', + Up: 'Left', + Right: 'Up', + Down: 'Right' +} + +var RIGHTDIRECTION = { + Left: 'Up', + Up: 'Right', + Right: 'Down', + Down: 'Left' +} + +//Функция для сохранения данных о ходе +let stepPosition = []; +stepPosition.push(player); +function saveStep(){ + stepPosition.push(this.player); +} + +//Функция для вывода хода +function getStepStory(){ + let a = +prompt('Введите номер хода, который хотели бы посмотреть', '1'); + let keyInfo; + if (stepPosition[a].haveKey === false){ + keyInfo = 'У Вас не было ключа.'; + }else keyInfo = 'У Вас был ключ.'; + let positionStoryX = stepPosition[a].coords.x; + let positionStoryY = stepPosition[a].coords.y; + alert(`${keyInfo}По оси X Вы располагались на позиции ${positionStoryX}, по оси Y на позиции ${positionStoryY}`); +} + +// Функция отображения поля +gameBoard.renderBoard = function() { + for (var j = 0; j < this.height; j++) { + var line = ''; + for (var i = 0; i < this.width; i++) { + if (this.player.coords.x === i && this.player.coords.y === j) { + line += 'P'; + } else { + switch (this.cells[j][i].type) { + case 'Free': + line += ' '; + break; + case 'Key': + line += 'K'; + break; + case 'Exit': + line += 'E'; + break; + case 'Wall': + line += '='; + break; + } + } + } + console.log(line + ' : ' + (j+'').padStart(3)); + } + saveStep(); + console.log(this.player); +} + +// Функция проверки возможности сделать ход +var DX = { + Left: -1, + Up: 0, + Right: 1, + Down: 0 +} + +var DY = { + Left: 0, + Up: -1, + Right: 0, + Down: 1 +} + +player.canMove = function() { + var newx = this.coords.x + DX[this.direction]; + var newy = this.coords.y + DY[this.direction]; + + return this.gameBoard.cells[newy][newx].type !== 'Wall'; +} + +// Функция проверки найденного ключа +player.checkKeyFound = function() { + var newx = this.coords.x + DX[this.direction]; + var newy = this.coords.y + DY[this.direction]; + + if (!this.haveKey && this.gameBoard.cells[newy][newx].type === 'Key') { + alert('Вы нашли ключ! Ищите дверь!'); + this.gameBoard.cells[newy][newx].type = 'Free'; + this.haveKey = true; + } +} + +// Функция проверки найденного выхода +player.checkExitFound = function() { + var newx = this.coords.x + DX[this.direction]; + var newy = this.coords.y + DY[this.direction]; + + if (this.haveKey && this.gameBoard.cells[newy][newx].type === 'Exit') { + alert('Вы нашли выход и открыли дверь!'); + this.gameBoard.gameFinished = true; + } +} + +// Функция перемещения игрока +player.move = function() { + this.coords.x = this.coords.x + DX[this.direction]; + this.coords.y = this.coords.y + DY[this.direction]; +} + +// Цикл игры: +while (!gameBoard.gameFinished) { +// Вывести состояние поля +// Вывести поле +// Отобразить игрока + gameBoard.renderBoard(); +// Спросить шаг у пользователя + var step = prompt('Что вы хотите сделать? (l - влево, r - вправо, g - вперед, q - выход)'); +// Выполнить шаг + switch (step) { +// Поворот: +// Вычислить новое направление +// Изменить состояние игрока + case 'l': + player.direction = LEFTDIRECTION[player.direction]; + break; + case 'r': + player.direction = RIGHTDIRECTION[player.direction]; + break; +// Вперед: + case 'g': +// Проверить возможность сделать шаг + if (player.canMove()) { +// Проверка найден ли ключ + player.checkKeyFound(); +// Проверка найден ли выход + player.checkExitFound(); +// Изменение положения игрока + player.move() + } + break; + case 'q': + gameBoard.gameFinished = true; + break; + default: + alert('Неизвестная команда!'); + break; + } +} + +// Завершение: +// Поздравление +getStepStory(); +console.log('Поздравляю, вы выиграли!') + +/*Для реализации вывода хода инициализировал массив StepPosition, в котором на позиции [0] +сохранены сведения о начальном положении игрока. Далее line144 добавил функцию saveStep(), которая добавляет +в массив StepPosition положение игрока после каждой инициализации хода. Соответственно, номер хода будет совпадать с +номером [] в массиве, на котором будет располагаться добавленный объект с положением игрока.Далее line 1707 +добавил функцию getStepStory(), которая спрашивает номер хода у пользователя, создает локальную переменную с +введенным номером, а далее использует этот номер для обращения к необходимому объекту в массиве в соответствии с +номером хода. Ну и уже из этого объекта по соответствующим ключам достаем интересующую информацию и выводим +пользователю.*/