【Python】漢字シャッフルクイズを作成:漢字の画像を出力

  • URLをコピーしました!
目次

漢字シャッフルクイズ

前に違う文字を探す脳トレを作成するプログラムを作ってみました。

こういうものって一つ作ったらもう一つ、もう一つと作っていきたくなるもの。

ということで今回からは新しいクイズのプログラムを作っていきます。

その名も「漢字シャッフルクイズ」。

どこかで見たかもしれませんが、こんな感じで漢字をバラバラにして、シャッフルした画像から、元の漢字を当てるというクイズです。

ちなみになんの漢字か分かりましたか?

答えは「斬」でした。

といった感じのクイズです。

まずはとりあえず動くプログラムを作る→関数化して、分かりやすくするという流れで作っていきます。

それでは始めていきましょう。

フォルダ構成

フォルダ構成ですが、まずはこんな感じになるようにプログラムを作っていきます。

ShuffleQuiz
├── ShuffleQuiz.ipynb
├── ShuffleQuiz.py
├── fonts
│   ├── Dela_Gothic_One
│   │   ├── DelaGothicOne-Regular.ttf
│   │   └── OFL.txt
│   ├── Hachi_Maru_Pop
│   │   ├── HachiMaruPop-Regular.ttf
│   │   └── OFL.txt
│   ├── New_Tegomin
│   │   ├── NewTegomin-Regular.ttf
│   │   └── OFL.txt
│   ├── Noto_Sans_JP
│   │   ├── NotoSansJP-Regular.otf
│   │   └── OFL.txt
│   ├── Potta_One
│   │   ├── OFL.txt
│   │   └── PottaOne-Regular.ttf
│   └── Shippori_Mincho
│       ├── OFL.txt
│       └── ShipporiMincho-Regular.ttf
├── question
│   ├── 0.png
│   ├── 1.png
│   ├── 2.png
│   ├── 3.png
│   ├── 4.png
│   ├── 5.png
│   ├── 6.png
│   ├── 7.png
│   ├── 8.png
│   ├── question.png
│   └── test.png
├── question.json
└── fonts.json

「ShuffleQuiz.ipynb」と「ShuffleQuiz.py」は今回のクイズを作るプログラムです。

前回の違う文字を探す脳トレではフォントはプログラムと同じフォルダに入れていましたが、雑多になるので「font」フォルダにまとめました。

「question」フォルダに問題の最初の画像(test.png)、バラバラにした画像(数字.png)、シャッフルした画像(question.png)が入ります。

「question.json」「fonts.json」はそれぞれ問題、使用するフォントのパスを記載したJSONファイル。

(最終的にはTwitterでツイートするために前回のようなTwitter API keyを記載した「settings.json」も準備しますが、今回はTwitterの部分は割愛します。)

「question.json」は「”問題番号”:”問題の漢字(一文字)”」という形式です。

{
    "1":"点",
    "2":"閲",
    "3":"山",
    "4":"斬",
    "5":"金"
}

「fonts.json」は「”フォントの名前”:”フォントの相対パス”」です、

{
    "NotoSans":"./fonts/Noto_Sans_JP/NotoSansJP-Regular.otf",
    "ShipporiMincho":"./fonts/Shippori_Mincho/ShipporiMincho-Regular.ttf",
    "DelaGothicOne":"./fonts/Dela_Gothic_One/DelaGothicOne-Regular.ttf",
    "PottaOne":"./fonts/Potta_One/PottaOne-Regular.ttf",
    "HachiMaruPop":"./fonts/Hachi_Maru_Pop/HachiMaruPop-Regular.ttf",
    "NewTegomin":"./fonts/New_Tegomin/NewTegomin-Regular.ttf"
}

シャッフル前の画像の作成

まずはシャッフル前の漢字の画像を作成するプログラムです。

ちなみにこんな漢字です。

