Python の勉強 スロットゲーム編 〜その7:文字列の生成〜

プログラミング

前回、勉強したフォーマットを用いてスロットゲームのプログラムを修正していきます。「005.py」をコピペして「007.py」を作成して下さい。
修正対象は

    print('こんにちは ' + player_name + ' さん')

    print('現在の所持コイン数は ' + str(player_coin) + ' 枚です。')

の2カ所になります。

修正する際は、是非「フォーマット済み文字列リテラル(f-string)」か「文字列の format() メソッド」のどちらかを使うようにして下さい。修正が完了したらプログラムを動かして確認してみましょう。

項目の比較用の拡張機能を利用してみる

その4(こちら)ではファイル同士の比較方法を勉強しました。ここで一度、使い方を復習しておきましょう。比較するのは、みなさんが作成した「007.py」と以下のプログラムです。

"""スロットゲーム

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


import random   # "乱数" を生成するために必要なライブラリをメモリ上に読み込む(標準ライブラリ)


# スロット(リール)の中身を "定数" で定義する
# 配列のインデックスは 0 から始まるので、0 〜 9 番目に格納されている
# 定数は全て大文字で記載する
REEL_MARK_LIST = ['♠', '♥', '♥', '◆', '◆', '◆', '♣', '♣', '♣', '♣']

# プレーヤーの名前が「king」だった場合、ゲームスタート時の所持コイン数にボーナスするコイン数
KING_BONUS_COIN = 100

# プレーヤーの名前が「queen」だった場合、ゲームスタート時の所持コイン数にボーナスするコイン数
QUEEN_BONUS_COIN = 150


# ============================================================
# ゲームに必要な関数を定義する
# ============================================================

def show_start_message():
    """ゲーム開始のメッセージを表示する
    (This function is to be called to show the start message.)
    """
    print('--------------')
    print('スロットゲーム')
    print('--------------')

def ask_player_name():
    """プレーヤーの名前を尋ねる
    (This function is to be called to ask player's name.)

    プレーヤーの名前を入力(input)してもらい、挨拶を表示(print)する
    入力されたプレーヤーの名前を返す(return)

    Returns:
        str: プレーヤーの名前
    """
    player_name = input('あなたの名前を入力して下さい: ')
    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} 枚です。')
    str_bets = input('掛けコイン数を入力して下さい: ')
    bets = int(str_bets)
    return bets

def show_and_get_result():
    """スロットの結果(絵柄)を表示し、結果を取得する
    (This function is to be called to show and get result.)

    Returns:
        str: スロットの結果(絵柄)
    """
    # TODO(佐藤宏行): ループ内で文字列を結合するのは避ける。代わりにリストに貯めて、最後に結合(join)すること
    # 参照: https://google.github.io/styleguide/pyguide.html#310-strings
    result_all = ''
    for i in range(3):
        index = random.randint(0, 9)
        result = REEL_MARK_LIST[index]
        result_all = result_all + result
    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 == '♠♠♠':
        print('超大当たり!!')
        return 15
    elif marks == '♥♥♥':
        print('大当たり!')
        return 12
    elif marks == '◆◆◆':
        print('大当たり!')
        return 10
    elif marks == '♣♣♣':
        print('大当たり!')
        return 8
    elif marks[0:2] == '♠♠':
        print('当たり!')
        return 5
    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 = 123

show_start_message()
player_name = ask_player_name()

if player_name == 'king':
    player_coin = player_coin + KING_BONUS_COIN
elif player_name == 'queen':
    player_coin = player_coin + QUEEN_BONUS_COIN

for message in ['1回目', '2回目', '最後だよ']:
    print(message)
    bets = ask_bets(player_coin)
    marks = show_and_get_result()
    division = get_division(marks)
    player_coin = calculate_coin(player_coin, bets, division)

print('終了です。{} さんの所持コイン数は...'.format(player_name))
print(f'最終的に {player_coin} 枚になりました!')

(おまけ)項目比較用の拡張機能を利用してみる ※興味ある人だけ対象

VS Code の標準機能ではファイル同士の比較しかできません。「Partial Diff」という拡張機能を入れると下記の比較できるようになり便利です。

  • 一つのファイルの中で選択した2箇所の範囲の比較
  • ファイルとクリップボードの中身の比較
  • VS Code で開いているタブ同士の比較

拡張機能「Partial Diff」のインストール

拡張機能のインストールは簡単です。

  1. VS Code のアクティビティバーの拡張機能ボタンをクリック
    (VS Code の各パーツの名称については、こちら
  2. 検索バーに「partial diff」と入力
  3. 対象を選択して内容を確認したら、「インストール」ボタンをクリック
拡張機能「Partial Diff」をインストールする様子

インストールが完了したら、早速、使ってみましょう。

一つのファイルの中で選択した2箇所の範囲の比較

「何に使うんだよ!」と突っ込みたい方もいらっしゃると思いますが、意外に使う機会があります。
私は例えば「ここだけ少し修正してみたい。でも上手くいくか心配だからコメントアウトして残しておこう」という場合、あとから何を修正したかを確認するときに使います。

  1. 比較対象を選択して、右クリック→「Select Text for Compare」を選択
  2. 比較対象を選択して、右クリック→「Compare Text with Previous Seletion」を選択
選択範囲同士の比較をする様子

ファイルとクリップボードの中身の比較

やり方は簡単です。

  1. 上のプログラムをコピーする
  2. 「007.py」を VS Code で開く
  3. ファイル中で右クリック→「Compare Text with Clipboard」を選択

すると、新しいタブが開いて、前回やったような比較結果を確認することができます。
当然、上のプログラムと全く同じ場合は差分が表示されないので、もしやり方が心配な方は「007.py」の内容を少し変更してから、「3」の手順を実施してみて下さい。変更した箇所が差分となって表示されるはずです。

右クリック→「Compare Text with Clipboard」を選択

VS Code で開いているタブ同士の比較

保存する前のファイルを比較対象にしたいときに使うのかな?正直、私は使ってないです。一応、使い方を……。

  1. ファイルを2個開く
  2. 1個を新しいエディタグループで開く
  3. 右クリック→「Compare Text in Visible Editors」を選択
表示中の2個のファイルを比較する様子

前回の内容が多かったので、今回は少なめです。

コメント

タイトルとURLをコピーしました