色々な実行基盤での実行効率やスピード(メモリー消費量や処理速度)を調べています。
(例えば、JSの実行環境としては、Googleクラウドが最速と言われておりますね。)
そんな訳なので、Java、Python,JS,R等で色々と負荷の掛かるプログラムを作って、パフォーマンス分析をしております。
そんな作業の一環として、スロットマシンゲームを作りました。
尚、このサイトを大いに参考にしました。
https://camp.trainocate.co.jp/magazine/java-game/
下記のリールが3列あるスロットです。
REEL_MARK_LIST = ('7', 'BAR', '🍒', '🍎', 'Reply','♢','♢', 'Reply', '🍎','Reply','♢','Reply','🍎')
1ゲームが、1枚ずつのBetです。
777が大当たりで、120枚のコイン払出。BAR並びなら30枚払出とかです。
尚、1リールは、13個絵柄があるので、トリプル7が揃う確率は、1/13**3=1/2197 となります。
これを、自分で何枚のコインで勝負するか? を決めて、コインがなくなるまで回すと言うゲームです。
下記では、1万コインを投入しております。(名前は入れても入れなくても結構です。)
naive@naive_jp-mac code %
naive@naive_jp-mac code % python game777.py
購入コイン数を入力して下さい: 10000
--------------
スロットゲーム
--------------
あなたの名前を入力して下さい[空白OKです。] → 哀しみの貴公子
でプレーをしています。
下記にコードが書いてありますが、コインがゼロになるまで、永遠にリールを回します。
結果はこれ!
<前略>
----------------------------------
ゲームプレイ数は、2358です。
----------------------------------
===================
1) 777当選回数は、1回目です。
2) BAR当選回数は、2回目です。
===================
ゲームオーバーです
さようなら 哀しみの貴公子 さん
naive@naive_jp-mac code %
つまり、コイン1000枚で、2358ゲームを消化して、777当たりは1回、BAR当たりは2回あったことが分かります。
尚、2358ゲームに掛かる時間は、コンマ秒以下です。
下記に、pythonコードを載せますね。
このまま動きます。
"""スロットゲーム
簡単なスロットゲームです。ゲームスタート時に保有しているコインを増やしましょう。
掛けコイン数を入力すると、スロットの結果が表示されます。
絵柄が揃うと、そのパターンに応じた配当倍率でコインを獲得することができます。
"""
import random # "乱数" を生成するために必要なライブラリをメモリ上に読み込む(標準ライブラリ)
# スロット(リール)の中身を "定数" で定義する
# 配列のインデックスは 0 から始まるので、0 〜 10 番目に格納されている
# 定数は全て大文字で記載する
REEL_MARK_LIST = ('7', 'BAR', '🍒', '🍎', 'Reply','♢','♢', 'Reply', '🍎','Reply','♢','Reply','🍎')
# 特別なプレーヤーの名前と、その名前を使用した際のボーナスコイン数
#BONUS_PLAYER_AND_COINS = {'king': 100, 'queen': 150}
# スペシャルサンクスの対象者名
# ボーナスコインは一律 50 枚とする
#SPECIAL_THANKS = {'akira', # 弊社社長。詳細は社長が作成最多ブログ記事のプロフィール欄をご確認下さい。
# 'hurry', # 詳細はプロフィール欄から twitter をご確認下さい。
# 'shachi', # https://shachi-web.com/
# }
#SPECIAL_THANKS_COIN = 50
# ============================================================
# ゲームに必要な関数を定義する
# ============================================================
player_coin=input('購入コイン数を入力して下さい: ')
game_count=int(0)
count_cherry=int(0)
def show_start_message():
"""ゲーム開始のメッセージを表示する
(This function is to be called to show the start message.)
"""
print('--------------')
print('スロットゲーム')
print('--------------')
def ask_player_name():
player_name = input('あなたの名前を入力して下さい: [空白OKです。]')
print(f'こんにちは {player_name} さん')
return player_name
def ask_bets(player_coin):
"""現在の所持コイン数を表示した後、掛けるコイン数(bets)を尋ねる
(This function is to be called to ask bets.)
所持コイン数(player_coin)は数値なので、文字列に含めたい場合は文字列(string)に変換する必要がある ==> str() 関数
input() 関数で入力した値は文字列(string)になるので整数(integer)に変換する ==> int() 関数
Args:
player_coin (int): プレーヤーの所持コイン数
Returns:
int: 掛けコイン数
"""
print('------------------------------')
print(f'現在の所持コイン数は {player_coin:,} 枚です。')
bets = int(1)
return bets
def show_and_get_result():
"""スロットの結果(絵柄)を表示し、結果を取得する
(This function is to be called to show and get result.)
Returns:
str: スロットの結果(絵柄)
"""
result_list = []
for _ in range(3):
index = random.randint(0, 12)
result = REEL_MARK_LIST[index]
result_list.append(result)
result_all = ''.join(result_list)
print(result_all)
return result_all
def get_division(marks):
"""絵柄に応じた配当倍率を取得する
(This function is to be called to get division.)
Args:
marks (str): スロットの結果(絵柄)
Returns:
int: 配当倍率
"""
if marks == '777':
# count_777=int(0)
print('超大当たり!!120枚')
# count_777=count_777+1
# print('超大当たり!!'+str(count_777)+'回目です。')
return 120
elif marks == 'BARBARBAR':
print('BAR!,30枚')
return 30
elif marks == '🍎🍎🍎':
print('Apple!8枚')
return 8
elif marks == 'ReplyReplyReply':
print('Reply!')
return 1
elif marks[0:1] == '🍒':
print('当たり! 3枚')
return 3
else:
print('ハズレ...')
return -1
def calculate_coin(coin, bets, division):
"""掛けたコイン数(bets)と、配当倍率(division)を使用してプレーヤーの所持コイン数を精算する
(This function is to be called to calculate (players's) coin.)
Args:
coin (int): プレーヤーの精算前の所持コイン数
bets (int): 掛けコイン数
division (int): 配当倍率
Returns:
int: 精算後のプレーヤーの所持コイン数
"""
coin = coin + bets * division
return coin
# ============================================================
# 実際にゲームを実行する
# ============================================================
# プレーヤーの所持コイン数
player_coin = int(player_coin)
count_777=int(0)
count_BAR=int(0)
show_start_message()
player_name = ask_player_name()
# if player_name in BONUS_PLAYER_AND_COINS:
# player_coin = player_coin + BONUS_PLAYER_AND_COINS[player_name]
#elif player_name in SPECIAL_THANKS:
# player_coin = player_coin + SPECIAL_THANKS_COIN
while player_coin > 0:
bets = ask_bets(player_coin)
marks = show_and_get_result()
division = get_division(marks)
player_coin = calculate_coin(player_coin, bets, division)
if marks=='777':
count_777=count_777+1
elif marks=='BARBARBAR':
count_BAR=count_BAR+1
else:
print('次は、777を狙え!')
print('----------------------------------')
game_count=game_count+1
print('ゲームプレイ数は、'+str(game_count)+'です。')
print('----------------------------------')
print('===================')
print('1) 777当選回数は、'+str(count_777)+'回目です。')
print('2) BAR当選回数は、'+str(count_BAR)+'回目です。')
print('===================')
print('ゲームオーバーです')
print(f'さようなら {player_name} さん')