タイトル画像
琴葉茜

次はCPUの手をランダムで出すようにしてみようか

琴葉葵

でも、ランダムで出させるなら普通にライブラリの「random」を使えば良いんじゃないの?

琴葉茜

そうだね!それで問題ないよ!!じゃあ、いつランダムで設定するのが良さそうかな?

琴葉葵

そうだねぇ...後出し感はあるけど「自分がどの手にするか選んだ時」かな?

琴葉茜

正解!今回CPUは完全にランダムに出すからそれで問題ないね!

琴葉茜

そしたら、まずはCPUの手を表示するためにlayoutを調整しようか
ついでにランダムを使いやすくするための「hands」と、画像のパスを扱いやすくするための「hand_images」も用意するよ

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

# レイアウト(画面構成)
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")]
]
琴葉葵

ちゃんとどんな画面にしたいかイメージしないとごちゃごちゃになっちゃいそうだね

琴葉茜

次はCPUの手をランダムに選んで、それぞれの手を表示するようにイベントループの部分を変更しよう!
layoutはそのままだけど、その上の「import random」を追加するのを忘れないようにね!!

import TkEasyGUI as eg
import random # 追加を忘れずに!!


# 途中省略


# イベントループ(閉じるまで表示)
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}」です")
    if event is eg.WINDOW_CLOSED:
        break
琴葉葵

なるほど!「random.choice()」を使えば配列から要素を1つだけランダムに選べるんだね!

琴葉茜

そういうこと
じゃあこれでどんな感じに動くか確認してみよう!

解説画像1
琴葉葵

おおー!どのボタンでも押すたびにCPUの手が変化してる!!

琴葉茜

ばっちりだね!じゃあ次の項目でじゃんけんの勝敗判定を作ろう!!

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

import TkEasyGUI as eg
import random

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

# レイアウト(画面構成)
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}」です")
    if event is eg.WINDOW_CLOSED:
        break

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