J*aScript 测验游戏:实现所有问题回答完毕后立即结束游戏


JavaScript 测验游戏:实现所有问题回答完毕后立即结束游戏

本文将详细介绍如何在 j*ascript 测验游戏中,确保当所有问题都被回答完毕时,游戏能够立即结束,而无需等待计时器归零。我们将分析现有代码中的不足,并提供一个简洁有效的解决方案,通过检查当前问题索引与问题总数的逻辑,实现游戏的即时终止,并停止计时器。

J*aScript 测验游戏:实现所有问题回答完毕后立即结束游戏

在开发基于 J*aScript 的测验(Quiz)游戏时,一个常见的需求是游戏不仅要在计时器归零时结束,还应在所有问题都被回答完毕后立即终止。本文将深入探讨如何优雅地实现这一功能,确保用户体验的流畅性。

问题分析

在许多测验游戏的初始实现中,游戏结束的逻辑往往主要依赖于计时器。例如,当计时器倒计时到零时,游戏才进入结束状态。然而,如果玩家在计时器到期之前回答完了所有问题,游戏却仍然停留在最后一个问题界面,等待计时器走完,这会造成不必要的延迟和用户困惑。

我们来看一个典型的 nextquestion 函数实现:

function nextquestion(event) {
  if (event.target.className === "btn") {
    // ... 处理答案逻辑,计算分数或扣除时间 ...

    currentQuestion++; // 移动到下一个问题
    displayQuestion(); // 显示下一个问题
  }
};

这段代码的问题在于,它在 currentQuestion 递增之后,直接调用 displayQuestion() 来显示下一个问题,而没有检查是否已经没有更多问题了。如果 currentQuestion 超出了 questionKey 数组的范围,displayQuestion() 将尝试访问一个不存在的索引,可能导致错误,更重要的是,游戏不会进入结束状态。

解决方案:检查问题完成状态

要解决这个问题,我们需要在每次处理完一个问题并准备显示下一个问题之前,增加一个逻辑判断:检查 currentQuestion 是否已经达到了问题数组的总长度。如果达到,则意味着所有问题都已回答完毕,此时应该立即调用 gameOver() 函数来结束游戏,并停止计时器。

即梦AI 即梦AI

一站式AI创作平台,免费AI图片和视频生成。

即梦AI 16094 查看详情 即梦AI

以下是修改后的 nextquestion 函数的关键部分:

// ... 其他代码 ...

let timeInterval; // 将 timeInterval 声明为全局变量,以便在任何地方清除

// ... startTimer 函数 ...
function startTimer() {
  timeInterval = setInterval(
    () => {
      timeLeft--;
      document.getElementById("timeSpan").innerHTML = timeLeft;
      if (timeLeft <= 0) {
        clearInterval(timeInterval);
        gameOver();
      }
    }, 1000
  );
};

// ... displayQuestion 函数 ...

function nextquestion(event) {
  if (event.target.className === "btn") {
    // ... 处理答案逻辑,计算分数或扣除时间 ...

    currentQuestion++; // 移动到下一个问题

    // 关键改动:检查是否所有问题都已回答完毕
    if (currentQuestion === questionKey.length) {
      clearInterval(timeInterval); // 停止计时器
      gameOver(); // 结束游戏
    } else {
      displayQuestion(); // 显示下一个问题
    }
  }
};

// ... gameOver 函数 ...

解释:

  1. currentQuestion++: 在玩家选择一个答案后,currentQuestion 递增,指向下一个问题。
  2. if (currentQuestion === questionKey.length): 这是核心判断。questionKey.length 返回问题数组中问题的总数。由于数组索引是从 0 开始的,当 currentQuestion 的值等于 questionKey.length 时,意味着我们已经遍历并回答了所有问题(例如,如果总共有 5 个问题,索引从 0 到 4,那么当 currentQuestion 变为 5 时,所有问题都已回答)。
  3. clearInterval(timeInterval): 在所有问题回答完毕后,计时器就不再需要运行了。调用 clearInterval 函数并传入 setInterval 返回的 ID (timeInterval),可以停止计时器。请确保 timeInterval 是在 startTimer 函数外部声明的,以便 nextquestion 函数可以访问它。
  4. gameOver(): 立即调用 gameOver() 函数,将游戏切换到结束页面,并显示最终分数。
  5. else { displayQuestion(); }: 如果还有未回答的问题,则继续调用 displayQuestion() 来显示下一个问题。

