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

如何实现随机选取数组元素时不重复上一次选中项?

实现连续不重复的随机字母选取需求

我需要从如下数组中随机选取字母:

const letters = [
  "W",
  "A",
  "S",
  "D"
]

需求为:当随机选中一个字母(例如D)后,下一次选取不能重复该字母,只能选择其余选项,但该限制仅针对连续选取,并非永久生效。我已设置变量lastIndex记录上一次选中的字母,请问如何实现下一次随机选取的字母不等于lastIndex?以下是我的初始代码及修改后的版本:

初始代码

const RandomLetterGUI = document.getElementById("RandomLetters")
const TimerGUI = document.getElementById("Timer")
const LivesGUI = document.getElementById("Lives")
const ScoreGUI = document.getElementById("Score")
const letters = [
  "W",
  "A",
  "S",
  "D"
]
var seconds = 60;
var lives = 3;
var score = 0;
var timerId = setInterval(countdown, 1000);
var gameIsPlaying = true;
function countdown() {
  if (lives == 0) {
    clearTimeout(timerId);
  }
  if (seconds == -1) {
    clearTimeout(timerId);
    gameIsPlaying = false
  } else {
    if (seconds > 9) {
      TimerGUI.innerHTML = ':' + seconds;
    } else {
      TimerGUI.innerHTML = ':0' + seconds;
    }
    seconds--;
  }
}
countdown()
setInterval(displayLives, 0)
setInterval(updateScore, 0)
function updateScore() {
  ScoreGUI.innerHTML = "Score: " + score
}
function displayLives() {
  LivesGUI.innerHTML = "Remaining Lives: " + lives
  if (lives == 0) {
    gameIsPlaying = false
  }
}

var lastIndex
function letter() {
  var item = letters[Math.floor(Math.random() * letters.length)];
  console.log(item, lastIndex)
  if (lastIndex != item) {
    RandomLetterGUI.innerHTML = "Next Letter: " + item
  } else {
    letter()
  }
  document.onkeypress = function (e) {
    if (gameIsPlaying) {
      var key = e.key
      if (key.toUpperCase() != item) {
        lives -= 1;
      } else {
        lastIndex = item
        score += 150;
        letter()
      }
    }
  };
}
letter()

修改后的代码(基于LawrenceCherone的建议)

const RandomLetterGUI = document.getElementById("RandomLetters")
const TimerGUI = document.getElementById("Timer")
const LivesGUI = document.getElementById("Lives")
const ScoreGUI = document.getElementById("Score")
var seconds = 60;
const letters = [
  "W",
  "A",
  "S",
  "D"
]
var lives = 3;
var score = 0;
var timerId = setInterval(countdown, 1000);
var gameIsPlaying = true;
function countdown() {
  if (lives == 0) {
    clearTimeout(timerId);
  }
  if (seconds == -1) {
    clearTimeout(timerId);
    gameIsPlaying = false
  } else {
    if (seconds > 9) {
      TimerGUI.innerHTML = ':' + seconds;
    } else {
      TimerGUI.innerHTML = ':0' + seconds;
    }
    seconds--;
  }
}
countdown()
setInterval(displayLives, 0)
setInterval(updateScore, 0)
function updateScore() {
  ScoreGUI.innerHTML = "Score: " + score
}
function displayLives() {
  LivesGUI.innerHTML = "Remaining Lives: " + lives
  if (lives == 0) {
    gameIsPlaying = false
  }
}
function letterFactory(letters) {
  let live = []

  const refill = () => {
    live = [...letters]
    for (let i = live.length - 1; i > 0; i--) {
      const j = Math.floor(Math.random() * (i + 1));
      const temp = live[i];
      live[i] = live[j];
      live[j] = temp;
    }
  }

  return () => {
    if (!live.length) refill()
    
    return live.shift()
  }
}
function letter() {
  console.log(item, lastIndex)
  RandomLetterGUI.innerHTML = "Next Letter: " + letterFactory(letters)
  document.onkeypress = function (e) {
    if (gameIsPlaying) {
      var key = e.key
      if (key.toUpperCase() != item) {
        lives -= 1;
      } else {
        lastIndex = item
        score += 150;
        letter()
      }
    }
  };
}
letter()

内容的提问来源于stack exchange,提问作者gamer merch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:10:33