Skip to content

Instantly share code, notes, and snippets.

@ro31337
Created June 20, 2022 01:58
Show Gist options
  • Save ro31337/bc7b24357b8646f29c778ccad4391fff to your computer and use it in GitHub Desktop.
Save ro31337/bc7b24357b8646f29c778ccad4391fff to your computer and use it in GitHub Desktop.
Slot machine app
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