Python入門講座

【Python入門講座】じゃんけんプログラムをゲームにする!

さて、段々と盛り上がってきましたね!(あれ?飯田だけ?)
今回は、前回作ったじゃんけんプログラムを、視覚的・操作性をゲームっぽくしていきたいと思います。
コードが長かったりするので、スマホの場合は横向きがみやすいと思います。

ちなみに操作する人が、視覚的あるいは直感的に操作しやすいプログラムをUI(ユーザーインターフェース)に優れているプログラムなんて言います。
ただ、飯田も初心者なので、Pythonで画面を作る際のライブラリは「tkinter」(ティーケーインター)しか知りません。
tkinterは標準ライブラリなので、すぐ使えます。
今回はこれを使っていきましょう。

↓あなたの応援が飯田の力に!!
ブログランキング・にほんブログ村へ
にほんブログ村

じゃんけんゲーム開発のための準備

では早速前回作った「jyanken.py」を開いてみましょう。

IDLEを立ち上げ、[file] > [open]で”jyanken.py”ファイルを開きます。
開いたら、これから色々コードを書き足していくので、後戻りできなくなってしまわないように[file] > [save as…]で名前を”jyanken_game.py”にでもして保存しておきましょう。

ウインドウを作って表示させる

tkiterはウインドウを作ったり、ウインドウにボタンを表示したり物理的な操作を可能にします。(これを”オブジェクト”といいます。)
“オブジェクト”には”メソッド”という関数を持っていて、その関数を実行することで色々な操作ができます。

まずは、試してみましょう。(コマンドプロンプトでとりあえず試してみましょう。)

#標準ライブラリtkinterを呼び出し、以降tkという名前で使いますと宣言
import tkinter as tk

#ウインドウ作るためroot変数にtkinter(tk)のTkメソッド(ウインドウを作り表示)を使用
root = tk.Tk()
root.mainloop()

すると、以下のようなウインドウが出てくると思います。

ウインドウのサイズを変える

では次にウインドウサイズの変え方を覚えましょう。
ウインドウサイズを変えるための関数は、geometryメソッドです。

大きさは、縦横の数字で指定します。
とりあえず、300×300にしておきます。

#標準ライブラリtkinterを呼び出し、以降tkという名前で使いますと宣言

import tkinter as tk

#ウインドウ作るためroot変数にtkinter(tk)のTkメソッド(ウインドウを作り表示)を使用
root = tk.Tk()

#ウインドウサイズを指定するコードを追加する
root.geometry(“300×150”)

#ウインドウを動作させるために必要なコード(一番下においておいてください)

root.mainloop()

さて、サイズはどうなりましたか?


変わりましたね!

ウインドウのタイトルを変える

次にウインドウのタイトルを変えます。
何のゲームかっていう事くらい表示させたいですよね。
タイトルを表示するのは、その名のとおりtitleメソッドを使います。

import tkinter as tk

root = tk.Tk()
root.geometry(“300×150”)

#ウインドウを動作させるために必要なコード(一番下においておいてください)
root.title(“じゃんけんゲーム”)

root.mainloop()

さて表示はどうなりましたでしょうか?

大丈夫ですね。

遊び方を考えて作りこむ

では、ここから更にゲームっぽくしていきましょう。
まず、もともとのじゃんけんプログラムでは、あらかじめPrayer変数に出す手を代入して、プログラムをスタートさせると相手の手が決定されるという作りでした。

でも、じゃんけんの度にいちいちプログラムを開いて、prayer変数の中身を書き換える必要があったら面倒ですよね?

tkinterには入力欄を作って、そこにグーだの、チョキだのいれさせるってやり方もありますが、じゃんけんする度に文字入力が発生するのもわずらわしい。

そこで、今回はグー・チョキ・パーのボタンを作って押してもらうことで、じゃんけんプログラムをスタートさせ、相手の手が何かと勝敗を表示させるという作りにしていきます。

ボタン選択を促すメッセージの表示

