J*aScript剪刀石头布游戏:优化prompt输入处理与完善胜负判断逻辑


JavaScript剪刀石头布游戏:优化prompt输入处理与完善胜负判断逻辑

本文旨在解决J*aScript剪刀石头布游戏中常见的两个问题:prompt输入处理不当导致无法正确识别空输入,以及游戏胜负判断逻辑不完整。我们将详细探讨prompt行为差异、提供健壮的输入验证方案,并重构游戏核心判断逻辑,确保所有对战情况均能正确判定结果,从而提升游戏的用户体验和代码的准确性。

在学习j*ascript并尝试构建一个简单的“剪刀石头布”游戏时,开发者常常会利用confirm和prompt等浏览器内置函数与用户进行交互。然而,这些函数在特定场景下的行为特性,如果处理不当,可能会导致一些意料之外的问题。本教程将针对两个常见问题进行深入分析和修复,以帮助您构建一个更健壮、更完整的游戏。

问题一:prompt输入处理不当

原始代码在用户点击prompt对话框的“确定”按钮但未输入任何内容时,以及点击“取消”按钮时,都未能正确地引导用户或处理输入。具体表现为:

  1. 当用户未输入任何内容直接点击“确定”时,期望提示“你没有选择r, p, s”,但实际并未出现。
  2. 当用户点击“取消”时,期望提示“改变主意了?没关系”,但可能也未能正确触发。

问题分析:

prompt函数在不同操作下的返回值有所不同:

  • 如果用户输入内容并点击“确定”,它返回用户输入的字符串。
  • 如果用户未输入任何内容但点击“确定”,它返回一个空字符串 ""。
  • 如果用户点击“取消”,它返回 null。

在J*aScript中,null和空字符串 "" 都被认为是“假值”(falsy values)。因此,原始代码中的 if (startgame) 条件在用户点击“确定”但未输入,或者点击“取消”时,都会被评估为 false,导致逻辑分支未能按预期执行。

解决方案:

我们需要区分用户是点击了“取消”还是点击了“确定”但输入为空。

  • 对于点击“取消”的情况,startgame 将是 null。
  • 对于点击“确定”但输入为空的情况,startgame 将是 ""。

我们可以通过检查 startgame !== null 来判断用户是否点击了“取消”,然后进一步检查 playerchoice 是否为空或无效。

示例代码:

let playgame = confirm("Do you want to play game?");
if (playgame) {
  let startgame = prompt("Choose from r, p, s?");

  // 检查用户是否点击了“取消”
  if (startgame !== null) { // 用户没有点击“取消”
    let playerchoice = startgame.trim().toLowerCase(); // 清除空格并转小写

    // 检查玩家输入是否有效
    if (playerchoice === "r" || playerchoice === "s" || playerchoice === "p") {
      // 游戏核心逻辑
      // ... (此处省略,将在问题二中详细说明)

    } else {
      // 用户输入无效(包括空字符串)
      alert("你没有选择 r, p, s");
    }
  } else {
    // 用户点击了“取消”
    alert("改变主意了?没关系");
  }
} else {
  alert("下次再玩吧!");
}

注意事项:

  • trim() 方法用于去除字符串两端的空白字符,这有助于处理用户可能输入的空格。
  • toLowerCase() 方法将输入转换为小写,确保大小写不敏感的比较。
  • 更完善的输入验证可以结合 while 循环,直到用户输入有效内容为止。

问题二:游戏胜负判断逻辑不完整

原始代码在判断游戏结果时,只覆盖了平局和部分玩家获胜的情况,导致许多对战组合未能正确判定胜负,有时甚至需要重复输入才能看到结果。

Picit AI Picit AI

免费AI图片编辑器、滤镜与设计工具

Picit AI 172 查看详情 Picit AI

问题分析:

剪刀石头布游戏有九种可能的对战组合(玩家出拳3种 × 电脑出拳3种):

玩家出拳 电脑出拳 结果
r (石头) r (石头) 平局
r (石头) p (布) 电脑获胜
r (石头) s (剪刀) 玩家获胜
p (布) r (石头) 玩家获胜
p (布) p (布) 平局
p (布) s (剪刀) 电脑获胜
s (剪刀) r (石头) 电脑获胜
s (剪刀) p (布) 玩家获胜
s (剪刀) s (剪刀) 平局

