タイピングゲーム、ひらがな→ローマ字への変更② Python/pygame

前回は、ひらがなを切り分けるところまでを行いました。今回やっていくのはローマ字への変換と追加のつづり辞書の作成です。

やっていくぞー(*´Д`)

初めにコードを

aditional_dict = {}
def kana_into_romaji(kana_separate):                                 #↓↓↓  分割されたひらがなリスト(kana_separate)をローマ字に変換する関数(kana_into_romaji)  ↓↓↓
     romaji_separate = []                                            #分割されたローマ字リスト(romaji_separate["a","si","ta"] ← kana_separate["あ","し","た"])
     judge = -1                                                      #「ん」の判定に使用
     nn = ["a","i","u","e","o","y","n"]                              #「ん」をnnで打たなければならない処理の判別
     aditional_list = []
     
     for i in range(len(kana_separate)):                             #分割されたひらがなリスト(kana_separate)の要素分繰り返す

         if kana_separate[i] in string_dict:
             romaji_separate.append(string_dict[kana_separate[i]][0])#綴り辞書(string_dict)から一つ目の打ち方をリスト(romaji_separate)に加える

         elif kana_separate[i] in aditional_dict:
             romaji_separate.append(aditional_dict[kana_separate[i]][0])

         else :
             string_list = string_dict[kana_separate[i][1:]]
             for j in range(len(string_list)):
                 a = string_list[j][0] + string_list[j]
                 aditional_list.append(a)
             aditional_dict[kana_separate[i]] = aditional_list
             aditional_list = []
             if len(kana_separate[i]) == 3:
                 string_list = string_dict[kana_separate[i][1]]
                 for k in range(len(string_list)):
                     a = string_list[k][0] + string_list[k]
                     aditional_list.append(a)
                 aditional_dict[kana_separate[i][:2]] = aditional_list
                 aditional_list = []
             romaji_separate.append(aditional_dict[kana_separate[i]][0])

         if judge == i and romaji_separate[i][0] in nn:
             romaji_separate[i-1] = "nn"

         if kana_separate[i] == "ん":
             judge = i + 1

             if i == len(kana_separate) - 1:
                 romaji_separate[i] = "nn"

     return romaji_separate, aditional_dict

今回のコードははっきり言って無茶苦茶むずいです。ほかにいい方法があるかもしれませんが一応自分にはこれしか無理なので進めていきます。

↓↓使ってみたらこうなります↓↓

romaji_separate, aditional_dict = kana_into_romaji(kana_separate)
print(romaji_separate)
print(aditional_dict)

一応最短のローマ字列に変換することができています。パチパチ👏

それに加えて、複数ある打ち方をするものがある場合は追加の辞書も作成することができています。

(「fa」は「hula」「huxa」)などの打ち方はありますがそれ絵の対応は次以降の記事で行っていきます。具体的にはタイピングシステムの中で対応していきます。)

詳しい説明を

・aditional_dict = {} 

1行目に複数の打ち方に対応できるようにするため、からの辞書を用意します。

・romaji_separate = []

分割されたローマ字リスト(romaji_separate[“a”,”si”,”ta”] ← kana_separate[“あ”,”し”,”た”])

・judge = -1  「ん」の判定に使用

・nn = [“a”,”i”,”u”,”e”,”o”,”y”,”n”] 「ん」をnnで打たなければならない処理の判別

・aditional_list = [] aditional_dictに新しい要素を加えるときに使用。

↓ここからが、本題の処理です↓

     for i in range(len(kana_separate)):                             #分割されたひらがなリスト(kana_separate)の要素分繰り返す

         if kana_separate[i] in string_dict:
             romaji_separate.append(string_dict[kana_separate[i]][0])#綴り辞書(string_dict)から一つ目の打ち方をリスト(romaji_separate)に加える

         elif kana_separate[i] in aditional_dict:
             romaji_separate.append(aditional_dict[kana_separate[i]][0])

         else :
             string_list = string_dict[kana_separate[i][1:]]
             for j in range(len(string_list)):
                 a = string_list[j][0] + string_list[j]
                 aditional_list.append(a)
             aditional_dict[kana_separate[i]] = aditional_list
             aditional_list = []
             if len(kana_separate[i]) == 3:
                 string_list = string_dict[kana_separate[i][1]]
                 for k in range(len(string_list)):
                     a = string_list[k][0] + string_list[k]
                     aditional_list.append(a)
                 aditional_dict[kana_separate[i][:2]] = aditional_list
                 aditional_list = []
             romaji_separate.append(aditional_dict[kana_separate[i]][0])

基本的には一番上のif文に引っ掛かります。

if kana_separate[i] in string_dict:
   romaji_separate.append(string_dict[kana_separate[i]][0])

綴り辞書(string_dict)から一つ目の打ち方をリスト(romaji_separate)に加える

へっじふぁんど の場合 へ「he」・ふぁ「fa」・ん「n」・ど「do」はここで処理をされています。

else文について

             string_list = string_dict[kana_separate[i][1:]]
             for j in range(len(string_list)):
                 a = string_list[j][0] + string_list[j]
                 aditional_list.append(a)
             aditional_dict[kana_separate[i]] = aditional_list
             aditional_list = []
       #割愛
       romaji_separate.append(aditional_dict[kana_separate[i]][0])

ここで 「っじ」 などの処理をしています。

複数打ち方があるやつはここでadditional_dictへの追加とadditional_dictのvalueの一番初めの要素をromaji_separateに加える処理をしています

↓ここからはほとんど使わない処理です。↓

             if len(kana_separate[i]) == 3:
                 string_list = string_dict[kana_separate[i][1]]
                 for k in range(len(string_list)):
                     a = string_list[k][0] + string_list[k]
                     aditional_list.append(a)
                 aditional_dict[kana_separate[i][:2]] = aditional_list
                 aditional_list = []

ひらがなの長さが3文字のやつです。こんなものはほとんどないのでスルーです。

一応例として「っふぁ」みたいなやつです。

「nn」の処理

         if judge == i and romaji_separate[i][0] in nn:
             romaji_separate[i-1] = "nn"

         if kana_separate[i] == "ん":
             judge = i + 1

             if i == len(kana_separate) - 1:
                 romaji_separate[i] = "nn"

一つ目のif文で nn = [“a”,”i”,”u”,”e”,”o”,”y”,”n”] などの「n」が二回必要な場合の処理をしています。

二つ目のif文で 一番最後の文字が「ん」の場合の処理をしています。

最後に

return romaji_separate, aditional_dict 

pythonでは気にしなくてもいいですが、一応補足として、romaji_separateはC#でいうList<string>型/aditional_dictはC#でいうDictionary型です。型の宣言が必要な言語は面倒くさいですね~。

以上が関数の説明です。使い方は下の通りです。

romaji_separate, aditional_dict = kana_into_romaji(kana_separate)

感想

今までの記事の中で断トツで一番ムズイ。

タイピングゲームの闇・日本語のバグです。

自分のゲームはこの方法をとっていますがほかにいい方法がある場合は教えてほしいです。(笑)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です