如何修复我的 JS 老虎机 - 复选框错误

How can I fix my JS slot machine - checkbox error

所以我想制作一个老虎机游戏,当用户按下数字复选框时,他将玩数字,如果他按下图像按钮,他将玩图像。但是当我选择数字和图像之后,当我回到数字之后,游戏仍然是图像。我怎样才能解决这个问题。你可以在这里看到一个演示:

const card = document.querySelectorAll('.card');
const button = document.querySelector('.button');
const message = document.querySelector('.message');
const checkboxes = document.querySelectorAll('.check');
const numbers = document.querySelector('#numbers');
const images = document.querySelector('#images');

numbers.addEventListener('change', function (){
    button.addEventListener('click', randomNumbers);


  });

images.addEventListener('change', function (){
  button.addEventListener('click', randomNumbers2);

  });



function randomNumbers() {

    let arr = [];
    for (number of card){
        let random = Math.floor(Math.random() * 3);
        number.innerHTML = random;
        arr.push(number.textContent);   
    }
    //transforming the array into array of card
    let arr2 = arr.map(function(num) {
        return parseInt(num, 10);
      });
   
    const allEqual = arr => arr.every( num => num === arr[0] )
    if(allEqual(arr2)){
        result = message.innerHTML = "YOU WON!";
        message.classList.remove("lost");
        message.classList.add("won"); 
    }else{
        result = message.innerHTML = "YOU LOST!";
        message.classList.add("lost");
        message.classList.remove("won");
    }
    
}




function randomNumbers2() {

  let arr3 = [];

  for (number of card){

    let img_arr = ['https://img1.looper.com/img/gallery/captain-americas-mcu-story-explained/intro-1566320977.jpg', 'https://i.imgur.com/2QFZ9Ld.jpg', 'https://images.alphacoders.com/102/thumb-1920-1026220.jpg']
   
    let random = Math.floor(Math.random() * 3);
    let img =  '<img src="' +img_arr[random] + '" alt = "">';
    number.innerHTML = img
    arr3.push(number.innerHTML);   
    

}
const allEqual = arr => arr.every( num => num === arr[0] )
    if(allEqual(arr3)){
        result = message.innerHTML = "YOU WON!";
        message.classList.remove("lost");
        message.classList.add("won"); 
    }else{
        result = message.innerHTML = "YOU LOST!";
        message.classList.add("lost");
        message.classList.remove("won");
    }
    
  
}
checkboxes.forEach(input => { 
  input.addEventListener('click',function (){
    for(var i = 0; i < checkboxes.length; i++){
      //uncheck all
      if(checkboxes[i].checked == true){
        checkboxes[i].checked = false;
      }
    }
    //set checked of clicked object
    if(input.checked == true){
      input.checked = false;
    }else{
      input.checked = true;
    } 
  })
})
.container{
    width: 60%;
    height: 100%;
    margin: 0 auto;
}
.card{
    width: 5rem;
    height: 5rem;
    border: 1px solid rgb(206, 21, 21);
    text-align: center;
    margin-right: 5px;
    font-size: 2rem;
    border-radius: 10px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 3rem;
}
.board{
    display: flex;
    justify-content: center;
    align-items: center;
}

.board button {
    padding: 20px;
    border: none;
    background-color: rgb(0, 162, 255);
    color: whitesmoke;
    cursor: pointer;
}

.message{
    text-align: center;
    top: 20%;
}

.lost{
    color: red;
}

.won{
    color: green;
}

form{
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 5px;
}

form  label{
    margin-right: 15px;
}

img{
    width: 5rem;
    height: 5rem;
    border-radius: 10px;
}
    <div class="container">
      <form>
          <label>
            <input class="check" id="numbers" type="checkbox" >    Numbers
          </label>
          <label>
            <input class="check" id="images" type="checkbox" > Images
          </label>
      
      </form>  
        <div class="board">
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <button class="button">Play</button>
        </div>
        <h1 class="message"></h1>
    </div>  

addEventListener() 不会删除(或替换)元素上的现有事件处理程序。您可以修改按钮的 onClick 属性而不是使用 addEventListener()(只能有一个 onClick),或者您可以在添加另一个之前删除按钮的现有事件侦听器。下面的代码使用第二种方法。

我还将复选框更改为单选按钮,因为一次只能选择一个选项。这消除了仅用于切换复选框的另一个事件处理程序的需要。

这只是对现有内容的轻微修改。理想情况下,您应该将一个事件处理程序附加到按钮,该事件处理程序将检查单选按钮的状态并调用图像或数字例程。 编辑:在下面添加了第二个示例

示例 1:在添加新事件侦听器之前删除事件侦听器

const card = document.querySelectorAll('.card');
const button = document.querySelector('.button');
const message = document.querySelector('.message');
const numbers = document.querySelector('#numbers');
const images = document.querySelector('#images');

// Changed the two functions below
numbers.addEventListener('change', function (){
    if (numbers.checked) {
       button.removeEventListener('click', randomNumbers2);
       button.addEventListener('click', randomNumbers);
    }
 });
images.addEventListener('change', function (){
    if (images.checked) {
       button.removeEventListener('click', randomNumbers);
       button.addEventListener('click', randomNumbers2);
    }
});


function randomNumbers() {
    let arr = [];
    for (number of card){
        let random = Math.floor(Math.random() * 3);
        number.innerHTML = random;
        arr.push(number.textContent);   
    }
    //transforming the array into array of card
    let arr2 = arr.map(function(num) {
        return parseInt(num, 10);
      });
   
    const allEqual = arr => arr.every( num => num === arr[0] )
    if(allEqual(arr2)){
        result = message.innerHTML = "YOU WON!";
        message.classList.remove("lost");
        message.classList.add("won"); 
    }else{
        result = message.innerHTML = "YOU LOST!";
        message.classList.add("lost");
        message.classList.remove("won");
    }
    
}


