
Python - TkinterでGame作り。 - 出題。解答
タイピングゲームなので指示のあった言葉をタイピングします。これまでで、入力をすることができるようになったので、次は出題に合わせてタイピングできるようにします。要するに、問題のリストを作っておいて、それをランダムに表示させるということです。
問題としては、フルーツの英語としてこのスペルをタイピングします。
QUESTION = ["strawberry","fig","apricot","persimmon","chestnut","cherry","watermelon","pineapple","banana","grape","orange","melon","peach","apple","lemon"]
この問題をランダムに出題したいのでその仕組みを作ります。リストはインデックスで指定して表示させます。そのインデックスをランダムに指定すれば良さそうです。整数をランダムに出せる関数があるのでそれを使います。
使うためにはまず、ライブラリをインポートしてからになるので、インポートする命令を書いて実際のランダム関数、randint()をつ書います。フルーツの名前が15あるので0から14までのインデックスをとるように指定しています。
import random
self.index = random.randint(0,14)
あとはこのindex変数を使ってラベルに問題を表示させてやります。
self.q_label2 = tk.Label(self, text=QUESTION[self.index], width=15, anchor="w", font=("",20))こ
これでランダムな問題が出てきます。今の段階では起動時にランダムにお題が出てくれば良いです。この場合は"peach"。
問題が出てこれでタイプしてreturnで決定、判定としたいところですが、今returnを押すと"Return"とそのまま出てしまいます。そこ
def type_event(self, event):
キータイプするメソッドの中で"Return"を押すと、正確にタイプできているかを判定させます。
まず、ifとelseを使って大きく場合わけです。"Return"が押されなければそのままキータイプ。"Return"が押されれば判定をします。
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="正解!", fg="red")
else:
self.result_label.configure(text="残念!", fg="blue")
else:
self.ans_label2["text"] += event.keysym
これで判定ができますが、判定が終われば、今タイプしている文字を消して、新しい問題を表示させたいので、正解、残念の判定に引き続き処理を書きます。
解答欄をクリアします。
self.ans_label2.configure(text="")
そして次の問題を出題します。ランダムインデックスを選びそれに対するリストからフルーツの名前を表示させます。
self.index = random.randint(0,14)
self.q_label2.configure(text=QUESTION[self.index])
これで、問題が出て自分でタイプして正誤判定が行えるコードとなりました。ここで問題が一つ。ちょっとタイプミスをして修正したい場合に削除したいときの処理が必要です。その処理が以下。
if event.keysym == "Return":と同じレベルで、"elif"を使って、もし"BackSpace"が押されれば1文字ずつ削除をするようになっています。
elif event.keysym == "BackSpace":
text = self.ans_label2["text"]
self.ans_label2["text"] = text[:-1]
全体コードは以下となります。
def type_event(self, event):
if event.keysym == "Return":
if self.q_label2["text"] == self.ans_label2["text"]:
self.result_label.configure(text="正解!", fg="red")
else:
self.result_label.configure(text="残念!", fg="blue")
self.ans_label2.configure(text="")
self.index = random.randint(0,14)
self.q_label2.configure(text=QUESTION[self.index])
elif event.keysym == "BackSpace":
text = self.ans_label2["text"]
self.ans_label2["text"] = text[:-1]
else:
self.ans_label2["text"] += event.keysym