Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JavaScript剪刀石头布游戏:优化prompt输入处理与完善胜负判断逻辑_创想鸟

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

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

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

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

问题一:prompt输入处理不当

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

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

问题分析:

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

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

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

立即学习“Java免费学习笔记(深入)”;

解决方案:

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

对于点击“取消”的情况,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 循环,直到用户输入有效内容为止。

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

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

问题分析:

剪刀石头布游戏有九种可能的对战组合(玩家出拳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("下次再玩吧!");}

总结

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1524792.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Underscore.js 链式调用:从嵌套数组中统计元素出现频率的教程
上一篇 2025年12月20日 17:07:26
如何用Next.js实现动态路由与静态生成?
下一篇 2025年12月20日 17:07:43

相关推荐

  • win10平板模式下屏幕键盘不自动弹出怎么办_恢复屏幕键盘自动弹出的技巧

    1、检查平板电脑模式设置,确保登录和使用时均启用平板模式并重启;2、在设备→输入中开启“不处于平板模式且未连接键盘时显示触摸键盘”;3、通过注册表编辑器创建InitialKeyboardIndicators值为2(十六进制)以强制启用键盘指示器;4、手动显示触摸键盘按钮并测试各应用兼容性,排查特定软…

    2026年9月21日
    000
  • 钉钉视频通话模糊怎么办 钉钉视频清晰度调整与网络优化方法

    视频模糊主因是网络、设备或设置问题。先优化Wi-Fi并关后台应用,再清洁镜头、调光线和物理对焦,最后开高清模式、更新钉钉版本或换高清设备,多数可改善。 钉钉视频通话模糊,通常不是单一原因导致的,而是网络、设备或软件设置共同影响的结果。想要快速改善画面质量,可以从以下几个方面着手排查和优化。 检查并优…

    2026年9月21日
    000
  • Java多线程API调用中Future.get()返回null的解决方案

    本文旨在解决%ignore_a_1%api调用中`future.get()`方法返回`null`的常见问题。当使用`callable`和`executorservice`并发执行api请求并尝试获取结果时,如果流读取逻辑不当,可能导致获取到的数据为空。文章将详细解释问题根源,并提供使用`string…

    2026年9月21日
    000
  • UC浏览器缓存清理失败怎么办 UC浏览器缓存管理优化方法

    先检查权限和存储空间,再用手机自带工具清理缓存文件夹,最后更新或重装UC浏览器解决清理失败问题。 UC浏览器缓存清理失败,通常不是按钮没反应,就是空间没释放。问题可能出在系统权限、文件顽固或设置冲突上。别急着重装,先试试这几个方法,基本能搞定。 检查应用权限与存储状态 如果UC浏览器自己都“进不去”…

    2026年9月21日
    000
  • 升级后如何检查兼容性

    检查兼容性是升级后确保系统稳定的关键,需先确认硬件配置与驱动支持,再验证软件运行及业务流程正常,最后通过系统日志排查潜在错误,逐步排除风险。 系统或软件升级后,检查兼容性是确保各项功能正常运行的关键步骤。直接进入实际使用前,花时间验证兼容性可以避免数据丢失、服务中断等问题。 检查硬件和驱动支持 某些…

    2026年9月21日
    000
  • windows怎么解决蓝屏问题_windows蓝屏故障排查与修复方法

    蓝屏问题通常由驱动冲突、硬件故障或系统文件损坏引起,需记录错误代码并进入安全模式排查;通过设备管理器检查驱动、使用SFC和DISM修复系统文件,并运行内存与硬盘检测工具确认硬件健康,必要时清洁硬件接触点。 如果您在使用Windows系统时遇到电脑突然黑屏并显示蓝色错误界面,这通常意味着系统遇到了无法…

    2026年9月21日
    000
  • windows怎么查看电脑型号_Windows查看电脑硬件型号方法

    通过系统信息工具查看:按Win+R输入msinfo32,查找“系统型号”获取电脑型号;2. 使用命令提示符执行wmic csproduct get name查询型号;3. 在Windows 11设置中进入“系统-关于”,查看“设备规格”下的“设备型号”;4. 利用PowerShell运行Get-Wm…

    2026年9月21日
    100
  • .com网站安全维护_保障.com网站稳定的措施

    答案:保障.com网站稳定需加强安全防护、定期备份、实时监控和应急准备。部署防火墙、更新系统、使用HTTPS、限制端口;制定自动备份并异地存储,定期恢复测试;利用监控工具检测可用性与异常流量,优化加载速度;建立应急流程,严格权限管理,定期演练。细节执行到位才能确保长期安全稳定运行。 确保.com网站…

    2026年9月21日
    100
  • 蝴蝶号内容创作不露脸的五大绝技与执行方法 | 快速提升曝光率的实用操作流程

    不露脸也能玩转蝴蝶号内容创作,关键在于将焦点从个人形象转移到内容本身与观众体验上,通过声音叙事、动态文字、手部特写、数据可视化和场景搭建五大核心策略构建吸引力,结合高质量音画配合、精准的受众定位、稳定更新与算法互动,提升曝光率;同时规避素材版权、声音质量与画面单调等技术挑战,善用免费或付费正版素材、…

    2026年9月21日
    100
  • windows10如何解决“找不到恢复环境”的问题_windows10恢复环境修复方法

    首先启用恢复环境,若失败则修复BCD引导配置,最后检查并恢复Winre.wim文件以解决“找不到恢复环境”问题。 如果您尝试在Windows 10系统中使用“重置此电脑”或“高级启动”功能,但收到“找不到恢复环境”的提示,则可能是由于恢复环境被禁用、引导配置错误或核心文件丢失。以下是解决此问题的步骤…

    2026年9月21日
    200
  • PostgreSQL地理位置数据按距离排序的最佳实践:数据库层优化策略

    在处理大量地理位置数据并按距离排序时,将排序逻辑下推至数据库层(如postgresql)是更优的选择。这种方法能有效减少应用层的数据传输和内存消耗,充分利用数据库的计算能力,从而提升整体性能和资源利用率,而非在spring boot应用服务层进行排序。 1. 地理位置排序的需求与挑战 在现代Web应…

    2026年9月21日
    100
  • win11系统搜索索引损坏导致搜索缓慢怎么办_Win11搜索索引损坏修复方法

    首先运行搜索和索引疑难解答,然后重启Windows搜索服务;若问题依旧,需重建搜索索引数据库并重置Windows搜索应用组件,最后使用SFC和DISM命令修复系统文件,以彻底解决Windows 11搜索功能响应缓慢或结果不完整的问题。 如果您尝试在Windows 11中使用搜索功能,但发现响应缓慢或…

    2026年9月21日
    000
  • Flyway配置中安全使用环境变量的实践指南

    flyway配置中直接暴露数据库连接参数存在安全隐患。本文详细阐述了如何通过命令行参数和api调用两种主要方式,将环境变量安全地集成到flyway配置流程中。通过外部化管理敏感信息,可以有效提升数据库迁移配置的安全性、灵活性和可维护性,避免将凭证硬编码到配置文件中。 在数据库迁移实践中,将敏感的数据…

    2026年9月21日
    100
  • UC浏览器自带的截图功能快捷键是什么 UC浏览器内置截图快捷键使用说明

    首先通过快捷键或图标触发截图,再选择区域完成截取。UC浏览器支持三种方式:1. 使用Ctrl+Shift+X(Windows)或Command+Shift+X(Mac)快捷键截图;2. 点击地址栏右侧剪刀图标进行全屏、可见区域或自定义截图;3. 在设置中启用手势控制,使用三指下滑手势快速截图。所有截…

    2026年9月21日
    000
  • Java OOP如何使用内部类提高代码组织性

    内部类提升Java代码组织性与封装性,成员内部类增强封装,静态内部类分离逻辑,局部与匿名内部类简化回调,私有内部类隐藏实现细节。 内部类在Java面向对象编程中是一种有效提升代码组织性和封装性的工具。通过将一个类定义在另一个类的内部,可以更好地表达类之间的逻辑关系,控制访问权限,并减少命名冲突。合理…

    2026年9月21日
    000
  • 漫番漫画官方网页_ 漫番漫画在线访问入口

    漫番漫画官方网页入口为https://manwa.me,该平台汇聚多类型漫画资源,界面简洁、更新稳定,支持网页端流畅阅读;采用动态域名与镜像站点保障访问连续性,配备HTTPS加密提升安全性;提供个性化阅读设置、书架收藏及评论互动功能,优化用户体验。 漫番漫画官方网页入口地址在哪里?这是不少网友都关注…

    2026年9月21日
    200
  • Java集合框架在数据处理中的应用实例

    使用Set去重:通过LinkedHashSet去除标签重复并保持顺序;2. Map统计频次:利用HashMap统计单词出现次数;3. List结合Comparator排序:按年龄升序、姓名降序排列用户;4. 集合嵌套处理数据:用Map组织部门与员工列表。集合框架提升数据处理效率与代码可读性。 Jav…

    2026年9月21日
    000
  • Chrome浏览器怎么开启数据同步功能_Chrome浏览器跨设备数据同步设置教程

    首先登录Google账户启用Chrome同步功能,确保书签、历史记录、密码等数据跨设备一致;接着在设置中自定义同步内容类型以满足隐私需求;然后通过Google账户密钥或自定义密码加密同步数据,提升安全性;最后在新设备登录同一账户,自动接收已同步的浏览数据,实现无缝体验。 如果您希望在不同设备间无缝使…

    2026年9月21日
    000
  • 如何为iPhone12Pro刷机固件下载?一步步教你操作

    首先使用爱思助手一键下载适用于iPhone 12 Pro的iOS 18固件,若失败则手动导入IPSW文件,最后可通过恢复模式配合电脑工具强制刷机完成系统重装。 如果您尝试为您的设备重新安装操作系统,但无法获取正确的系统文件,则可能是由于固件下载路径不正确或工具不支持。以下是解决此问题的步骤: 本文运…

    2026年9月21日
    000
  • 如何使用XGBoost训练AI大模型?优化机器学习模型的步骤

    XGBoost并非用于训练GPT类大模型,而是擅长处理结构化数据的高效梯度提升算法,其优势在于速度快、准确性高、支持并行计算、内置正则化与缺失值处理,适用于表格数据建模;通过分阶段超参数调优(如学习率、树深度、采样策略)、结合贝叶斯优化与交叉验证,并配合特征工程、数据预处理和集成学习等关键步骤,可显…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信