JavaScript开发石头剪刀布时如何将指定字符串转为对应数字
石头剪刀布:字符串选项转数字简洁实现方案
核心需求
- 课程作业要求禁止使用自定义函数,开发石头剪刀布游戏
- 需将用户输入的
userChoice字符串值按规则映射为数字:rock对应 0paper对应 1scissors对应 2
- 避免多层if else判断的冗余写法
问题代码片段
const options = [`rock`, `paper`, `scissors`]; alert (`Let's play Rock, Paper, Scissors!`); let userChoice = prompt (`Please enter your choice (rock, paper, or scissors`); let compChoice = Math.floor((Math.random() * 3)); let inputValid = null if ((userChoice == `rock`) || (userChoice == `paper`) || (userChoice == `scissors`)) { inputValid = true } else { inputValid = false } let dialogChoice = (`You chose ${userChoice}! The computer chose ${compChoice}!`) let dialogUserWin = `User wins!` let dialogCompWin = `Computer wins!` let dialogTie = `It's a tie!` let dialogReplay = `Press F5 to play again` console.log(compChoice) // 原计划的冗余if else写法(存在逻辑错误) if (userChoice = `rock`) { userChoice = 0 } else if (userChoice = `rock`) { userChoice = 1 } else if (userChoice = `rock`) { userChoice = 2 }
原if else写法存在两个明显错误:
- 判断相等应该用
==/===,代码里写的=是赋值运算符,会直接修改变量值,导致判断逻辑失效- 所有分支的判断条件都写的是匹配
rock,没有处理paper和scissors的分支,逻辑完全错误
简洁实现方案
你在代码开头已经定义了顺序和映射规则完全一致的options数组,数组元素的天然下标就是你需要的0/1/2,直接调用JS数组原生的indexOf()方法即可一行完成转换,不需要自定义函数,也不需要多层判断,完全符合作业要求:
// 先做输入合法性校验 let inputValid = options.includes(userChoice); if (inputValid) { // 直接取选项在数组中的下标,就是对应要转的数字 userChoice = options.indexOf(userChoice); }
可选优化点
- 电脑出拳的逻辑可以和
options数组联动,避免硬编码数字,后续调整选项时不需要改多处代码:let compChoice = Math.floor(Math.random() * options.length); // 展示结果时如果要显示电脑出的字符串,直接取 options[compChoice] 即可 - 原来的输入校验逻辑不需要写长串的或判断,直接用数组的
includes()方法就能判断用户输入是否在合法选项范围内,代码更短也不容易写错。
内容的提问来源于stack exchange,提问作者Wrenly
相关产品推荐
相关产品推荐