原始代码只处理了平局,以及 playerchoice === "p" && computer === "r" 和 playerchoice === "s" && computer === "p" 这两种玩家获胜的情况。它错误地将 playerchoice === "r" && computer === "s" 判断为电脑获胜,并且遗漏了所有电脑获胜的情况。

解决方案:

我们需要使用 if...else if...else 结构来确保所有可能的对战结果都被正确覆盖,并且逻辑是互斥的。

示例代码:

// ... (接问题一的输入处理代码)

    if (playerchoice === "r" || playerchoice === "s" || playerchoice === "p") {
      // 电脑随机选择
      let compchoiceNum = Math.floor(Math.random() * 3); // 0, 1, 2
      let computer;
      if (compchoiceNum === 0) {
        computer = "r";
      } else if (compchoiceNum === 1) {
        computer = "p"; // 修正:原来是s,应该对应p
      } else { // compchoiceNum === 2
        computer = "s"; // 修正:原来是p,应该对应s
      }

      // 提示电脑的选择
      alert(`玩家选择了: ${playerchoice.toUpperCase()}\n电脑选择了: ${computer.toUpperCase()}`);

      // 判断胜负
      if (playerchoice === computer) {
        alert("平局!");
      } else if (
        (playerchoice === "r" && computer === "s") || // 石头胜剪刀
        (playerchoice === "p" && computer === "r") || // 布胜石头
        (playerchoice === "s" && computer === "p")    // 剪刀胜布
      ) {
        alert("玩家获胜!");
      } else {
        // 其他所有情况都是电脑获胜
        alert("电脑获胜!");
      }
    } else {
      alert("你没有选择 r, p, s");
    }
// ... (接问题一的输入处理代码)

代码修正说明:

  • 电脑选择修正: Math.floor(Math.random() * 3) 会生成 0, 1, 2。为了与 'r', 'p', 's' 对应,我们重新分配了值:
    • 0 对应 'r'
    • 1 对应 'p'
    • 2 对应 's'
    • 这样可以更清晰地将数字映射到选项。
  • 胜负判断逻辑:
    • 首先判断平局。
    • 然后使用 else if 判断玩家获胜的所有组合。
    • 最后使用 else 语句,覆盖所有剩余情况,即电脑获胜。这种结构确保了逻辑的完整性和互斥性。
  • 增加提示: 在判断结果前,先提示玩家和电脑各自的选择,可以增强游戏的互动性。

完整优化后的代码示例

将上述两部分的修复合并,可以得到一个更完善的剪刀石头布游戏代码:

let playgame = confirm("你想玩游戏吗?");

if (playgame) {
  let isValidInput = false;
  let playerchoice;

  // 使用循环确保玩家输入有效
  while (!isValidInput) {
    let startgame = prompt("请选择:r (石头), p (布), s (剪刀)");

    if (startgame === null) { // 用户点击了“取消”
      alert("改变主意了?没关系,下次再玩。");
      playgame = false; // 退出游戏
      break; // 退出循环
    }

    playerchoice = startgame.trim().toLowerCase();

    if (playerchoice === "r" || playerchoice === "s" || playerchoice === "p") {
      isValidInput = true; // 输入有效,退出循环
    } else {
      alert("无效输入。请选择 r, p, 或 s。");
    }
  }

  if (playgame) { // 只有当用户没有取消游戏时才继续
    // 电脑随机选择
    const compchoiceNum = Math.floor(Math.random() * 3); // 0, 1, 2
    let computer;
    if (compchoiceNum === 0) {
      computer = "r";
    } else if (compchoiceNum === 1) {
      computer = "p";
    } else {
      computer = "s";
    }

    // 提示玩家和电脑的选择
    alert(`你选择了: ${playerchoice.toUpperCase()}\n电脑选择了: ${computer.toUpperCase()}`);

    // 判断胜负
    if (playerchoice === computer) {
      alert("平局!");
    } else if (
      (playerchoice === "r" && computer === "s") || // 石头胜剪刀
      (playerchoice === "p" && computer === "r") || // 布胜石头
      (playerchoice === "s" && computer === "p")    // 剪刀胜布
    ) {
      alert("恭喜你,玩家获胜!");
    } else {
      alert("很遗憾,电脑获胜!");
    }
  }

} else {
  alert("下次再玩吧!");
}

