如何用JavaScript Cookie实现俄罗斯方块游戏最高分存储?
嘿,这个需求其实挺常见的,我来给你一步步拆解最佳实现方式,都是前端实用的操作,很容易落地:
核心思路
先获取游戏结束时的最终分数,再读取浏览器中保存的最高分Cookie,两者做数值比较,如果最终分数更高,就把它更新为新的最高分Cookie。
具体实现步骤(JavaScript)
1. 获取游戏结束时的最终分数
首先你得拿到游戏结束时的分数值,假设你的游戏逻辑里已经有这个变量了,比如:
// 假设游戏结束后,最终分数存在这个变量里 const finalScore = 1800; // 实际值由你的游戏逻辑提供
2. 读取现有最高分Cookie
浏览器的Cookie是字符串格式,所以我们需要写一个工具函数来解析并获取指定名称的Cookie值:
function getCookie(name) { // 拆分Cookie字符串,匹配目标Cookie const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); } // 获取保存的最高分,转成数字类型(默认0,避免第一次玩时Cookie不存在的情况) const highScore = parseInt(getCookie('tetrisHighScore')) || 0;
3. 比较分数并更新Cookie
如果最终分数大于现有最高分,就更新Cookie。这里要注意设置Cookie的持久化属性,避免浏览器关闭后Cookie丢失:
function setCookie(name, value, days = 365) { // 设置Cookie的有效期,默认保存1年 const date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); const expires = `expires=${date.toUTCString()}`; // 设置路径为根目录,确保全站都能访问这个Cookie document.cookie = `${name}=${value}; ${expires}; path=/`; } // 比较分数,更新最高分 if (finalScore > highScore) { setCookie('tetrisHighScore', finalScore); console.log('新纪录诞生!已保存最高分'); } else { console.log('未打破纪录,最高分保持不变'); }
关键注意点
- 数值类型转换:一定要把Cookie里的字符串转成数字再比较,不然会出现字符串比较的bug(比如"1000"和"999"字符串比较时,"1000"会被认为更小)。
- Cookie持久化:如果不设置
expires或max-age,Cookie会变成会话Cookie,浏览器关闭就会消失,所以建议设置一个较长的有效期。 - 路径设置:加上
path=/可以确保你的游戏在网站的任何页面都能读取到这个最高分Cookie,避免路径限制导致的读取失败。 - 首次游戏处理:当用户第一次玩时,
getCookie会返回undefined,用|| 0处理后默认最高分是0,这样第一次的分数肯定会被保存。
如果你的游戏是用React、Vue这类框架开发的,核心逻辑还是一样的,只是获取最终分数的方式可能会和框架的状态管理(比如useState、Vuex)结合,但Cookie的读取和更新逻辑完全通用。
内容的提问来源于stack exchange,提问作者codehssucks