完整示例代码

为了更清晰地展示,以下是包含上述修改的完整 J*aScript 代码片段:

// calling in id/class from HTML 
const questionEl = document.getElementById("question");
// checkers 元素在原始HTML中没有对应的ID,如果不需要可移除或根据实际情况添加ID
// const checkers = document.getElementById("right-wrong"); 
const timerEl = document.getElementById("timeSpan"); // 更正为getElementById,因为只有一个timeSpan
const answerOne = document.getElementById("answer1");
const answerTwo = document.getElementById("answer2");
const answerThree = document.getElementById("answer3");
const answerFour = document.getElementById("answer4");
const finalScoreEl = document.getElementById("pointScore");
const nameEl = document.getElementById("initials");
const highScoreEl = document.getElementById("highScoreList");

var questionKey = [
  {
    question: "which variable has the value of a string.",
    choiceOne: "x = 6",
    choiceTwo: "x = \"87\"",
    choiceThree: "x = true",
    choiceFour: "x;",
    answer: "x = \"87\""
  },
  {
    question: "choose the operator that checks for value and type.",
    choiceOne: "=",
    choiceTwo: "+=",
    choiceThree: "===",
    choiceFour: "<=;",
    answer: "==="
  },
  {
    question: "choose the true statement.",
    choiceOne: "4 != 4",
    choiceTwo: "4 > 85",
    choiceThree: "7 === \"7\"",
    choiceFour: "7.6 == \"7.6\"",
    answer: "7.6 == \"7.6\""
  },
  {
    question: "which data type is not primitive.",
    choiceOne: "boolean",
    choiceTwo: "array",
    choiceThree: "number",
    choiceFour: "string",
    answer: "array"
  },
  {
    question: "Which one is the Increment operator.",
    choiceOne: "**",
    choiceTwo: "/",
    choiceThree: "++",
    choiceFour: "+=",
    answer: "++"
  }
];

// starting positions
let timeLeft = 60;
let score = 0;
let currentQuestion = -1;
let finalScore;
let timeInterval; // 声明 timeInterval 以便在任何函数中访问

// change div to start the test
function changeDiv(curr, next) {
  document.getElementById(curr).classList.add('hide');
  document.getElementById(next).removeAttribute('class');
}

// button to start the game
document.querySelector('#startButton').addEventListener('click', gameStart);

function gameStart() {
  changeDiv('start', 'questionHolder');
  currentQuestion = 0;
  displayQuestion();
  startTimer();
}

// timer function/Count down
function startTimer() {
  timeInterval = setInterval(
    () => {
      timeLeft--;
      document.getElementById("timeSpan").innerHTML = timeLeft;
      if (timeLeft <= 0) {
        clearInterval(timeInterval);
        gameOver();
      }
    }, 1000
  );
}

function displayQuestion() {
  questionEl.textContent = questionKey[currentQuestion].question;
  answerOne.textContent = questionKey[currentQuestion].choiceOne;
  answerTwo.textContent = questionKey[currentQuestion].choiceTwo;
  answerThree.textContent = questionKey[currentQuestion].choiceThree;
  answerFour.textContent = questionKey[currentQuestion].choiceFour;
}

// will end game when all questions are completed as well as populate the next question
document.querySelector('#questionHolder').addEventListener('click', nextquestion);

function nextquestion(event) {
  if (event.target.className === "btn") {
    console.log(event.target.textContent, questionKey[currentQuestion].answer);
    if (event.target.textContent === questionKey[currentQuestion].answer) {
      score += 10;
      console.log("correct");
      console.log(score);
    } else {
      if (timeLeft >= 10) {
        console.log(timeLeft);
        timeLeft = timeLeft - 10;
        document.getElementById("timeSpan").innerHTML = timeLeft;
        console.log("not correct");
      } else {
        timeLeft = 0;
        gameOver(); // 如果时间不足10秒,直接结束游戏
      }
    }
    currentQuestion++;

    // IF THERE ARE NO MORE QUESTIONS, CALL gameOver
    if (currentQuestion === questionKey.length) {
      clearInterval(timeInterval); // 停止计时器
      gameOver(); // 结束游戏
    } else {
      displayQuestion(); // 显示下一个问题
    }
  }
}

