You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript开发石头剪刀布时如何将指定字符串转为对应数字

石头剪刀布:字符串选项转数字简洁实现方案

核心需求

  • 课程作业要求禁止使用自定义函数,开发石头剪刀布游戏
  • 需将用户输入的userChoice字符串值按规则映射为数字:
    • rock 对应 0
    • paper 对应 1
    • scissors 对应 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写法存在两个明显错误:

  1. 判断相等应该用==/===,代码里写的=是赋值运算符,会直接修改变量值,导致判断逻辑失效
  2. 所有分支的判断条件都写的是匹配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:33:22