Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lesson4 #4

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions billions.js
Original file line number Diff line number Diff line change
@@ -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;
}
}

/*Не знаю, на сколько я правильно понял, как должна была выглядеть эта игра, но
* получилось примерно так, хотя много чего можно и улучшить*/
22 changes: 22 additions & 0 deletions calcConsruct.js
Original file line number Diff line number Diff line change
@@ -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(), например - но в текущем варианте,
уже с использованием конструктора, это не будет работать - почему?*/
5 changes: 5 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,10 @@
</head>
<body>
<script src="main.js"></script>
<!--<script src="key.js"></script>
<script src="ladder.js"></script>
<script src="calcConsruct.js"></script>
<script src="labirint.js"></script>
<script src="billions.js"></script>-->
</body>
</html>
14 changes: 14 additions & 0 deletions key.js
Original file line number Diff line number Diff line change
@@ -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?*/
251 changes: 251 additions & 0 deletions labirint.js
Original file line number Diff line number Diff line change
@@ -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(), которая спрашивает номер хода у пользователя, создает локальную переменную с
введенным номером, а далее использует этот номер для обращения к необходимому объекту в массиве в соответствии с
номером хода. Ну и уже из этого объекта по соответствующим ключам достаем интересующую информацию и выводим
пользователю.*/
24 changes: 24 additions & 0 deletions ladder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
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 и с использованием?
Кстати, это могло бы пригодиться в реализации лабиринта*/
Loading