Python PR

【Pyhton】あっち向いてホイを実装してみる

記事内に商品プロモーションを含む場合があります

この記事では、Pythonであっち向いてホイを実装してみる。

じゃんけんについては以前に解説したのでそちらを参照してください。この記事でもじゃんけんの部分は以下の記事のコードを少しだけ変えて使っていきます。

Linkジャンケンを実装してみよう【サンプルプログラム】

それでは、あっち向いてホイの実装方法を見ていきましょう!!

ルールの確認

まずは、あっち向いてホイのルールの確認をします。

  1. じゃんけんをする
  2. あいこ以外の場合に上下左右を選択する
  3. 選択した方向が一致したら勝敗が決まり、一致しなかった場合はじゃんけんに戻る

上記のような流れになるかと思います。ポイントは あっち向いてホイの部分はじゃんけんに勝っていても負けていても同じ処理で問題ないということです。

じゃんけん

じゃんけんは以下の記事で実装したものを少しだけ改良して使用します。

Linkジャンケンを実装してみよう【サンプルプログラム】

import random

# 手のタプル
hands = ('グー', 'チョキ', 'パー')

def janken():
    # 掛け声
    print('じゃんけん...')
    while True:                            
        while True:
            try:
                # 手を受け取る
                p_hand = hands[int(input('グー(0), チョキ(1), パー(2): '))]
                # 上で正常に手を受け取ると break が処理されて無限ループを抜ける
                break
            # try文 でエラーが発生した場合の処理
            except:
                print('0 ~ 2 の整数を入力してください!')
            

        # 相手の手を決める
        e_hand = hands[random.randint(0, 2)]

        # 掛け声と手の確認
        print('ポン!!')
        print(f'あなた: {p_hand}, 相手: {e_hand}')

        # 勝敗判定
        # あいこの場合
        if p_hand == e_hand:
            print('あいこで..')             
            continue                      
        # それ以外
        else:
            if p_hand == 'グー':
                if e_hand == 'チョキ':
                    return '勝ち'
                else:
                    return '負け'
            elif p_hand == 'チョキ':
                if e_hand == 'グー':
                    return '負け'
                else:
                    return '勝ち'
            else:
                if e_hand == 'グー':
                    return '勝ち'
                else:
                    return '負け'

ちょっと長くなってしまったので関数として実装しました。変更した部分は8行目と25行目に掛け声を追加し、勝敗判定の部分で「勝ち」、「負け」と文字列を戻り値として返しているところです。

あっち向いてホイ

あっち向いてホイの部分もじゃんけんとほぼ同じ感じで実装しました。両者の方向を決め、結果を戻り値で返しているだけです。

def attimuitehoi():
    print('あっち向いて...')

    # 自分の方向を決める
    while True:
        # 例外処理
        try:
            # 方向を受け取る
            p_dir = direction[int(input('↑(0), →(1), ↓(2), ←(3): '))]
            break
        except:
            print('0 ~ 3 の整数を入力してください!')

    # 相手の方向を決める
    e_dir = direction[random.randint(0, 3)]

    print('ホイ!!')
    print(f'あなた: {p_dir}, 相手: {e_dir}')

    # 同じか方向かどうかを戻り値で返す
    return p_dir == e_dir

呼び出して完成!!

最後にじゃんけんとあっち向いてホイの関数をまたもや無限ループ内で呼び出します。

# 勝敗
vod = None

while True:

    # じゃんけんの勝敗を受け取る
    vod = janken()

    # 見やすいように改行
    print()

    # あっち向いてホイの結果を分岐
    if attimuitehoi():
        # 同じ方向だった場合にじゃんけんの結果を出力(\nで改行も入れている)
        print(f'\nあなたの{vod}です!!')
        # 勝敗が着いたのでループ終了
        break
    # 勝敗が着かなかったのでじゃんけんからやり直し
    continue

これであっち向いてホイ実装は完了です。ちなみに、コードの全体は以下のようになっています。

