百人一首クイズゲームを作ってみた!
なかなかいい感じにできたので満足だぜ。
記事①:ローカルとweb上のcsvファイルを読み込む ~Pythonで百人一首クイズを作ろう ep 1~
記事②:classを使おう!さらにゲームの完成へ ~Pythonで百人一首クイズを作ろう ep 2~
記事③:ゲームのBrushUp ~Pythonで百人一首クイズを作ろう ep 3~
過去3回で、「百人一首クイズゲーム」をつくってみました。
そもそも、「class」を使うのが(裏)目的だったので、達成できていますね。
そこから始めたわけではないですが、百人一首から「ちはやふる」の話で少し(いやたくさん)脱線しましたが、息抜きも大事です。
では、出来栄えを振り返ってみましょう。
1.「百人一首クイズゲーム」どうだったか?
ep1でデータの取り込みをやりました。
ep2でクイズゲームを作り上げました。
ep3では、ep2で作ったゲームの不満点を改善しました。
結果、このクイズゲームで出来ることは、
①:ランダムに出題、ランダムな回答選択肢、正解した和歌を除外、という基本的を押さえたゲーム。
②:和歌の漢字とひらがな表示を選択できる。
③:出題をかるたの読み上げを意識したようにゆっくり表示
④:歌人から和歌を、和歌から歌人をあてるゲームに拡張
となりました。
概ね満足です。
本当は、正答率を表示するとかも考えましたが、過去にやったのと同じなのでやりませんでした。
問題は、プログラムが長すぎる事です。最終的に157行!!
結構繰り返して同じような部分がまだあるので、もっと簡素化できたと思います。
2.今回使ったテクニック
今回使ったテクニックを挙げてみましょう。
①:ローカルファイルに保存したcsvファイルの取り込み
難しいテクニックではないはずでしたが、文字コーディングで引っかかりました。
学習する例題では’utf-8’で固定でしたが、百人一首のような古い字体を使ったものではNGでした。
やっぱりアウトプットは大切ですね!
②:WEB上のcsvファイルをスクレイピングで取り込み
ここで使ったモジュールは「csv」「StringIO」「requests」の3つです。
ほぼ定型のプログラムでうまく取り込めました。思ったより簡単にいけてしまいました。
仕組みがよく分からなかったので、細かく試しましたが、「ファイルオブジェクト」なるものが存在することが分かりました。
これは、printでは中が見えず、決まった手順で開かないと中が見えないというモノという感じで理解しました。
③:pandasモジュールでWEB上のcsvファイルを取り込み
よく分からない状態で「pandas」を使ってcsvファイルを取り込んでみました。
結果、表の状態で取り込むことが出来ました。
今回は使いませんでしたが、今後使いそうなテクニックです。
そもそも「panadas」はデータ分析で非常に重要なモジュールらしいので、勉強必要ですね。
④:「class」の定義
csvファイル内のデータの形式が一定であることを利用してclassでまとめました。
何が苦労したって、csvファイルで取り込んだ100のデータをclassでまとめる作業でした。
結果として、辞書型のデータを利用してなんとかしましたが、正攻法だったのかは不明です。
⑤:「class」内で関数の定義
つくったclassの中で関するを定義しました。
これは、このclassのデータに適応できる関数です。
⑥:ゆっくり表示(time.sleepの利用)
timeモジュールのsleepを使って文字を一文字ずつゆっくりと表示させることが出来ました。
本来、このsleepはプログラムを一旦停止するもので、WEBデータにアクセスする際に外部のサーバーに過度な負荷を与えないために使うことが多いようです。
ついでにprint(”, end =”, flush = True)という、処理を即実行する方法も学べました。
⑦:その他
①~⑥には挙げないですが、基本的なテクニックやrandomモジュール等も活用しました。
こう見ると、今回は盛だくさんでしたね。
我ながら、課題設定が良かったと思います。初心者の教材としてはかなり良いのではないでしょうか?
3.「class」と「オブジェクト指向」
今回、初めて「class」を使ってみました。今回の裏テーマになります。
確かに、「class」は強力なツールであると実感しました。
ep2でクイズゲームを作り上げたところまでは、有効性がよく分かりませんでした。
しかし、ep3で細々とした改善を繰り返して思ったのは、自分の想定より改変箇所が少なくて済むという事です。
「しっかりとした形で定義づけしていること」と「class特有の関数に処理を渡していること」により小さい変更であれば、メインの関数をほとんど改変しなくて済みます。
その結果、エラーも出にくくなり、元の状態にも戻しやすかったです。
しかし、classで学んだ「継承」や「super」、「ポリモーフィズム」はまだ理解できていないですし、使い方もわかってません。
また、「オブジェクト指向」という概念については、まだ理解ができていません。
現在、書籍で勉強中ですので、近々紹介したいと思います。
4.WEBスクレイピングについて
今回はWEBスクレイピングにも挑戦しました。
見よう見真似でやりましたが、驚くほど簡単にできてしまいました。
ここまで簡単だったのは、csvファイルだったからというのが大きいですが、今後はWEBページのスクレイピングもどこかでやりたいと思います。(次回テーマでやるかも)
5.結び
今回も持てる知識(いや、それ以上)総動員でクイズゲームつくりをしました。
学習を始めて、早いもので1か月が過ぎましたが、確実にレベルが上がっていると感じます。
まだまだ作りたいモノはたくさんあります。というより、学習すれば増えていってます。
では、次の「おもちゃ」で!
PyQさんで勉強中!一緒にやろうぜ
コメント