function randomNumbers2() {
  let arr3 = [];

  for (number of card){
    let img_arr = ['https://img1.looper.com/img/gallery/captain-americas-mcu-story-explained/intro-1566320977.jpg', 'https://i.imgur.com/2QFZ9Ld.jpg', 'https://images.alphacoders.com/102/thumb-1920-1026220.jpg']
   
    let random = Math.floor(Math.random() * 3);
    let img =  '<img src="' +img_arr[random] + '" alt = "">';
    number.innerHTML = img
    arr3.push(number.innerHTML);   
}

const allEqual = arr => arr.every( num => num === arr[0] )
    if(allEqual(arr3)){
        result = message.innerHTML = "YOU WON!";
        message.classList.remove("lost");
        message.classList.add("won"); 
    }else{
        result = message.innerHTML = "YOU LOST!";
        message.classList.add("lost");
        message.classList.remove("won");
    }
}
.container{
    width: 60%;
    height: 100%;
    margin: 0 auto;
}
.card{
    width: 5rem;
    height: 5rem;
    border: 1px solid rgb(206, 21, 21);
    text-align: center;
    margin-right: 5px;
    font-size: 2rem;
    border-radius: 10px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 3rem;
}
.board{
    display: flex;
    justify-content: center;
    align-items: center;
}

.board button {
    padding: 20px;
    border: none;
    background-color: rgb(0, 162, 255);
    color: whitesmoke;
    cursor: pointer;
}

.message{
    text-align: center;
    top: 20%;
}

.lost{
    color: red;
}

.won{
    color: green;
}

form{
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 5px;
}

form  label{
    margin-right: 15px;
}

img{
    width: 5rem;
    height: 5rem;
    border-radius: 10px;
}
    <div class="container">
      <form>
          <label>
            <input class="check" id="numbers" type="radio" name="game">Numbers
          </label>
          <label>
            <input class="check" id="images" type="radio" name="game">Images
          </label>
      
      </form>  
        <div class="board">
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <button class="button">Play</button>
        </div>
        <h1 class="message"></h1>
    </div>  

示例2:为按钮添加点击事件并为单选按钮删除事件代码

const card = document.querySelectorAll('.card');
const button = document.querySelector('#play-button');
const message = document.querySelector('.message');
const checkboxes = document.querySelectorAll('.check');
const numbers = document.querySelector('#numbers');
const images = document.querySelector('#images');

// Changed the two functions below
button.addEventListener('click', function (e){
    // Prevent normal button click events
    e.preventDefault();

    if (numbers.checked) {
       randomNumbers();
    } else {
       randomNumbers2();
    }
 });


function randomNumbers() {
    let arr = [];
    for (number of card){
        let random = Math.floor(Math.random() * 3);
        number.innerHTML = random;
        arr.push(number.textContent);   
    }
    //transforming the array into array of card
    let arr2 = arr.map(function(num) {
        return parseInt(num, 10);
      });
   
    const allEqual = arr => arr.every( num => num === arr[0] )
    if(allEqual(arr2)){
        result = message.innerHTML = "YOU WON!";
        message.classList.remove("lost");
        message.classList.add("won"); 
    }else{
        result = message.innerHTML = "YOU LOST!";
        message.classList.add("lost");
        message.classList.remove("won");
    }
    
}


function randomNumbers2() {
  let arr3 = [];

  for (number of card){
    let img_arr = ['https://img1.looper.com/img/gallery/captain-americas-mcu-story-explained/intro-1566320977.jpg', 'https://i.imgur.com/2QFZ9Ld.jpg', 'https://images.alphacoders.com/102/thumb-1920-1026220.jpg']
   
    let random = Math.floor(Math.random() * 3);
    let img =  '<img src="' +img_arr[random] + '" alt = "">';
    number.innerHTML = img
    arr3.push(number.innerHTML);   
}

const allEqual = arr => arr.every( num => num === arr[0] )
    if(allEqual(arr3)){
        result = message.innerHTML = "YOU WON!";
        message.classList.remove("lost");
        message.classList.add("won"); 
    }else{
        result = message.innerHTML = "YOU LOST!";
        message.classList.add("lost");
        message.classList.remove("won");
    }
}
.container{
    width: 60%;
    height: 100%;
    margin: 0 auto;
}
.card{
    width: 5rem;
    height: 5rem;
    border: 1px solid rgb(206, 21, 21);
    text-align: center;
    margin-right: 5px;
    font-size: 2rem;
    border-radius: 10px;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 3rem;
}
.board{
    display: flex;
    justify-content: center;
    align-items: center;
}

.board button {
    padding: 20px;
    border: none;
    background-color: rgb(0, 162, 255);
    color: whitesmoke;
    cursor: pointer;
}

.message{
    text-align: center;
    top: 20%;
}

.lost{
    color: red;
}

.won{
    color: green;
}

form{
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 5px;
}

form  label{
    margin-right: 15px;
}

img{
    width: 5rem;
    height: 5rem;
    border-radius: 10px;
}
    <div class="container">
      <form>
          <label>
            <input class="check" id="numbers" type="radio" name="game">Numbers
          </label>
          <label>
            <input class="check" id="images" type="radio" name="game">Images
          </label>
      
      </form>  
        <div class="board">
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <button class="button" id="play-button">Play</button>
        </div>
        <h1 class="message"></h1>
    </div>