import random

# 手のタプル
hands = ('グー', 'チョキ', 'パー')
# 方向
direction = ('↑', '→', '↓', '←')
# 勝敗
vod = None


def janken():
    # 掛け声
    print('じゃんけん...')
    while True:                            
        while True:
            try:
                # 手を受け取る
                p_hand = hands[int(input('グー(0), チョキ(1), パー(2): '))]
                # 上で正常に手を受け取ると break が処理されて無限ループを抜ける
                break
            # try文 でエラーが発生した場合の処理
            except:
                print('0 ~ 2 の整数を入力してください!')
            

        # 相手の手を決める
        e_hand = hands[random.randint(0, 2)]

        # 掛け声と手の確認
        print('ポン!!')
        print(f'あなた: {p_hand}, 相手: {e_hand}')

        # 勝敗判定
        # あいこの場合
        if p_hand == e_hand:
            print('あいこで..')             
            continue                      
        # それ以外
        else:
            if p_hand == 'グー':
                if e_hand == 'チョキ':
                    return '勝ち'
                else:
                    return '負け'
            elif p_hand == 'チョキ':
                if e_hand == 'グー':
                    return '負け'
                else:
                    return '勝ち'
            else:
                if e_hand == 'グー':
                    return '勝ち'
                else:
                    return '負け'
                


def attimuitehoi():
    print('あっち向いて...')

    # 自分の方向を決める
    while True:
        # 例外処理
        try:
            # 方向を受け取る
            p_dir = direction[int(input('↑(0), →(1), ↓(2), ←(3): '))]
            break
        except:
            print('0 ~ 3 の整数を入力してください!')

    # 相手の方向を決める
    e_dir = direction[random.randint(0, 3)]

    print('ホイ!!')
    print(f'あなた: {p_dir}, 相手: {e_dir}')

    # 同じか方向かどうかを戻り値で返す
    return p_dir == e_dir



while True:

    # じゃんけんの勝敗を受け取る
    vod = janken()

    # 見やすいように改行
    print()

    # あっち向いてホイの結果を分岐
    if attimuitehoi():
        # 同じ方向だった場合にじゃんけんの結果を出力
        print(f'\nあなたの{vod}です!!')
        # 勝敗が着いたのでループ終了
        break
    # 勝敗が着かなかったので改行してじゃんけんからやり直し
    print()
    continue

では、あっち向いてホイで遊んでみましょう!!

じゃんけん...
グー(0), チョキ(1), パー(2): 0
ポン!!
あなた: グー, 相手: グー
あいこで..
グー(0), チョキ(1), パー(2): 1
ポン!!
あなた: チョキ, 相手: グー

あっち向いて...
↑(0), →(1), ↓(2), ←(3): 2
ホイ!!
あなた: ↓, 相手: →

じゃんけん...
グー(0), チョキ(1), パー(2): 1
ポン!!
あなた: チョキ, 相手: グー

あっち向いて...
↑(0), →(1), ↓(2), ←(3): 0
ホイ!!
あなた: ↑, 相手: ←

じゃんけん...
グー(0), チョキ(1), パー(2): 2
ポン!!
あなた: パー, 相手: グー

あっち向いて...
↑(0), →(1), ↓(2), ←(3): 1
ホイ!!
あなた: →, 相手: ←

じゃんけん...
グー(0), チョキ(1), パー(2): 2
ポン!!
あなた: パー, 相手: グー

あっち向いて...
↑(0), →(1), ↓(2), ←(3): 0
ホイ!!
あなた: ↑, 相手: ↑

あなたの勝ちです!!

あいこでポンが若干気になる以外は概ねいい感じで実装できたのではないでしょうか?

まとめ

この記事では、じゃんけんを少し発展させたあっち向いてホイを実装しました。

ほとんどじゃんけんのコードを流用するだけで実装できたのでそんなに難しくはなかったと思います。良ければこのコードを改造して色々な機能を追加してみてください。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