
マイケル
みなさんこんばんは!
マイケルです!
マイケルです!

エレキベア
クマ〜〜〜〜〜

マイケル
今日はPythonを使った簡単なクイズゲームを作っていくよ!

エレキベア
Pythonでゲーム開発は初めてクマね
急にどうしたクマか
急にどうしたクマか

マイケル
実は最近この参考書にハマっていてね・・・

マイケル
入門書ではあるけど、ゲーム作成について
CUIでの表示から本格的なRPG作成
まで幅広く書かれているんだ!
CUIでの表示から本格的なRPG作成
まで幅広く書かれているんだ!

エレキベア
ゲーム開発もPythonも好きなマイケルにはもってこいクマね

マイケル
その通り!
基本のロジックを学び直す意味でも、たまにPythonで簡単なゲームを作っていこうと思ったんだ!
基本のロジックを学び直す意味でも、たまにPythonで簡単なゲームを作っていこうと思ったんだ!

エレキベア
Unityは便利クマが内包的な部分も多いクマからね

マイケル
便利が故の難点だね。
それじゃさっそく作っていこう!
それじゃさっそく作っていこう!
Wikiクイズゲームの設計

マイケル
今回作るのは、 Wikipediaから情報を取得して出題するクイズゲームです!
参考書に載っていたクイズゲームのサンプルに、スクレイピング処理を加えてカスタマイズしたものになります!
参考書に載っていたクイズゲームのサンプルに、スクレイピング処理を加えてカスタマイズしたものになります!

マイケル
CUIアプリということで、コンソールで出題して解答するだけの簡単なゲームです。


エレキベア
Wikiから情報を取得するのはいいアイデアクマね
でもどうやって取得するクマ?
でもどうやって取得するクマ?

マイケル
実はWikipediaでは「http://ja.wikipedia.org/wiki/Special:Randompage」
のURLを指定すると、ページをランダムに取得することができるんだ!
のURLを指定すると、ページをランダムに取得することができるんだ!
この仕組みをうまく使って、
① Wikipediaのページをランダム取得
② スクレイピングで必要な情報を取得し、クイズ形式に加工
という内容で実装しようと思うよ!

エレキベア
なるほどクマ
これなら起動する度に問題も変わって割と遊べそうクマね
これなら起動する度に問題も変わって割と遊べそうクマね

マイケル
どうなるか楽しみだね!
それじゃ実装に入っていこう!
それじゃ実装に入っていこう!
Wikiクイズゲームの実装
ライブラリのインストール

マイケル
まずはPythonで使用するライブラリをインストールします!
今回は、スクレイピング処理でbeautifulsoup4、計算処理でnumpyを使用するので下記コマンドでインストールしておきましょう!
今回は、スクレイピング処理でbeautifulsoup4、計算処理でnumpyを使用するので下記コマンドでインストールしておきましょう!
pip install numpy
pip install beautifulsoup4
↑ライブラリのインストール実装

マイケル
そして実装は以下の通りです!
出題する問題の数だけWikipediaの情報を取得する内容となっています。
出題する問題の数だけWikipediaの情報を取得する内容となっています。
import requests
from bs4 import BeautifulSoup
import numpy as np
# 出題数, 正解数
question_count = 3
answer_count = 0
for i in range(question_count):
# Wikipediaからランダムページ取得
load_url = "http://ja.wikipedia.org/wiki/Special:Randompage"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
# 単語と説明文(一行)を取得
answer = soup.find("h1").text
question = soup.find("p").text
# 説明文の名称部分までのインデックスを取得
# 検索ワード:「)」「)」「は、」
index_list = [question.find(')'), question.find(')'), question.find('は、') - 1]
index_list = [i for i in index_list if i >= 0]
# 最短の検索結果までの文字列を???で置換
if len(index_list) > 0:
index = np.min(index_list)
question = "??? " + question[index + 1:]
# 問題出力
print("[問" + str(i + 1) + "]")
input_word = input(question)
if input_word == answer:
print("正解でやんす")
else:
print("残念でした!!")
print(" 正解 => " + answer + "\n")
print("*** 結果発表 ***\n" + str(answer_count) + "/" + str(question_count) + " 問正解!!")
↑クイズゲームの実装(全体)
エレキベア
コード量も少ないしシンプルな構造クマね
ランダムページ取得処理

マイケル
Wikipediaのランダムページ取得はこの通り!
先ほどインストールしたbeautifulsoup4を使って取得しています。
先ほどインストールしたbeautifulsoup4を使って取得しています。
・・・略・・・
# Wikipediaからランダムページ取得
load_url = "http://ja.wikipedia.org/wiki/Special:Randompage"
html = requests.get(load_url)
soup = BeautifulSoup(html.content, "html.parser")
・・・略・・・
↑クイズゲームの実装(ページ取得)スクレイピング処理

マイケル
そしてメインとなるスクレイピング処理は以下の通りです!
・・・略・・・
# 単語と説明文(一行)を取得
answer = soup.find("h1").text
question = soup.find("p").text
# 説明文の名称部分までのインデックスを取得
# 検索ワード:「)」「)」「は、」
index_list = [question.find(')'), question.find(')'), question.find('は、') - 1]
index_list = [i for i in index_list if i >= 0]
# 最短の検索結果までの文字列を???で置換
if len(index_list) > 0:
index = np.min(index_list)
question = "??? " + question[index + 1:]
・・・略・・・
↑クイズゲームの実装(スクレイピング処理)
マイケル
Wikipediaのページは以下のようになっているので、
最初のh1、pタグから単語名と説明文を取得しています。
最初のh1、pタグから単語名と説明文を取得しています。
<h1 id="firstHeading" class="firstHeading" lang="ja">【単語】</h1>
・・・略・・・
<div id="bodyContent" class="mw-body-content">
<p>【説明文】</p>
・・・略・・・
↑Wikipediaページの構造
マイケル
あとは説明文内の単語部分を「???」に置き換えて質問文に設定し、
単語を解答に設定 すれば完成です!
単語を解答に設定 すれば完成です!

エレキベア
お手軽だったクマね〜〜〜〜
おわりに

マイケル
よ〜し、それじゃ早速プレイしてみよう!!


マイケル
むっず〜〜〜〜!!!
かすりもしないよ・・・!!!
かすりもしないよ・・・!!!

エレキベア
(クソゲークマ・・・。)

マイケル
ジャンルの絞り込みや、正解の範囲調整など、
調整次第でもっと遊べるようになると思うので、
ぜひみなさんもオリジナルのWikiクイズゲーム作成にもトライしてみてくださいね!
調整次第でもっと遊べるようになると思うので、
ぜひみなさんもオリジナルのWikiクイズゲーム作成にもトライしてみてくださいね!

エレキベア
エレキベアも作ってみるクマ〜〜〜〜〜

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜〜〜〜
【Python】Wikipediaをスクレイピング してクイズゲームを作る
コメント