总结

通过本教程,我们解决了J*aScript剪刀石头布游戏中常见的两个问题:prompt输入处理的健壮性以及游戏胜负判断逻辑的完整性。关键在于理解prompt在不同用户操作下的返回值,并利用if...else if...else结构确保所有游戏逻辑分支都被正确覆盖。此外,引入输入验证循环和清晰的提示信息,能够显著提升用户体验和代码的可靠性。这些改进不仅修复了现有问题,也为构建更复杂的交互式Web应用奠定了基础。

以上就是J*aScript剪刀石头布游戏:优化prompt输入处理与完善胜负判断逻辑的详细内容,更多请关注其它相关文章!


# 没关系  # 吉林抖音seo推广外包  # 邢台拼多多网站推广简介  # 大朗塘厦网站建设  # 厦门网站高端建设  # 营销案例推广建议  # 潍坊网站seo技巧  # 怎么找新推广的网站  # 桦南seo推广  # 小狗营销账号怎么做推广  # wordpress seo怎么写  # 请选择  # 将是  # javascript  # 重构  # 为空  # 下次再  # 有什么  # 选择了  # 出拳  # 对战  # 常见问题  # 电脑  # 浏览器  # java 


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


相关推荐: 店铺如何做视频号推广?做视频号推广有用吗?  mysql怎么查询数据_mysql基础查询语句使用教程  Flexbox布局:实现粘性导航与底部页脚的完美结合  QQ邮箱注册地址 免费获取QQ邮箱账号  NumPy 高性能技巧:基于多列条件查找最近邻行索引的向量化实现  iphone16系列配置参数介绍  Flask 应用中图片动态更新与上传:实现客户端定时刷新与服务器端文件管理  使用Python和GBGB API高效抓取指定日期范围和赛道比赛结果教程  AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  pubmed数据库官方主页_pubmed学术论文查找官网直达  192.168.1.1路由器后台入口 192.168.1.1默认登录入口  电脑“无法访问指定设备、路径或文件”怎么办?五种权限设置方法  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  byrutor直接访问入口 byrutor官方游戏库  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  在Flask应用中安全高效地更新SQLAlchemy用户数据  PHP中动态类名访问的类实例类型提示与静态分析实践  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  宝妈做视频号该写什么标签话题?宝妈关注的话题有哪些?  《腾讯相册管家》注销账号方法  《合金装备4》有望推出重制版!制作人发话了  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  教资成绩怎么查询  睡觉时心跳快是什么原因 夜间心悸如何应对  Python中安全地将环境变量转换为整数的类型注解指南  阿里云共享相册入口在哪  VS Code中的Tailwind CSS IntelliSense插件使用技巧  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】  解决异步Python机器人中同步操作的阻塞问题  Animex动漫社社登录官网 Animex动漫社资源社入口直达  传统曲艺莲花落的表演形式是  Cassandra中复合主键、二级索引与ORDER BY排序的限制与解决方案  《环球网校》设置报考省市方法  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  韩小圈网页版PC端入口 韩小圈网页版官方网站入口  如何使用 Optional 类型并满足 Pylint 的类型检查  邮编号码查询app有哪些_邮编号码查询推荐app及使用体验  掌握CSS :has() 选择器:父选择器、嵌套限制与常见陷阱解析  Win10如何关闭开机锁屏界面_Windows10跳过锁屏直接登录设置  家里的小飞虫总是不断,用什么方法可以彻底根除?  QQ邮箱PC端登录页面_QQ邮箱网页版登录界面  C++ bind函数使用教程_C++参数绑定与函数适配器的应用  yy漫画官方网站登录入口_yy漫画在线阅读页面地址  网页版网易云音乐入口_网易云音乐在线官网登录  《美篇》取消会员自动续费方法  J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制  鸿蒙单条备忘录如何加密  Magento 2 产品保存事件中安全更新属性的最佳实践 

 2025-09-30

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

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

点击免费数据支持

提交您的需求,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.