Никогда не имел дело разновидностями API для программирования JS в web, поэтому для меня странно, почему не срабатывает часть кода в найденном мною шаблоне игры:
Возможно зависит от jquery.js или vanilla.js типа написания строк, но не срабатывает ни так, ни так...
Т.е. при проигрыше или победе идет вызов resetGame, но использованные подсказки и текущее положение вопроса (справа по очкам в столбике) так и остаются не сброшенными. Я в эту функции вставлял другие действия, они срабатывали, т.е. вероятно, проблема именно в написании, нужно как-то по-другому писать "this.enableCallFriendLifeline = true" для jquery.
Конечно, можно найти решение, просто перезагружать страницу, но хотелось бы понять, в чём проблема.
Сообщение отредактировал GameDev2 - Понедельник, 11 Сентября 2023, 18:00
Поужинал -- и полез с инспектором DOM на страницу игры. Сравнивая с процитированной функцией, вот что нашёл: 1) в разметке документа подсказка "Звонок другу" имеет класс "call", а не "callFriend"; 2) функция не обновляет иконку подсказки "Помощь зала", у которой класс "aud"; 3) функция не стирает стиль использованной подсказки и зачем-то вешает лишний обработчик события "onClick" на элемент.
Исходя из этого, переписал последние три строки так:
Хотя resetGame() и обновляет свойства объекта, в которых хранится текущий счёт, но ничего не меняет на странице -- это делается в функции rightAnswer(), обрабатывающей ответ игрока. Скопировал соответствующие строки в новую функцию updateStagesAndScore():
В результате, теперь после рестарта игры состояние подсказок обновляется до исходного, и счёт сбрасывается. Но до 100$ O_o Это из-за того, что в свойство amount пишется внутренний HTML помеченного классом "current" тега button из контейнера stages. Чтобы сброс был до 0, нужно как-то менять логику учёта и отображения очков.
1) В файле index.html добавил к последней кнопке в контейнере stages ещё одну -- невидимую:
2) В game.constructor() и в game.resetGame() в строке, обнулявшей счётчик очков, учёл появление "лишней" невидимой кнопки путём вычитания этого элемента из общего числа:
Код
this.gameLength = $(".stages button").length - 1;
3) Соответственно, в updateStagesAndScore() и в rightAnswer() строка со счётом получила вид (исчезло вычитание единицы):
Похоже, что под вечер я стал путаться в описании того, что же на самом деле сделал То последнее изменение в rightAnswer(), где исчезло вычитание единицы, -- лишнее, а вот где оно должно было быть, так это в функции resetGame() (и в constructor, наверное?):) После добавления невидимой кнопки ведь как получилось: теперь в контейнере ".stages" не 15 элементов, а 16 -- и это число минус единица сохраняется при запуске игры в свойство gameLength. Это значение используется для инициализации свойства pLen на старте. Обновляется же свойство pLen в rightAnswer() и указывает на индекс того элемента, который считается пройденным игроком. Индексы считаются от 0, поэтому, если в rightAnswer() из pLen не вычитать единицу, то на старте он указывает на кнопку с индексом 15 -- то есть, на ту самую невидимую шестнадцатую, у которой внутренний HTML равен "$0". И именно этот "$0" сохраняется в свойство amount, используемое updateStagesAndScore() при отображении счёта для игрока. Вот поэтому в rightAnswer() эту "минус единицу" менять не нужно было.
На всякий случай, здесь репозиторий, где у меня вчера это работало правильно.
Сообщение отредактировал Oscillograph - Вторник, 12 Сентября 2023, 13:11
У тебя нет ничего, что нужно запоминать, так почему бы просто не запустить процедуру обновления страницы (перехода на главную) после победы - location.reload() - у тебя всё обновится и не нужно будет возвращать положение очков, использованных подсказок и пр. Просто и понятно. Дао, выраженное словами, не есть истинное Дао.
. . . function countdown(){ // функция обратного отсчета . . . this.displayTimerMessage() . . .
Если правильно помню, this в JS -- это ссылка на объект, которому принадлежит использующий её метод. То есть, если функция не принадлежит классу Game, то с помощью this она не получит доступ к его методу displayTimerMessage(). Зато к displayTimerMessage() может получить доступ та функция, которая создаёт объект game -- в main.js она зовётся initGame(). Думаю, что из неё можно вырастить что-то полезное, в том числе использующее таймеры.
Сообщение отредактировал Oscillograph - Вторник, 12 Сентября 2023, 21:27
Интересный шаблон, но есть и более продвинутые для квизов движки. У этого после 50/50 даже можно выбрать удаленный вариант ответа - это баг или фича? А после выбора ответа он не подсвечивается и не горит, как в традиционных вариантах "Миллионера". В общем, без этого как-то слабенько. Если что, то ставьте мне + в репутацию! ;)
Кто может, пожалуйста, помогите сделать, чтобы исключенные варианты ответа после 50/50 нельзя было выбирать (пустое поле) и чтобы выбранный ответ горел после клика на него до следующего вопроса.
а я вот думаю, почему собственно jquery? разве его сейчас кто-то использует? почему не react? там же много UI китов, например MUI или Ant Design есть когда-то я уйду в web3
В том-то и проблема, что в игре не заложена возможность узнать, какие варианты активны, а какие - нет. Я и не знаю, как это можно реализовать. Кто может, помогите.
Помимо варианта заложить эту возможность можно рассмотреть и более простой: проверять длину текста в ответе. Если присмотреться к функции, которая удаляет тексты ответов, то можно заметить, что длина такого "пустого" ответа составляет всего два символа: "А:", например. Соответственно, всё, что длиннее двух символов, можно считать разрешённым для выбора. Вот, собственно, и всё, что достаточно проверять.
GameDev2, помог сделать игру на основе этого кода. Если что-то из реализованного нужно (звуки, например) - обращайся, помогу. Дао, выраженное словами, не есть истинное Дао.