Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2024, 17:07
Новичок на форуме
Отправить личное сообщение для ePaul69 Посмотреть профиль Найти все сообщения от ePaul69
 
Регистрация: 12.11.2024
Сообщений: 6

Window.local storage
Добрый день уважаемые гуру.
Помогите пожалуйста разобраться.
Пытаюсь сделать игру камень ножницы бумага:

HTML:

<body>
  <div>
    <p>Камень ножницы бумага</p>
    <button onclick="
        resultsTableEntry(rockCode)
        console.log(score);        
      " class="rock-btn">
      Камень
    </button>
    <button onclick="
        resultsTableEntry(scissorCode)
        console.log(score);
      " class="scissor-btn">
      Ножницы
    </button>
    <button onclick="
          resultsTableEntry(paperCode)
          console.log(score)
      " class="paper-btn">
      Бумага
    </button>
    <button onclick="resetScore()">Сбросить счет!</button>
    <p class="score-output"></p>
  </div>
  <script src="source/javascript/r_s_p.mjs"></script>
</body>


JS:
Простите за кучу if else, позже обязательно попробую это все улучшить

//Переменные выбора пользователя, передаваемые в функцию
//для сравнения с выбором компьютера
const rockCode = 'Камень';
const scissorCode = 'Ножницы';
const paperCode= 'Бумага';

// Объект для хранения результатов игры
const resultsTable = {
  ties: 0,
  wins: 0,
  losses: 0
};

// Пытаюсь записать результат в памяти компьютера, чтоб при
//обновлении страници не обнулялся resultTable
const score = JSON.parse(localStorage.getItem('resultsTable'));

// Рандомный выбор для компьютера 
const randomNumb = () => {
    let randomNumb = Math.random();
    if (randomNumb.toFixed(3) <= 1 / 3) {
        randomNumb = rockCode;
    } else if (randomNumb.toFixed(3) > 1 / 3 && randomNumb.toFixed(3) < 2 / 3) {
        randomNumb = scissorCode;    
    } else if (randomNumb.toFixed(3) > 2 / 3 && randomNumb.toFixed(3) < 1) {
        randomNumb = paperCode;    
    }
    return randomNumb;
};

//Сравнение выбора машины и выбора пользователя
const res = (userChoice) => { 
  const computerChoice = randomNumb();
    let message;
    if (userChoice === rockCode && computerChoice === rockCode){ 
        message = 'Ничья не взяла';      
    }else if(userChoice === rockCode && computerChoice === scissorCode){      
        message = 'Usver WIN';
    }else if(userChoice === rockCode && computerChoice === paperCode){ 
        message = 'MACHINE WIN';
  ;
    }else if(userChoice === scissorCode && computerChoice === rockCode){
        message = 'MACHINE WIN';

    }else if(userChoice === scissorCode && computerChoice === scissorCode){
        message = 'Ничья не взяла';

    }else if(userChoice === scissorCode && computerChoice === paperCode){
        message = 'Usver WIN';

    }else if(userChoice === paperCode && computerChoice === rockCode){
        message = 'Usver WIN';

    }else if(userChoice === paperCode && computerChoice === scissorCode){
        message = 'MACHINE WIN';

    }else if(userChoice === paperCode && computerChoice === paperCode){
        message = 'Ничья не взяла';

    }
    return message;
};

// Сброс очков
const resetScore = () => {
  resultsTable.wins = 0;
  resultsTable.ties = 0;
  resultsTable.losses = 0;
  alert(`
Победы: ${resultsTable.wins}
Ничьи: ${resultsTable.ties} 
Поражения: ${resultsTable.losses}`);
};

//Итоговая функция для сохранения очков в обьект resultsTable
const resultsTableEntry = (userChoice) => {
  const duelResult = res(userChoice);
  if (duelResult === 'Ничья не взяла') {
    return resultsTable.ties += 1;
  }
  if (duelResult === 'Usver WIN') {
    return resultsTable.wins += 1;
  }
  if(duelResult === 'MACHINE WIN') {
    return resultsTable.losses += 1;
  }
};

// Пытаюсь записать результат в памяти компьютера, чтоб при
//обновлении страници не обнулялся resultTable
localStorage.setItem('resultsTable', JSON.stringify(resultsTable));


В браузере все работает(кроме localStorage), но если пытаюсь скомпилировать это в vsCode выдает ошибку:

ReferenceError: localStorage is not defined



Грешу на то что код находится в подключаемом файле, и просто не видит объект Window.(но могу серьезно ошибаться)

Пытался вбить в отдельный скрипт в HTML файле local.Storage тоже ничего не вышло.

Подскажите куда копать.

Последний раз редактировалось ePaul69, 18.11.2024 в 17:15.
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2024, 17:49
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

vscode не использую, но предполагаю что ты пытаешься запускать в нём код в режиме node.js(серверный js) - там нет никакого window(потому что нет окна) и никакого localStorage(потому что это браузерная фишка).
Скорее всего где-то там в настройках надо поменять режим запуска, но хз, возможно он так вообще не умеет и проверять тебе надо в обычном браузере.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2024, 18:14
Новичок на форуме
Отправить личное сообщение для ePaul69 Посмотреть профиль Найти все сообщения от ePaul69
 
Регистрация: 12.11.2024
Сообщений: 6

Режим запуска
Ну запускаю то я это все на локальном сервере, все срабатывает. Значение сохраненного в локальное хранилище объекта не меняется. Хотя объект resultsTable меняется
Ответить с цитированием
  #4 (permalink)  
Старый 18.11.2024, 20:48
Новичок на форуме
Отправить личное сообщение для ePaul69 Посмотреть профиль Найти все сообщения от ePaul69
 
Регистрация: 12.11.2024
Сообщений: 6

Думаю скорее всего дело в том, что подсчет идет в функции
Ответить с цитированием
  #5 (permalink)  
Старый 19.11.2024, 07:25
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от ePaul69
Значение сохраненного в локальное хранилище объекта не меняется.
Потому, что у вас запись в localStorage происходит сразу, как только загружается и отрабатывает скрипт.
Вот эта строка
// Пытаюсь записать результат в памяти компьютера, чтоб при
//обновлении страници не обнулялся resultTable
localStorage.setItem('resultsTable', JSON.stringify(resultsTable));

Она просто отрабатывает сразу, а не после выполнения какого то действия.
Ответить с цитированием
  #6 (permalink)  
Старый 19.11.2024, 08:17
Новичок на форуме
Отправить личное сообщение для ePaul69 Посмотреть профиль Найти все сообщения от ePaul69
 
Регистрация: 12.11.2024
Сообщений: 6

Т.е. если я его запишу в последнюю выполняемую функцию, все должно сработать? В принципе объект находится в локальной зоне видимости, и на сколько я понимаю, localstorage должен его увидеть
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправлять данные Local Storage через форму? Exhaust_ AJAX и COMET 2 04.03.2018 03:33
Html5 local storage spin Общие вопросы Javascript 11 24.11.2014 13:44
Отловить событие storage cevut Events/DOM/Window 18 09.03.2014 09:35
Не выгружает значение из Local Storage на другой странице x3zone Events/DOM/Window 3 09.10.2012 10:18
Обработка события с Local Storage taobo Events/DOM/Window 6 29.08.2012 14:36