まずはボタン選択をしてもらえるよう、メッセージを表示させたいと思います。
メッセージ表示はtkinterにあるLabelというメソッドを使って行います。

import tkinter as tk
root = tk.Tk()
root.geometry(“300×150”)

#ボタン選択を促すメッセージをフォントサイズ14・Helveticaという字体で、横軸20ピクセル・縦軸20ピクセルの位置に表示させる
labell = tk.Label(root, text=”あなたが出す手を選んでね!”,font=(“Helvetica”,14))
labell.place(x = 20, y = 20)

root.mainloop()

では、実行してみましょう。

表示できましたね!!

ボタンを表示し、押した時にプログラムが起動するようにする

では、次はプレイヤーが決めた出す手に基づいて、じゃんけんプログラムが起動するように、ボタンを作っていきましょう。
後少しです!

ボタンもtkinterライブラリにButtonというメソッドが用意されています。(きゃー、便利~)

import tkinter as tk
root = tk.Tk()
root.geometry(“300×150”)

labell = tk.Label(root, text=”あなたが出す手を選んでね!”,font=(“Helvetica”,14))
labell.place(x = 20, y = 20)

#ボタン1~3上にフォントサイズ14でHelveticaでグー・チョキ・パーを表示する

button1 = tk.Button(root, text=”グー”,font=(“Helvetica,14″))
button1.place(x = 20,y = 60)

button2 = tk.Button(root, text=”チョキ”,font=(“Helvetica,14″))
button2.place(x = 120,y = 60)

button3 = tk.Button(root, text=”パー”,font=(“Helvetica,14”))
button3.place(x = 220,y = 60)

root.mainloop()

