Created
June 20, 2022 01:58
-
-
Save ro31337/bc7b24357b8646f29c778ccad4391fff to your computer and use it in GitHub Desktop.
Slot machine app
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'hidapi' | |
@coin_acceptor = HIDAPI::open(0x0079, 0x0006) | |
@coin_dispenser = HIDAPI::open(0x14d4, 0x0000) | |
# Ожидание монеты | |
def wait_for_coin | |
loop do | |
packet = @coin_acceptor.read | |
confidence = packet[2].unpack('H*')[0][0].to_i | |
cmd = packet[6].unpack('H*')[0] | |
if cmd == '20' && confidence > 5 | |
return | |
end | |
sleep 0.05 | |
end | |
end | |
# Выдача монет | |
def dispence_coins(cnt) | |
return if cnt.zero? | |
x = cnt / 2 | |
y = cnt - x | |
# Случайно меняем первый, последний столбец для нормального распределения выдачи: | |
# чтобы если число нечетное, то бремя не ложилось на один из столбцов | |
x, y = y, x if [true, false].sample | |
# reset | |
@coin_dispenser.write 0x01, 0x04, 0x50, 0x72, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
sleep 0.1 | |
# dispense | |
@coin_dispenser.write 0x01, 0x04, 0x50, 0x02, 0x30 + x, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 + y, 0x03, 0x02, 0x00, 0x00, 0x00 | |
sleep 1 | |
end | |
# Крутим барабан | |
def roll | |
puts "Крутим барабан..." | |
speed_a = 1.to_f/rand(1..20) | |
speed_b = 1.to_f/rand(1..20) | |
speed_c = 1.to_f/rand(1..20) | |
a, b, c = 0.to_f, 0.to_f, 0.to_f | |
time = rand(50..150) | |
loop do | |
break if time < 0 | |
a += speed_a | |
b += speed_b | |
c += speed_c | |
print "#{a.to_i % 10} #{b.to_i % 10} #{c.to_i % 10} \r" | |
sleep 0.02 | |
time -= 1 | |
end | |
[a.to_i % 10, b.to_i % 10, c.to_i % 10] | |
end | |
# Размер выигрыша в четвертаках от 0 до 9 | |
# Экспериментальным путём установлено мат.ожидание выигрыша в районе 0.45 | |
def get_prize(a, b, c) | |
if a == b && b == c && a != 0 | |
# Если всё равно, то просто возвращаем значение | |
# За исключением нуля | |
puts "*** Все числа равны ***" | |
return 3 | |
end | |
if a == b && a > 3 | |
puts "*** Два левых равны и больше 3 ***" | |
return 2 | |
end | |
if b == c && b > 4 | |
puts "*** Два правых равны и больше 4 ***" | |
return 2 | |
end | |
0 | |
end | |
puts "*" * 80 | |
puts " " * 20 + "О Д Н О Р У К И Й Б А Н Д И Т" | |
puts "*" * 80 | |
puts | |
puts "Опустите монету..." | |
win_cnt = 0 | |
lose_cnt = 0 | |
win_size = 0 | |
lose_size = 0 | |
loop do | |
wait_for_coin | |
puts "Монета опущена" | |
a, b, c = roll | |
puts | |
prize = get_prize(a, b, c) | |
if prize == 0 | |
lose_cnt += 1 | |
lose_size += 1 | |
puts "Несчастливая комбинация" | |
else | |
puts "Ура! " * 10 | |
puts "Получите #{prize} мон." | |
win_size += prize | |
win_cnt += 1 | |
dispence_coins(prize) | |
end | |
#puts "Мат.ожидание (выигрыш к проигрышу) #{(win_size.to_f / lose_size.to_f)}" | |
#puts "Попытки (выигрыш к проигрышу) #{(win_cnt.to_f / lose_cnt.to_f)}" | |
puts "Опустите ещё одну монету..." | |
puts | |
puts "===" | |
puts | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I can’t even imagine how much people earn from them. The main thing is that everything is legal.