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


相关推荐: tiktok国际版入口_tiktok官网网页版链接  J*aScript对象中深度嵌套URL键的查找与更新策略  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  CSS布局中意外顶部空白的调试与解决:深入理解padding-top  Lar*el如何创建自定义的辅助函数(Helpers)_Lar*el全局函数定义与加载方法  芒果TV官网登录入口 芒果TV官方网站登录入口  J*aScript:从子元素中批量移除特定CSS类  J*aScript实现网页表单实时输入字段比较与验证教程  iPhone14无法连接蓝牙设备如何解决  夸克浏览器资源嗅探怎么用 夸克浏览器网页资源下载技巧【教程】  抖音号已注销怎么解绑企业认证?不解绑企业认证会怎样?  中大网校app做题记录清除方法  英雄联盟争者留名活动介绍  《雅迪智行》用手机开锁方法  解决J*aScript动态图片上传中ID重复问题:在同一页面显示多张独立图片  海棠阅读网页版_进入海棠网页版在线阅读中心  如何通过settings.json个性化您的VS Code体验  《随手记》关闭首页消息推送方法  百度网盘网页入口链接分享 百度网盘官网入口网页登录  火柴人战争网页版在线玩  暴风影音官网正式版_暴风影音手机版官网下载安卓  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  Python实战:高效处理实时数据流中的最小/最大值  网易云音乐闹钟铃声设置教程  金牛福袋获取攻略  抖音作品被限流怎么办 抖音内容优化与流量恢复方法  中通快递官网指定查询 中通快递单号查询平台入口  AO3永久镜像入口开放_AO3最新网址兼容所有浏览器  OPPO手机参数配置如何开启护眼模式_OPPO手机参数配置护眼模式开启指南  优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南  微博网页版访问入口 微博网页版网页端使用指南  Excel如何设置动态下拉菜单_Excel表格下拉选项快速方法  《下一站江湖2》心法融合技巧  在J*a中如何实现类的继承与方法重用_OOP继承方法重用技巧分享  微信客户端如何找回密码_微信客户端忘记密码找回方法  快手缓存清理方法  J*aScript桌面应用_Electron多进程架构实战  猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  《友玩*》创建群聊方法  荣耀Magic7拍照夜景噪点处理_荣耀Magic7相机优化  KFC邀请码怎么使用领额外优惠_KFC邀请码输入方式与额外优惠代码获取方法  汽车之家网页版免费登录_汽车之家官网首页直接进入  小红书如何引流到私信?引流到私信有用吗?  英国搜索:多数英国人认为语言搜索是未来搜索  Python模块化编程:避免循环导入与共享函数的最佳实践  Bootstrap 5导航栏折叠功能失效:数据属性迁移指南  QQ邮箱官方登录页_腾讯出品安全稳定的邮箱服务  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  PointNet++语义分割模型中类别变更引发的断言错误及标签处理策略 

 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.