ボタン配置(button.place(x = , y=)の座標に注目してください。x軸(横軸を100ずつ上げていくことで、横並びのボタン配置を指示しています。)

縦に並べる場合は、y軸を上げていけばOKです。

では、実行してみましょう。

おおおお、見てくれはもうほぼ完成ですね!
では最後に前回作ったじゃんけんプログラムとの紐づけ、ボタンを押した際と、押した後の結果表示を作って終了です。

じゃんけんプログラムとの紐づけ、結果等の表示機能を作る

大分完成に近づいてきました。
飯田、すでにグロッキーですが、完成まで書ききります!(早くウォーキングデッドが観たい 笑)
ここまでで、上手くできないとこがある。どうしてもエラーになってしまう等あればお気軽に飯田までご連絡ください。
但し、あなたの飯田はたった一人、地球はたった一つ、ちんたら返信でもお許しください。。。

それでは仕上げにとりかかりましょう。
先ほどまで作った画面表示と前回のじゃんけんプログラムをミックスさせます。
長くなるので、少しずつ区切って書いていきます。
エディタに書く時には、続けて書いてください。

メッセージボックスもtkinterのメソッドです。tmsgとしてインポートすることで、以降tmsgでメソッドを使うことができます。(メッセージ表示させるので、printではなく、tmsgでメッセージとして出力します。)

tkinterと相手の手を決めるためのrandom関数をはじめにインポートするコードを書きます。

#cording:utf-8

import random
import tkinter as tk

#メッセージボックスパッケージを読み込む
import tkinter.messagebox as tmsg

次に、じゃんけんプログラムのうち、相手の手を決めるための処理を記述します。

#a変数にランダムで0~2を代入
a = random.randrange(3)

#じゃんけんリストにグー・チョキ・パーを代入
jyanken = [“グー”,”チョキ”,”パー”]

#エネミー変数に変数aを代入、相手の手をシェル上に出力させる
enemy = jyanken[a] print(jyanken[a])

それぞれ、グー・チョキ・パーのボタンが押された場合の、処理を書いていきます。
自分の手がグーの時に、上で判定された”相手の手”と条件式で比較して勝敗をメッセージ表示するプログラムです。
条件式は、自分がグーである場合のパターンのみでOKです。

ちなみに、tmsgの初めの引数はメッセージ表示するときのウインドウのタイトル、二個目の引数は表示するメッセージです。

#ボタンがクリックされたときの処理(グーのボタン用)
def Button1Click():
    prayer = “グー”
    tmsg.showinfo(“あなたの手”,”グーを選択しました。”)

    #双方の手を条件式で勝敗判定、勝敗とメッセージを出力する
    if enemy == prayer:
        tmsg.showinfo(“勝敗”,”あいこです、もう一度!”)
    elif enemy == “チョキ” and prayer == “グー”:
        tmsg.showinfo(“勝敗”,”相手は”+enemy+”,勝ちました!!”)
    elif prayer== “グー” and enemy == “パー”:
         tmsg.showinfo(“勝敗”,”相手は”+enemy+”,負けました。。”)
    else:
        tmsg.showerror(“エラー発生”,”エラーが発生”)

チョキボタンについても、同じように押された場合の処理を記述します。
条件式は自分がチョキである場合のパターンのみでOKです。

#ボタンがクリックされたときの処理(チョキのボタン用)
def Button2Click():
    prayer = “チョキ”
        tmsg.showinfo(“あなたの手”,”チョキを選択しました。”)

#双方の手を条件式で勝敗判定、勝敗とメッセージを出力する
    if enemy == prayer:
        tmsg.showinfo(“勝敗”,”あいこです、もう一度!”)
    elif enemy == “パー” and prayer == “チョキ”:
        tmsg.showinfo(“勝敗”,”相手は”+enemy+”,勝ちました!!”)
    elif prayer == “チョキ” and enemy == “グー”:
        tmsg.showinfo(“勝敗”,”相手は”+enemy+”,負けました。。”)
    else:
        tmsg.showerror(“エラー発生”,”エラーが発生”)

パーボタンについても、同じように押された場合の処理を記述します。
条件式は自分がパーである場合のパターンのみでOKです。

#ボタンがクリックされたときの処理(パーのボタン用)
def Button3Click():
    prayer = “パー”
        tmsg.showinfo(“あなたの手”,”パーを選択しました。”)

    #プレイヤーの手をprayer変数に代入
    #prayer = “グー”

    #双方の手を条件式で勝敗判定、勝敗とメッセージを出力する
    if enemy == prayer:
        tmsg.showinfo(“勝敗”,”あいこです、もう一度!”)
    elif enemy == “グー” and prayer == “パー”:
        tmsg.showinfo(“勝敗”,”相手は”+enemy+”,勝ちました!!”)
    elif prayer== “パー” and enemy == “チョキ”:
        tmsg.showinfo(“勝敗”,”相手は”+enemy+”,負けました。。”)
    else:
        tmsg.showerror(“エラー発生”,”エラーが発生”)

先ほど上の方で作成した、ウインドウ表示・操作のためのコードを書きます。
ボタンのところに、押した場合の挙動と連動させるコマンド指定をするのを忘れないでください。
(昨日飯田はこれを忘れて、悶々としたまま寝落ちしました。笑)

#ウインドウを作成・サイズを選択・ウインドウタイトルを指定
root = tk.Tk()
root.geometry(“300×150”)
root.title(“じゃんけんゲーム”)

#ウインドウにラベルを表示
labell = tk.Label(root, text=”あなたが出す手を選んでね!”,font= (“Helvetica”,14))
labell.place(x = 20, y = 20)

#ボタンを配置
button1 = tk.Button(root, text=”グー”,font=(“Helvetica,14”),command = Button1Click)
button1.place(x = 20,y = 60)

button2 = tk.Button(root, text=”チョキ”,font=(“Helvetica,14”),command = Button2Click)
button2.place(x = 120,y = 60)

button3 = tk.Button(root, text=”パー”,font=(“Helvetica,14”),command = Button3Click)
button3.place(x = 220,y = 60)

root.mainloop

できた方は、プログラムを起動して試してみましょう!!

飯田の攻撃!!飯田はグーを出した!

飯田負けたってよ・・・

次回は、ループ処理を学んでいきたいと思います!
See you soon!