PythonでCoin Toss Gameを作ってみた

今年は、パリオリンピックが開催される。

そこで、私はよくサッカーの試合でエンドを決めるために使われているコイントスをPythonを使い、プログラムコードを書くことについて、興味を持った。

### What is Coin Toss?
硬貨などを投げ上げて、落ちたそれの裏表で物事を決めることである。

### プログラムコード
```py
import random

def get_user_choice():
    while True:
        try:
            user_choice = int(input("What do you choose? Type 1 for Heads, 2 for Tails, or 3 to Quit: "))
            if user_choice not in [1, 2, 3]:
                print("Invalid input. Please choose 1 for Heads, 2 for Tails, or 3 to Quit.")
            else:
                return user_choice
        except ValueError:
            print("Invalid input. Please enter a number.")

def main():
    print("Welcome to the Heads or Tails game!")

    while True:
        user_choice = get_user_choice()

        if user_choice == 3:
            print("Thanks for playing!")
            break

        coin = random.randint(1, 2)  # 1 for Heads, 2 for Tails
        print("Computer flips the coin...")

        if coin == 1:
            print("It's Heads!")
        else:
            print("It's Tails!")

        if user_choice == coin:
            print("Congratulations! You guessed correctly.")
        else:
            print("Sorry, you guessed wrong. Better luck next time!")

        play_again = input("Do you want to play again? (yes/no): ").lower()
        if play_again != "yes":
            print("Thanks for playing!")
            break

        print() 

if __name__ == "__main__":
    main()
```
### コードの説明と遊び方
最初に、画面に表示される指示に従って、1（表）か2（裏）を選びます。
コンピュータも同時にランダムで1か2を選びます。
コンピュータの選んだ結果が表示されます。もし1なら「表」、2なら「裏」と表示されます。
プレイヤーとコンピュータの選択が一致すれば、「おめでとうございます！当たりです！」(Congratulations! と表示されます。
違う場合は、「残念！外れです。次は頑張ってください！」と表示されます。
各ラウンドの後、もう一度遊ぶかどうかを尋ねられます。「はい」を選べば再度ゲームが始まります。選ばない場合はプログラムが終了します。
注意点:
プレイヤーが1（表）か2（裏）以外の数字を入力した場合、無効な入力として扱われます。
ゲームを終了するには、3を入力してください。

この場合、プレイヤーはコンピューターが選んだコインを予想するだけになってしまう。
そこで、私はコンピューターとプレイヤーがコイントスゲームをできるようなプログラムコードを書いてみた。

### 改良したプログラムコード
```py
import random

def get_user_choice():
    while True:
        try:
            user_choice = int(input("表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: "))
            if user_choice not in [1, 2]:
                print("無効な入力です。1を入力して表、2を入力して裏を選んでください。")
            else:
                return user_choice
        except ValueError:
            print("無効な入力です。数字を入力してください。")

def main():
    print("コンピュータとのコインゲームに挑戦しましょう！最初に5回勝った方が勝者です。デュースの場合もあります。")

    computer_wins = 0
    player_wins = 0

    while computer_wins < 5 and player_wins < 5:
        print("\n--- 新しいラウンド ---")
        print(f"現在のスコア： プレイヤー {player_wins} - {computer_wins} コンピュータ")

        user_choice = get_user_choice()
        coin = random.randint(1, 2)  # 1が表、2が裏

        if coin == 1:
            print("コンピュータが表を選びました。")
        else:
            print("コンピュータが裏を選びました。")

        if user_choice == coin:
            print("あなたの勝ちです！")
            player_wins += 1
        else:
            print("コンピュータの勝ちです。")
            computer_wins += 1

        # デュースの場合の処理
        if player_wins == computer_wins and player_wins == 4:
            print("\nデュースです！最後の勝者を決めるためのラウンドです。\n")

    if player_wins > computer_wins:
        print("おめでとうございます！あなたの勝ちです！")
    else:
        print("残念！コンピュータの勝ちです。")

if __name__ == "__main__":
    main()
```

### プログラムコードを使った実際のゲームプレイ
```
コンピュータとのコインゲームに挑戦しましょう！最初に3回勝った方が勝者です。デュースの場合もあります。

--- 新しいラウンド ---
現在のスコア： プレイヤー 0 - 0 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが裏を選びました。
コンピュータの勝ちです。

--- 新しいラウンド ---
現在のスコア： プレイヤー 0 - 1 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが表を選びました。
コンピュータの勝ちです。

--- 新しいラウンド ---
現在のスコア： プレイヤー 0 - 2 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが表を選びました。
あなたの勝ちです！

--- 新しいラウンド ---
現在のスコア： プレイヤー 1 - 2 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが表を選びました。
あなたの勝ちです！

デュースです！最後の勝者を決めるためのラウンドです。


--- 新しいラウンド ---
現在のスコア： プレイヤー 2 - 2 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが裏を選びました。
あなたの勝ちです！
おめでとうございます！あなたの勝ちです！
```
しかし、ここで疑問点を感じた。2-2でデュースなら、本来は4点取った方が勝ちになる。
この場合、あなたの勝ちです！と出力した。

### デュースを含めたプログラムコード
```py
import random

def get_user_choice():
    while True:
        try:
            user_choice = int(input("表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: "))
            if user_choice not in [1, 2]:
                print("無効な入力です。1を入力して表、2を入力して裏を選んでください。")
            else:
                return user_choice
        except ValueError:
            print("無効な入力です。数字を入力してください。")

def main():
    print("コンピュータとのコインゲームに挑戦しましょう！最初に5回勝った方が勝者です。デュース（同点）が発生した場合、相手に2点差がつくまで続きます。")

    computer_wins = 0
    player_wins = 0

    while computer_wins < 5 and player_wins < 5:
        print("\n--- 新しいラウンド ---")
        print(f"現在のスコア： プレイヤー {player_wins} - {computer_wins} コンピュータ")

        user_choice = get_user_choice()
        coin = random.randint(1, 2)  # 1が表、2が裏

        if coin == 1:
            print("コンピュータが表を選びました。")
        else:
            print("コンピュータが裏を選びました。")

        if user_choice == coin:
            print("あなたの勝ちです！")
            player_wins += 1
        else:
            print("コンピュータの勝ちです。")
            computer_wins += 1

        # デュース（同点）の処理
        if player_wins == computer_wins and player_wins >= 4:
            print("\nデュースです！相手に2点差がつくまで続けます。\n")

            while abs(player_wins - computer_wins) < 2:
                user_choice = get_user_choice()
                coin = random.randint(1, 2)

                if coin == 1:
                    print("コンピュータが表を選びました。")
                else:
                    print("コンピュータが裏を選びました。")

                if user_choice == coin:
                    print("あなたの勝ちです！")
                    player_wins += 1
                else:
                    print("コンピュータの勝ちです。")
                    computer_wins += 1

    if player_wins >= 10:
        print("おめでとうございます！あなたの勝ちです！")
    else:
        print("残念！コンピュータの勝ちです。")

if __name__ == "__main__":
    main()
```
### デュースを含めたプログラムコードの実際のゲームプレイ
```
コンピュータとのコインゲームに挑戦しましょう！最初に5回勝った方が勝者です。デュース（同点）が発生した場合、相手に2点差がつくまで続きます。

--- 新しいラウンド ---
現在のスコア： プレイヤー 0 - 0 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが裏を選びました。
あなたの勝ちです！

--- 新しいラウンド ---
現在のスコア： プレイヤー 1 - 0 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが裏を選びました。
コンピュータの勝ちです。

--- 新しいラウンド ---
現在のスコア： プレイヤー 1 - 1 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが表を選びました。
コンピュータの勝ちです。

--- 新しいラウンド ---
現在のスコア： プレイヤー 1 - 2 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが裏を選びました。
コンピュータの勝ちです。

--- 新しいラウンド ---
現在のスコア： プレイヤー 1 - 3 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが裏を選びました。
あなたの勝ちです！

--- 新しいラウンド ---
現在のスコア： プレイヤー 2 - 3 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが裏を選びました。
あなたの勝ちです！

--- 新しいラウンド ---
現在のスコア： プレイヤー 3 - 3 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが表を選びました。
コンピュータの勝ちです。

--- 新しいラウンド ---
現在のスコア： プレイヤー 3 - 4 コンピュータ
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが表を選びました。
あなたの勝ちです！

デュースです！相手に2点差がつくまで続けます。

表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 2
コンピュータが表を選びました。
コンピュータの勝ちです。
表か裏かを選んでください。1を入力して表、2を入力して裏を選んでください: 1
コンピュータが表を選びました。
6-4で、あなたの勝ちです！
```
このように、ちゃんとデュースを含めたプログラムコードを作成することができた。

皆さんも時間がある時に、このプログラムコードを参考にして、コイントスゲームをやってみてはいかがでしょうか。