// the game is over and logs your current score
function gameOver() {
  document.getElementById("timeSpan").textContent = 0; // 直接设置span的文本
  changeDiv('questionHolder', 'finishedPage');
  finalScore = score;
  finalScoreEl.textContent = finalScore;
}

注意事项与最佳实践

以上就是J*aScript 测验游戏:实现所有问题回答完毕后立即结束游戏的详细内容,更多请关注其它相关文章!


# java  # javascript  # 一个问题  # 双击  # 零时  # 都已  # 完毕后  # 计时器  # 游戏本  # ssl  # html  # seo文案写作技巧  # 沈阳网站建设包括什么  # 房产网站建设的基本步骤  # 抖音互联网营销推广方案  # 小程序怎样营销推广  # 河北大型网站建设检修  # 福州小程序网站建设开发  # 飞翔网站建设美丽中国  # 北京seo seo柯南  # 江门营销推广招聘网站  # 的是  # 自适应  # 全选  # 第三方 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 六级准考证号怎么查_四六级准考证查询入口官网  b站如何剪辑视频_b站必剪app使用教程  作业帮网页版不用下载入口 在线问老师快速答疑  VB表达式书写规则解析  J*aScript包管理器_Npm与Yarn对比  Vue 3中独立响应式实例的创建与应用  店铺如何做视频号推广?做视频号推广有用吗?  iPhone14无法连接蓝牙设备如何解决  CSS过渡如何实现按钮悬停效果_transition属性控制背景颜色变化  谷歌浏览器官网地址整理_谷歌浏览器新版直连2026稳定访问  安居客移动经纪人怎么设置自动回复?-安居客移动经纪人设置自动回复的方法  excel怎么制作考勤表 excel考勤模板与函数公式讲解  Fedora怎么安装 Fedora Workstation安装步骤  4399造梦西游3无敌版_4399游戏入口  J*aScript:从子元素中批量移除特定CSS类  word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法  J*aScript对象中深度嵌套URL键的查找与更新策略  如何在mysql中使用索引提示_mysql索引提示优化方法  mysql如何配置从库只读_mysql从库只读设置方法  《微信》视频号原创声明开启方法  如何取消数字签名  酷狗音乐多音轨设置教程  个人所得税办理入口 个人所得税综合所得年度汇算入口  Retrofit根路径POST请求:@POST("/") 的应用与解析  VS Code源代码管理(SCM)视图的进阶使用技巧  J*aScript文本高亮功能优化:解决多词匹配错误与精确分割策略  苹果手机手电筒无法开启  《环球网校》设置报考省市方法  《kimi智能助手》制作ppt教程  PHP与SQL实践:高效实现数据复制与特定列值修改  12306售票时间最新规定 | 网上订票和车站窗口时间一样吗  如何查询国外邮政编码_国外邮政编码查询的多种有效途径  视频转蓝光m2ts格式  荣耀Magic6 Pro拍照成像偏暗_荣耀Magic6 Pro夜景优化  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  mysql中外键约束如何使用_mysql FOREIGN KEY操作  @Team是什么?揭秘团队含义  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  poki官网最新入口 poki小游戏大全入口  苹果电脑如何快速截图并编辑 苹果电脑截屏标注快捷操作  Excel怎么用XLOOKUP函数实现双向查找_ExcelXLOOKUP替代VLOOKUP+HLOOKUP的高级用法  J*aScript二进制处理_ArrayBuffer与Blob  抖音号升级成企业资质怎么弄?有什么好处?  如何发挥新媒体矩阵作用?新媒体矩阵怎么搭建?  Golang如何操作指针参数_Go pointer参数传递规则  《书耽》更换手机号方法  厨房地面防滑垫的油污怎么洗? 机洗和手洗防滑垫的注意事项  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来 

 2025-10-25

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.