Игровой автомат JavaScript: какой простой алгоритм для выбора победителя?

Я разрабатываю игровой автомат на JavaScript, и этот игровой автомат имеет 3 барабана.

Каждый барабан идентичен и содержит 4 символа: бар, 7, колокольчик и виноград. Полоса отображается на барабане один раз, семерка — два раза, колокольчик — три раза, а виноград — четыре раза — всего 10 символов на барабан. И каждому символу соответствует число от 0 до 9:

| bar | -> 9
|  7  | -> 8 
|  7  | -> 7
| bell| -> 6
| bell| -> 5
| bell| -> 4
|grape| -> 3
|grape| -> 2
|grape| -> 1
|grape| -> 0

Затем я случайным образом генерирую число от 0 до 999, и на основе этого числа я хотел бы потенциально выбрать победителя. Например, если число 999, то это три полоски и первый джекпот, если число 210, то это три виноградины и четвертый джекпот. Если число 359, это виноград/колокол/батончик, а не джекпот.

Я создал if/else для выбора победителя, но понял, что он не учитывает вторую выигрышную ситуацию 210:

if (number == 999) {
    // Jackpot 1
} else if (number == 888) {
    // Jackpot 2
} else if (number == 777) {
    // Jackpot 2
} else if (number == 666) {
    // Jackpot 3
} else if (number == 555) {
    // Jackpot 3
} else if (number == 444) {
    // Jackpot 3
} else if (number == 333) {
    // Jackpot 4
} else if (number == 222) {
    // Jackpot 4
} else if (number == 111) {
    // Jackpot 4
} else if (number == 0) {
    // Jackpot 4
} else {
    // No jackpot
}

Есть ли у кого-нибудь идеи о том, как я мог бы разработать простой алгоритм для выбора победителя, в отличие от кучи if/else? Кроме того, на каждом барабане должно быть в общей сложности 10 возможных исходов, поскольку вероятность главного джекпота должна составлять 10 ^ 3 => 1 из 1000.

Вы можете использовать интервалы вместо констант, и у вас есть 4 символа, а не 3, как вы упомянули.

aydinugur 28.05.2019 08:48

Спасибо, что указали на это, только что отредактировал.

Steve 28.05.2019 09:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
1 247
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Создайте массив массивов.

[[9], [7,8], [4,5,6] ,[0,1,2,3]]

Затем преобразуйте число в String и используйте every() и includes()

Рабочий фрагмент:

function play(num){
  let number = num || Math.floor(Math.random() * 899) + 100;
  console.info(`Random Number: ${number}`)
  number = number.toString().split('')
  let arr = [[0,1,2,3],[4,5,6],[7,8],[9]];
  
  let jackpot = arr.findIndex(x => number.every(a => x.includes(+a))) + 1
  console.info(`jackpot:${jackpot}`)
  
}
play(999)
play(123)
play(446)
play(129)
<button onclick = "play()">click</button>
Ответ принят как подходящий

Я думаю, что выполнение арифметических операций с числовой таблицей поиска будет наиболее эффективным:

function isJackPot(number) {
    const symbols = [4,4,4,4,3,3,3,2,2,1];
    const winner = symbols[number % 10]; // get symbol for rightmost digit
    for (let i = 0; i < 2; i++) {
        number = Math.floor(number/10); // shift digits to get next symbol
        if (symbols[number % 10] !== winner) return 0; // bail out when not the same
    }
    return winner;
}

const tests = [999, 210, 359];
for (const test of tests) {
    console.info(`${test} gives jackpot ${isJackPot(test)}`);
}

NB: возвращаемое значение 0 означает, что джекпота нет. Любое другое число (1..4) обозначает вид джекпота.

Спасибо. Здесь есть несколько отличных решений, но это мне нравится больше всего.

Steve 31.05.2019 14:33

Вы можете проверить приведенный ниже код, также используя простой JavaScript, который работает для всех браузеров.

function checkJackpot(digit) {
    var jackpot = {
        "9": "1",
        "8": "2",
        "7": "2",
        "6": "3",
        "5": "3",
        "4": "3",
        "3": "4",
        "2": "4",
        "1": "4",
        "0": "4"
    }
    var number = digit.toString().split('');
    var count = [];
    for (var i = 0; i < number.length; i++) {
        var j = jackpot[number[i]]
        if (count.indexOf(j) == -1)
            count.push(jackpot[number[i]])
    }
    if (count.length == 1) {
        alert("Jackpot " + count[0])

    } else {
        alert("No jackpot")
    }
}
checkJackpot(219)
checkJackpot(999)
checkJackpot(110)

Другие вопросы по теме