さて、前回まででお互いのじゃんけんの手を出せるようになったから、次は勝敗を決定する仕組みを追加しようか!
じゃんけんの勝敗ならなんとなく自分で作れそうな気がする!
お!そしたらちょっと作ってみてもらおうかな?
要は「if文」を使えば良いんだから...
こんな感じじゃない!?
おおー!良い感じだね!!
じゃあこれを「勝敗の文字を返す関数」にして、「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)) # これを追加
おおー!別のウィンドウで結果を教えてくれた!!
今回は単純に文字を表示しただけなんだけど、ポップアップの種類と機能はとても充実してるから、また自分でも調べてみると良いよ!
ポップアップでハッキリと動きが出たから、もっとアプリっぽくなったね!
最後にちょっとした小技の紹介!
最初に葵に作ってもらった勝敗判定のプログラムはもっと簡単にすることができるんだ
なんと...!!
例えばプレイヤーが勝つパターンは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()
