Как выполнить функцию, только если флажки сняты? - PullRequest
1 голос
/ 05 ноября 2019

Я работаю над маленькой игрой в кости, где пользователь может заблокировать конкретный кубик. Но я не могу заставить его работать с другими заявлениями. Как «бросить» кости только в том случае, если флажки сняты?

const btnRoll = document.querySelector('.btn_roll');

btnRoll.addEventListener('click', () => {
  roll();
});

function roll() {
  const dice1 = document.querySelector('.dice1');
  const dice2 = document.querySelector('.dice2');
  const dice3 = document.querySelector('.dice3');

  if (!document.getElementById('dice-1').checked) {
    randomOne = Math.floor(Math.random() * 6) + 1;
    dice1.src = `img/dice-${randomOne}.png`;
    console.log(!document.getElementById('dice-1').checked);
  } else if (!document.getElementById('dice-2').checked) {
    randomTwo = Math.floor(Math.random() * 6) + 1;
    dice2.src = `img/dice-${randomTwo}.png`;
  } else if (!document.getElementById('dice-3').checked) {
    randomThree = Math.floor(Math.random() * 6) + 1;
    dice3.src = `img/dice-${randomThree}.png`;
  } else {
    console.log('no checkboxes are selected');
  }
}
<form id="dices">
  <input type="checkbox" id="dice-1" name="dice-1" value="dice-1" />
  <img src="img/dice-5.png" alt="Dice" class="dice1" id="dice-1" />
  <input type="checkbox" id="dice-2" name="dice-2" value="dice-2" />
  <img src="img/dice-5.png" alt="Dice" class="dice2" id="dice-2" />
  <input type="checkbox" id="dice-3" name="dice-3" value="dice-3" />
  <img src="img/dice-5.png" alt="Dice" class="dice3" id="dice-3" />
  <input type="checkbox" id="dice-4" name="dice-4" value="dice-4" /> 5.png" alt="Dice" class="dice6" id="dice-6" />
</form>
<br />
<button class="btn_roll">roll</button>

Ответы [ 3 ]

2 голосов
/ 05 ноября 2019

Вы используете операторы "else-if", которые эффективно закорачивают вашу логику при выполнении одного из них. Замените «else-if» на «if»: только s.

(я заменил последнее выражение «else» на «if», которое является отрицанием других операторов if, поскольку мыздесь я не могу.)


function roll() {
  const dice1 = document.querySelector('.dice1');
  const dice2 = document.querySelector('.dice2');
  const dice3 = document.querySelector('.dice3');

  const firstDiceChecked = document.getElementById('dice-1').checked
  const secondDiceChecked = document.getElementById('dice-2').checked
  const thirdDiceChecked = document.getElementById('dice-3').checked

  if (!firstDiceChecked) {
    randomOne = Math.floor(Math.random() * 6) + 1;
    dice1.src = `img/dice-${randomOne}.png`;
    console.log(!document.getElementById('dice-1').checked);
  }
  if (!secondDiceChecked) {
    randomTwo = Math.floor(Math.random() * 6) + 1;
    dice2.src = `img/dice-${randomTwo}.png`;
  }
  if (!thirdDiceChecked) {
    randomThree = Math.floor(Math.random() * 6) + 1;
    dice3.src = `img/dice-${randomThree}.png`;
  } 
  if (!firstDiceChecked && !secondDiceChecked && !thirdDiceChecked) {
    console.log('no checkboxes are selected');
  }
}
0 голосов
/ 05 ноября 2019

Я бы использовал div с фоновым изображением вместо замены src реального объекта изображения.

Вы можете упростить это с помощью цикла и нацеливания на родительский элемент флажка, чтобы получить изображение матрицы.

document.querySelector('.btn-roll').addEventListener('click', rollDice);

function rollDice(e) {
  let checked = document.querySelectorAll('#dice .die-wrapper input:checked');
  Array.from(checked).forEach(cb => {
    let die = cb.parentElement.querySelector('.die');
    let roll = getRandomIntInclusive(1, 6);
    die.className = 'die die-' + roll;
    die.setAttribute('data-roll', roll);
  });
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive
function getRandomIntInclusive(min, max) {
  if (arguments.length === 1) { max = min; min = 0; }
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
.die-wrapper {
  display: inline-block;
}

.die {
  display: inline-block;
  width: 32px;
  height: 32px;
  background-position: center;
  background-repeat: no-repeat;
}

.die-1 { background-image: url('https://place-hold.it/32x32/f00/000.png&bold&text=1'); }
.die-2 { background-image: url('https://place-hold.it/32x32/f00/000.png&bold&text=2'); }
.die-3 { background-image: url('https://place-hold.it/32x32/f00/000.png&bold&text=3'); }
.die-4 { background-image: url('https://place-hold.it/32x32/f00/000.png&bold&text=4'); }
.die-5 { background-image: url('https://place-hold.it/32x32/f00/000.png&bold&text=5'); }
.die-6 { background-image: url('https://place-hold.it/32x32/f00/000.png&bold&text=6'); }
<form id="dice">
  <div class="die-wrapper">
    <input type="checkbox" name="die-1" value="dice-1" />
    <div class="die die-1"></div>
  </div>
  <div class="die-wrapper">
    <input type="checkbox" name="die-2" value="dice-2" />
    <div class="die die-1"></div>
  </div>
  <div class="die-wrapper">
    <input type="checkbox" name="die-3" value="dice-3" />
    <div class="die die-1"></div>
  </div>
</form>
<br />
<button class="btn-roll">Roll</button>

Использование символов Unicode для отображения граней матрицы ...

document.querySelector('.btn-roll').addEventListener('click', rollDice);

function rollDice(e) {
  let checked = document.querySelectorAll('#dice .die-wrapper input:checked');
  Array.from(checked).forEach(cb => {
    let die = cb.parentElement.querySelector('.die');
    let roll = getRandomIntInclusive(1, 6);
    die.className = 'die die-' + roll;
    die.setAttribute('data-roll', roll);
  });
}

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive
function getRandomIntInclusive(min, max) {
  if (arguments.length === 1) {
    max = min;
    min = 0;
  }
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
.die-wrapper {
  display: inline-block;
}

.die {
  display: inline-block;
  height: 2em;
}

.die::after {
  font-size: 3em;
  line-height: 0.75em;
}

.die-1::after { content: '\2680'; }
.die-2::after { content: '\2681'; }
.die-3::after { content: '\2682'; }
.die-4::after { content: '\2683'; }
.die-5::after { content: '\2684'; }
.die-6::after { content: '\2685'; }
<form id="dice">
  <div class="die-wrapper">
    <input type="checkbox" name="die-1" value="dice-1" />
    <div class="die die-1"></div>
  </div>
  <div class="die-wrapper">
    <input type="checkbox" name="die-2" value="dice-2" />
    <div class="die die-1"></div>
  </div>
  <div class="die-wrapper">
    <input type="checkbox" name="die-3" value="dice-3" />
    <div class="die die-1"></div>
  </div>
</form>
<br />
<button class="btn-roll">Roll</button>
0 голосов
/ 05 ноября 2019
const checkboxes = [
document.getElementById("dice-1")
document.getElementById("dice-2")
document.getElementById("dice-3")
document.getElementById("dice-4")
document.getElementById("dice-5")
];

let allChecked = true;
for (const checkbox of checkboxes) {
if (!checkbox.checked) allChecked = false;
}

if (allChecked) {
roll();
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...