День добрый! Я активно боролся с плохим настроением :) В разработке только один рассказ, написано 30%. Учу javascript и english. Делал домашку, нужно было переписать маленькую игру "поле чудес" на функции. Намучился с одной функцией, никак не получалось ее правильно составить, не считала она количество правильно угаданных букв :)))
Угу, javascript для детей. Домашкой валят не по-детски :)) Для начала самое оно, я прям как-то втянулся, понял базовые вещи, прошел первую часть из 9-ти глав. Вот начинаю вторую часть книги, в ней расскажут теорию (dom, jquery..) и на закрепление сделаем игру "спрятанное сокровище", куда ж без практики :))
Привет :) Верно, функция должна была только посчитать к-во угаданных букв. Она принимает три аргумента: 1) Букву, введенную пользователем 2) Зашифрованное слово, в виде массива, где элементы это буквы 3) И массив угаданных/не угаданных букв
В функции идет цикл, сверяется на совпадение каждая буква, если угадана то переписывается, к примеру звездочка, угаданной буквой и добавляется единица в счетчик (к-во угаданных). А вот далее, когда вызывается эта функция и возвращается число (если что-то угадано), то минусуем от к-ва букв в слове (выбирается рандомно из массива слов) к-во угаданных букв и так до бесконечности, пока не угадаем все буквы, далее игровой цикл заканчивается и нас поздравляют..па-пам молодец все угадал! :)
Это-то я понял. Но вот этот момент // если угадана то переписывается остался внутри функции, вы же из нее не вывели измененный массив ansverArray? Он же не мог глобально измениться, с тех пор как вы его передали в функцию - он существует в ней как переменная. Если он вам далее не нужен, то и манипуляции с ним лишние, и можно было его не передавать. Это наверное во мне сеошник говорит, стремление все вокруг оптимизировать.
В книжке это задание как упражнение с функциями, не то чтобы этот код максимально идеально написан, или оптимизирован. Но чтобы потренироваться. Автор книги написал игровой процесс, где вызывал функции, а далее говорит напишите теперь функции ))) До этого мы делали эту игру без функций, то есть какие-то приемы/подходы уже известны, но не все. Потренировался я неплохо, часа 4 убил ))
Вы не подумайте, что я огульно хаю, мне на самом деле интересно разобраться. Можете кинуть весь код? Скажем, в своем профиле, а потом удалите. Или в моем, я скопирую и удалю
Это тоже примерно понятно. Единственное, что меня взволновало - судьба несчастного ansverArray, позабытого в уголочке updateGameState. Хотя, если там тепло и кормят...
Не хотел скринить всю программу, поэтому оно и не совсем понятно :) answerArray это массив, который: var setupAnswerArray = function (word) { for (var i=0; i<word.length; i++) { answerArray[i] = "_"; } return answerArray; }; var answerArray = setupAnswerArray(word);
выглядит в итоге так: _ _ _ _ _ _
Функция обновляет элемент массива вот тут: if (word[j] === guess) { answerArray[j] = guess;
если угадал букву то получится: a _ a _ _ _ _ (просто пример)
Плюс функция считает к-во угаданных букв, ее результат попадает в переменную correctGuess. То есть все ок с answerArray, его никто не забыл, программа работает :)
Вот все что вы пишете - я понимаю. Не понимаю только, в каком месте срабатывает изменение массива. Чего-то я не знаю про js - ну не спец, не скрываю. В функции setupAnswerArray есть строка "return answerArray" - все понятно, нет вопросов. А где вывод answerArray из функции updateGameState? В ней я вижу только вывод счетчика букв.
Я сам тож не спец, только начал учить js :) Попробую объяснить как сам понимаю:
1) Создался answerArray (тут понятно я так понял, мы получили для вывода _ _ _ _ _)
2) Вся игра это цикл while, в начале каждого игрового цикла мы вызываем showPlayerProgress(answerArray );
где showPlayerProgress - это алерт, окошко в браузере, в котором выводится answerArray
var showPlayerProgress = function (answerArray) { return alert(answerArray.join(" ")); };
3) Каждый цикл игры вызывает функцию updateGameState, в которой вот тут:
if (word[j] === guess) { answerArray[j] = guess;
присваивается элементу массива answerArray угаданная буква, то есть мы переписываем "_" на букву. Новый игрвой цикл нам снова алертом показывает обновленный элемент answerArray, где пользователь кликает Ок и у него запрашивается новая буква..
if (word[j] === guess) - условие, если буква слова равна букве, которую ввел пользователь, то answerArray[j] = guess; - элемент массива становится буквой пользователя
к примеру: word = python guess = y answerArray = ["_", "_",...]
Моя вина, тупанул немного спросонья. Надеюсь, вас не очень напряг. Напрочь забыл, что переменная может быть глобальной, и вы не обязаны ее выводить из функции, просто изменили - и все. Смутило, что вы массив передаете в функцию - кмк глобальные не нужно передавать, они во всем пространстве существуют с момента объявления. Хотя хз, могу наврать.
Как бы в теории я это знал, но не помню, чтоб пользовался. В php часто пользуюсь глобальными массивами, там их точно передавать не надо. Но и то, стараюсь глобальные не изменять - мало ли еще пригодятся, лучше отдать значение другой переменной. Спасибо за просветление :)
Не напрягли, мне даже интересно было поговорить об этом :) Когда кому-то что-то начинаешь объяснять, то сам потом лучше запоминаешь.
Каждый язык, что php что js имеет, я так понимаю, свои особенности. Я долго и упорно хотел передать из функции два значения. Либо ноль, если пользователь ничего не угадал, либо к-во угаданных букв. И ничего не работало )) я думал без ноля будет ошибка, функция ничего не вернет, а потом же идет вычитание.
Я на каком-то этапе написания программы получал в браузере ошибку NaN на значение к-ва не отгаданных букв и вылетал из игрового цикла очень быстро )) ведь функция сама по себе ничего не возвращает если пользователь ничего не угадал.
remainingLetters -= correctGuess; (у меня если пользователь не угадывает букву в correctGuess ничего не попадает, correctGuess = NaN). Если просто считать 5-NaN то будет ошибка. А с переменной и через -= (отнять и присвоить) то js нормально съел. remainingLetters -= NaN нормально работает :) типа 5 = 5-NaN и получаем 5..и цикл работает дальеш, потому что 5>0.
Про переменные это сложно понять, да. То есть когда вводишь какую-то переменную и присваиваешь ей значение. Я понимаю просто принцип, я не знаю этот язык. Но как вижу, что общие моменты есть с тем, которым я интересовалась. Можно присвоить число, а можно вот такую сложную комбинацию, а можно присвоить функцию опять же какую-нибудь.
Напрочь забыл, что переменная может быть глобальнойЦитатаКстати это фишка javascript, читал в другой книге. Он так работает, интерпретатор все переменные типа var выносит наверх, и видит их до выполнения всех функций, циклов и т.д. Но это приводило проблемам, если переменные повторялись и появился тип локальной переменной lat кажись, как раз для циклов или функций, если не хочешь чтобы она была видна за функцией, то пишешь lat myCode = .., а тип var myCode = ... подымет ее над всем кодом, где б ты ее не объявил :))
let и var, только это не типы переменных, а способы их объявления, как я понимаю. Но углубляться не буду, а то закопаюсь. Сам часто пишу без объявления, тупо присваиваю переменной значение. Работает - и ладно.
var check = 0; return check; Должно отдавать ноль, а не NaN, по логике. Странно...
А, нас не попросили, а перенесли. Ну я еще маленькую поправку попробую внести, пока не пришли настоящие программисты и не надавали по шеям.
function(){ var a = 1; } - объявляется локальная переменная а, которая будет работать только внутри функции. Если ранее объявлена глобальная переменная а - глобальная не изменится.
function(){ a = 1; } - присваиваем глобальной переменной а значение. Если глобальной переменной с таким именем не было - по идее она создастся.
Там же только часть программы приведена. Не показаны общие её моменты. Они просто не показаны, так как это пример. И в этом примере оно не нужно. Как я думаю.
<script type="text/javascript"> // Створюємо масив зі слів var words = ["javascript", "monkey", "amazing", "pancake", "python", "angular", "mongodb", "node"];
// Обираємо випадкове слово var pickWord = function () { return words[Math.floor(Math.random() * words.length)]; }; var word = pickWord(); var remainingLetters = word.length;
// Встановлюємо масив відповідей var answerArray = []; var setupAnswerArray = function (word) { for (var i=0; i<word.length; i++) { answerArray[i] = "_"; } return answerArray; }; var answerArray = setupAnswerArray(word);
var showPlayerProgress = function (answerArray) { return alert(answerArray.join(" ")); };
var getGuess = function () { return prompt("Guess a letter, or click Cancel to stop playing."); }; var updateGameState = function (guess, word, answerArray) { var check = 0; for (var j=0; j<word.length; j++) { if (word[j] === guess) { answerArray[j] = guess; check++; } } return check; };
var showAnswerAndCongratulatePlaye r = function (answerArray) { alert(answerArray.join(" ")); alert("Good job! The answer was " + word); };
// ігровий цикл
while (remainingLetters > 0) { showPlayerProgress(answerArray ); var guess = getGuess(); if (guess === null) { break; } else if (guess.length !==1) { alert("Please enter a single letter") } else { var correctGuess = updateGameState(guess, word, answerArray); remainingLetters -= correctGuess; } }
А ещё, я сначала в заметках записывала, то есть там интернет то вообще не нужен. Это программа как ежедневник или типо будильник, калькулятор, встроенная в функционал. Так вот в заметках подчёркивается слово и так и остаётся это подчеркивание. Хотя подчеркнуть слово там нет даже такой возможности.
Ещё и по украински, который я вообще не знаю Первый абзац - это обозначен массив из следующих слов обезьяна, удивительный, панкейк, и т. д. Далее функция, которая выбирает произвольно одно из этих слов Правильно или нет?
Далее переменной присваивается значение 0. Вставляется массив. Массив для функции с переменной I. Если её значение больше 0 (Что такое i++ это для меня загадка) то печатает _
Далее функция, которая выбирает произвольно одно из этих слов. Правильно или нет?ЦитатаДа, верно :)
var answerArray = []; - создается пустой массив, который записывается в переменную answerArray Что такое i++ это для меня загадкаЦитатаfor (var i=0; i<word.length; i++) - это цикл фор, он выполняется до тех пор, пока верно условие.
1. Внутри него указывается переменная i=0, этот код выполняется перед циклом 2. Далее идет условие, цикл выполняется пока i меньше длинны word (в нашем случае тут будет к-во букв в рандомно вібранном слове, например 5) 3. Этот код выполняется пока условие верное, в нашем случае стоит инкремент, i++ это увеличение i на одну единицу. То есть начинается цикл i=0, потом 1, 2, 3, 4 и цикл заканчивается, потому что 5 не меньше 5 (если word.length = 5)
Тело цикла: answerArray[i] = "_"; Массив наполняется значениями _, на выходе мы получим answerArray = ["_", "_", "_", "_", "_"]
А, количество букв определяет. Ну примерно понятно. Ну да это сложно уже, конечно. В слове может быть 5 или шесть букв. Пишет нужное количество значков _ под буквы. Если в слове 7 букв оно напишет под них 7 таких знаков. _ _ _ _ _ _ _
Публикация комментариев и создание новых тем на форуме Адвего для текущего аккаунта ограничено. Подробная информация и связь с администрацией: https://advego.com/v2/support/ban/forum/1186