如何实现随机选取数组元素时不重复上一次选中项?
实现连续不重复的随机字母选取需求
我需要从如下数组中随机选取字母:
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
相关产品推荐
相关产品推荐

