You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为HTML反应游戏实现最快点击时间的最高分展示功能?

实现反应游戏的最高分存储与展示功能

嘿,我来帮你搞定这个最高分功能!其实核心就是用浏览器的localStorage来持久化保存最快点击时间,这样玩家刷新页面后记录也不会丢失。下面是具体的实现步骤和修改后的完整代码:

关键实现思路

  • 初始化最高分:页面加载时,先从localStorage读取之前保存的最高分。如果是首次游玩没有记录,就设置一个初始值(比如用Infinity表示还没有有效记录),同时更新页面上的最高分显示。
  • 实时更新最高分:每次计算出玩家的单次点击耗时后,和当前最高分对比。如果这次的时间更短(反应更快),就更新最高分,同时把新的最高分存入localStorage,同步更新页面显示。

修改后的完整代码

<body>
  <div>
    <p>Your time: <span id="time"></span></p>
    <p>Highscore: <span id="highscore"></span></p>
    <div id="shape"></div>
  </div>
  <script>
    var start = 0;
    var end = 0;
    var timeElement = document.getElementById('time');
    var highscoreElement = document.getElementById('highscore');
    var shapeElement = document.getElementById('shape');

    // 初始化最高分:从localStorage读取,没有则设为Infinity
    let highscore = parseFloat(localStorage.getItem('highscore')) || Infinity;
    // 更新页面显示,若没有记录则显示"--"
    highscoreElement.textContent = highscore === Infinity ? '--' : `${highscore.toFixed(2)}ms`;

    // 生成随机形状的函数(补全基础逻辑)
    function createShape() {
      // 随机位置、大小、颜色和形状
      const top = Math.random() * (window.innerHeight - 100);
      const left = Math.random() * (window.innerWidth - 100);
      const size = 50 + Math.random() * 100;
      shapeElement.style.position = 'absolute';
      shapeElement.style.top = `${top}px`;
      shapeElement.style.left = `${left}px`;
      shapeElement.style.width = `${size}px`;
      shapeElement.style.height = `${size}px`;
      shapeElement.style.backgroundColor = `rgb(${Math.random()*255}, ${Math.random()*255}, ${Math.random()*255})`;
      shapeElement.style.borderRadius = Math.random() > 0.5 ? '50%' : '0';
      // 记录开始时间
      start = new Date().getTime();
      // 显示形状
      shapeElement.style.display = 'block';
    }

    // 点击形状的事件处理
    shapeElement.addEventListener('click', function() {
      // 记录结束时间
      end = new Date().getTime();
      // 计算耗时
      const timeTaken = end - start;
      // 更新当前时间显示
      timeElement.textContent = `${timeTaken.toFixed(2)}ms`;
      // 隐藏形状
      shapeElement.style.display = 'none';

      // 对比并更新最高分
      if (timeTaken < highscore) {
        highscore = timeTaken;
        // 保存到localStorage持久化
        localStorage.setItem('highscore', highscore);
        // 更新页面显示
        highscoreElement.textContent = `${highscore.toFixed(2)}ms`;
        // 可选:添加新纪录提示
        // alert('🎉 新纪录诞生!');
      }

      // 延迟生成下一个形状
      setTimeout(createShape, 500);
    });

    // 页面加载后立刻生成第一个形状
    setTimeout(createShape, 1000);
  </script>
</body>

关键代码解释

  • localStorage.getItem('highscore'):从浏览器本地存储读取历史最高分,即使关闭浏览器再打开,数据也会保留。
  • localStorage.setItem('highscore', highscore):当玩家创造新纪录时,把新的最高分存入本地存储,确保数据不会丢失。
  • 初始值用Infinity是为了让第一次点击的时间肯定能触发更新,正确记录第一个有效成绩。

内容的提问来源于stack exchange,提问作者R A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:06