Я разрабатываю игровой автомат на 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.
Спасибо, что указали на это, только что отредактировал.
Создайте массив массивов.
[[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) обозначает вид джекпота.
Спасибо. Здесь есть несколько отличных решений, но это мне нравится больше всего.
Вы можете проверить приведенный ниже код, также используя простой 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)
Вы можете использовать интервалы вместо констант, и у вас есть 4 символа, а не 3, как вы упомянули.