
在学习j*ascript并尝试构建一个简单的“剪刀石头布”游戏时,开发者常常会利用confirm和prompt等浏览器内置函数与用户进行交互。然而,这些函数在特定场景下的行为特性,如果处理不当,可能会导致一些意料之外的问题。本教程将针对两个常见问题进行深入分析和修复,以帮助您构建一个更健壮、更完整的游戏。
原始代码在用户点击prompt对话框的“确定”按钮但未输入任何内容时,以及点击“取消”按钮时,都未能正确地引导用户或处理输入。具体表现为:
问题分析:
prompt函数在不同操作下的返回值有所不同:
在J*aScript中,null和空字符串 "" 都被认为是“假值”(falsy values)。因此,原始代码中的 if (startgame) 条件在用户点击“确定”但未输入,或者点击“取消”时,都会被评估为 false,导致逻辑分支未能按预期执行。
解决方案:
我们需要区分用户是点击了“取消”还是点击了“确定”但输入为空。
我们可以通过检查 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("下次再玩吧!");
}注意事项:
原始代码在判断游戏结果时,只覆盖了平局和部分玩家获胜的情况,导致许多对战组合未能正确判定胜负,有时甚至需要重复输入才能看到结果。
Picit AI
免费AI图片编辑器、滤镜与设计工具
172
查看详情
问题分析:
剪刀石头布游戏有九种可能的对战组合(玩家出拳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");
}
// ... (接问题一的输入处理代码)代码修正说明:
将上述两部分的修复合并,可以得到一个更完善的剪刀石头布游戏代码:
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
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。