タイトル画像
琴葉茜

さて、前回まででお互いのじゃんけんの手を出せるようになったから、次は勝敗を決定する仕組みを追加しようか!

琴葉葵

じゃんけんの勝敗ならなんとなく自分で作れそうな気がする!

琴葉茜

お!そしたらちょっと作ってみてもらおうかな?

琴葉葵

要は「if文」を使えば良いんだから...

解説画像1
琴葉葵

こんな感じじゃない!?

琴葉茜

おおー!良い感じだね!!
じゃあこれを「勝敗の文字を返す関数」にして、「hands_images」を設定している下辺りに追加してみようか!

def check_hands(player_hand, cpu_hand):
    if player_hand == cpu_hand: # 手が同じなら「あいこ」
        return "あいこだよ"
    elif player_hand == "グー" and cpu_hand == "チョキ":
        return "勝ち!!"
    elif player_hand == "チョキ" and cpu_hand == "パー":
        return "勝ち!!"
    elif player_hand == "パー" and cpu_hand == "グー":
        return "勝ち!!"
    else: # どれにも当てはまらなかったらプレイヤーの「負け」
        return "負け..."
琴葉茜

次に、その関数の結果を表示しよう
今回は結果が出たのを分かりやすくするためにポップアップ表示にしてみるよ
追加する場所は下のコードを参考にしてみてね

# 途中省略
window["result"].update(f"プレイヤーの手は「{player}」、CPUの手は「{cpu}」です")
eg.popup(check_hands(player, cpu)) # これを追加
解説画像2
琴葉葵

おおー!別のウィンドウで結果を教えてくれた!!

琴葉茜

今回は単純に文字を表示しただけなんだけど、ポップアップの種類と機能はとても充実してるから、また自分でも調べてみると良いよ!

琴葉葵

ポップアップでハッキリと動きが出たから、もっとアプリっぽくなったね!

琴葉茜

最後にちょっとした小技の紹介!
最初に葵に作ってもらった勝敗判定のプログラムはもっと簡単にすることができるんだ

琴葉葵

なんと...!!

琴葉茜

例えばプレイヤーが勝つパターンは3種類あるよね?ここを1つの条件にまとめるために、プレイヤーの手がキーで、その手で勝てる手を値(バリュー)にした辞書を作ってあげると...

win_rules = {
    "グー": "チョキ",
    "チョキ": "パー",
    "パー": "グー"
}

def check_hands(player_hand, cpu_hand):
    if player_hand == cpu_hand: # 手が同じなら「あいこ」
        return "あいこだよ"
    elif win_rules[player_hand] == cpu_hand: # プレイヤーが勝てる手とCPUの手が一緒なら勝ち
        return "勝ち!!"
    else: # どれにも当てはまらなかったらプレイヤーの「負け」
        return "負け..."
琴葉葵

おお!すごくスッキリしたね!
if文が「勝ち」「負け」「あいこ」の3パターンで分岐してるから分かりやすくなったよ!!

琴葉茜

もちろん葵が考えてくれた形も十分良いんだけど、プログラムはif文やループを減らした方が効率よく動いてくれるから、もし余裕が出来たらこんな感じでシンプルにできる方法を考えてみると良いよ!

琴葉葵

なかなかハードル高そう...!!とりあえず今は動かせるようにできたら十分かな

この時点での全体のプログラム

import TkEasyGUI as eg
import random

hands = ["グー", "チョキ", "パー"]
hand_images = {
    "グー": "janken_gu.png",
    "チョキ": "janken_choki.png",
    "パー": "janken_pa.png"
}
win_rules = {
    "グー": "チョキ",
    "チョキ": "パー",
    "パー": "グー"
}

def check_hands(player_hand, cpu_hand):
    if player_hand == cpu_hand: # 手が同じなら「あいこ」
        return "あいこだよ"
    elif win_rules[player_hand] == cpu_hand: # プレイヤーが勝てる手とCPUの手が一緒なら勝ち
        return "勝ち!!"
    else: # どれにも当てはまらなかったらプレイヤーの「負け」
        return "負け..."

# レイアウト(画面構成)
col1 = eg.Column([[eg.Image(hand_images["グー"], size=(100, 100))], [eg.Button("グー")]])
col2 = eg.Column([[eg.Image(hand_images["チョキ"], size=(100, 100))], [eg.Button("チョキ")]])
col3 = eg.Column([[eg.Image(hand_images["パー"], size=(100, 100))], [eg.Button("パー")]])

layout = [
    [eg.Text("じゃんけんの手を選ぼう!")],
    [col1, col2, col3],
    [eg.Text("プレイヤーの手"),
     eg.Image(None, size=(100, 100),key="player_hand"),
     eg.Text("vs"),
     eg.Image(None, size=(100, 100), key="cpu_hand"),
     eg.Text("CPUの手")],
    [eg.Text("", key="result")]
]

# ウィンドウを作成
window = eg.Window("じゃんけんアプリ", layout)

# イベントループ(閉じるまで表示)
while True:
    event, values = window.read()
    if event in ["グー", "チョキ", "パー"]:
        player = event
        cpu = random.choice(hands)

        # 画像を更新
        window["player_hand"].update(hand_images[player])
        window["cpu_hand"].update(hand_images[cpu])

        window["result"].update(f"プレイヤーの手は「{player}」、CPUの手は「{cpu}」です")

        eg.popup(check_hands(player, cpu))
    if event is eg.WINDOW_CLOSED:
        break

# ウィンドウを閉じる
window.close()