import random
import json
from matplotlib import pyplot as plt
import matplotlib.font_manager as fm
%matplotlib notebook

with open('./question.json') as f_in:
    question_list = json.load(f_in)

question = question_list[random.choice(list(question_list))]
print(question)

with open('./fonts.json', 'r') as f_in:
    fonts_list = json.load(f_in)
    
font_path = fonts_list[random.choice(list(fonts_list))]
print(font_path)

fp = fm.FontProperties(fname=font_path)

fig = plt.figure(figsize=(6,6))
plt.clf()

plt.text(0.5, 0.4, question, horizontalalignment='center', verticalalignment='center', fontsize=400, fontproperties=fp)

plt.axis('off')
plt.show()
plt.savefig(f'./question/test.png', pad_inches = 0)

インポート部分

まずはインポートの部分です。

import random
import json
from matplotlib import pyplot as plt
import matplotlib.font_manager as fm
%matplotlib notebook

「random」、「json」、「matplotlibのpyplot」、「matplotlibのfont_manager」、「maplotlibのマジックコマンド」です。

問題をランダムに取得

次に問題を「question.json」からランダムに取得します。

with open('./question.json') as f_in:
    question_list = json.load(f_in)

question = question_list[random.choice(list(question_list))]
print(question)

最初の2行でjsonファイルを開いて、変数question_listに格納しています。

そして「list()」でリスト化したのち、「random.choice()」でランダムに問題を取得。

しかしこの取得方法ではキー側(問題番号)が取得されるため、question_list[キー]でその要素を呼び出しています

question = question_list[random.choice(list(question_list))]

ランダムにフォントを選び、フォントパスを取得

次にフォントを「fonts.json」からランダムに選択し、そのフォントのパスを取得します。

with open('./fonts.json', 'r') as f_in:
    fonts_list = json.load(f_in)
    
font_path = fonts_list[random.choice(list(fonts_list))]
print(font_path)

ここは先ほどの問題を「question.json」からランダムに選択し、その要素(この場合はフォントのパス)を取得する方法と同じです。

シャッフルする前の画像を作成

次にシャッフルする前の漢字の画像を作成します。

fp = fm.FontProperties(fname=font_path)

fig = plt.figure(figsize=(6,6))
plt.clf()

plt.text(0.5, 0.4, question, horizontalalignment='center', verticalalignment='center', fontsize=400, fontproperties=fp)

plt.axis('off')
plt.show()
plt.savefig(f'./question/test.png', pad_inches = 0)

最初の行は前回もやりましたが、matplotlibへのフォントの設定です。

今回、漢字をバラバラにするにあたって、画像のサイズが変わってしまうとプログラム上難易度が上がるので、今回は「fig = plt.figure(figsize=(6,6))」とサイズを一定にしています。

ちなみに「figsize=(6,6)」とすると縦600ピクセル、横600ピクセルの画像が出力されます。

漢字を出力する場所を決めているのがこの部分。

plt.text(0.5, 0.4, question, horizontalalignment='center', verticalalignment='center', fontsize=400, fontproperties=fp)

「horizontalalignment=’center’」と「verticalalignment=’center’」は文字の上下左右の中心で最初に記述した場所(この場合では 0.5, 0.4)に合わせるとしています。

「plt.axis(‘off’)」は軸全部を無くす場合に用いるコマンドです。

前回は軸線、メモリ線は消しましたが、X軸のラベルを宣伝用に用いていたため、このコマンドは使えませんでした。

最後に出力です。

plt.savefig(f'./question/test.png', pad_inches = 0)

前回はオプションに「bbox_inches=’tight’」を用いていましたが、これは余白部分をカットしてしまうオプションで、今回は画像サイズが変わってしまうと困るので使用しません。

ここまでで実行するとこんな画像が得られます。

今回は「閲」が出てきましたね。

次回はこの漢字をシャッフルした画像を作成する部分のプログラミングをしていきましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次