LoginSignup
0
3

More than 1 year has passed since last update.

【日曜大工】pythonでスロットマシンを開発した話。

Posted at

色々な実行基盤での実行効率やスピード(メモリー消費量や処理速度)を調べています。
(例えば、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コードを載せますね。
このまま動きます。

game777.py

"""スロットゲーム

簡単なスロットゲームです。ゲームスタート時に保有しているコインを増やしましょう。
掛けコイン数を入力すると、スロットの結果が表示されます。
絵柄が揃うと、そのパターンに応じた配当倍率でコインを獲得することができます。
"""


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} さん')
0
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3