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

タイピングゲームの日本語全文字対応を行っていきます。

がんばるぞー(*ノωノ)

まずはこちらの記事にタイピングゲーム作成前準備を載せています。

読んでない方は読んでおいてほしいです。

まずは、ひらがなを分解する処理をする関数を作っていきます。

辞書型の単語帳とローマ字のつづり辞書を用意します。(ローマ字つづり辞書は固定ページ・タイピングゲームのところにおいてあります。)

ひらがなからローマ字のつづり辞書を用いて最短で打てるローマ字列に変換することを第一目標にします。

関数のコードです。(*´Д`)

def kana_divide(kana):                     #↓↓↓  ひらがな(kana)を分割しリスト化する関数(kana_divide)  ↓↓↓
     kana_separate = []                    #分割されたひらがなリスト(kana-separate["あ","し","た"] ← kana"あした")
     string_small = ["ぁ","ぃ","ぅ","ぇ","ぉ","ゃ","ゅ","ょ"] #小文字(string_small)の処理に使用
     ltu = ["a","i","u","e","o","n"]
     count = 1                             #小文字(string_small)の処理に使用
     judge = -1                            #「っ」の処理に使用

     for i in range(len(kana)):            #kanaの文字数分繰り返す
         if judge == i:                    #前回「っ」の処理をしていたら今回処理なし
             continue

         else:
             if i != 0 and kana[i-1] + kana[i] in string_dict:   #小文字の処理↓
                 b = kana_separate.pop(i-count)#ひとつ前の文字を削除
                 a = b + kana[i]   #ひとつ前の文字と合わせてリスト(kana_separate)に加える
                 kana_separate.append(a)
                 count += 1                #リストとiのずれを修正

             elif i != len(kana) - 1 and kana[i] == "っ" and string_dict[kana[i+1]][0][0] not in ltu:         #「っ」の処理↓
                 a = kana[i] + kana[i+1]   #次の文字と合わせてリスト(kana_separate)に加える
                 kana_separate.append(a)
                 judge = i+1               #次の処理を飛ばす判定に使用
                 count += 1                #リストとiずれを修正

             else :                        #通常の処理↓
                 a = kana[i]               #そのままリスト(kana_separate)に加える
                 kana_separate.append(a)

     return kana_separate                  #分割されたひらがなリスト(kana_separate)を返す

実際に使ってみたら

kana = "へっじふぁんど"
kana_separate = kana_divide(kana)
print(kana_separate)

出力結果↓↓

kana_divide関数を使うと、こんな感じにローマ字に変更する際に最も短く済むように細分化していきます。

“へっじふぁんど” ー→ [‘へ’, ‘っじ’, ‘ふぁ’, ‘ん’, ‘ど’] 

*pythonで書いているので型はそれほど気にしなくてもいいですが、C#で書く場合はstring型からlist<string>型への変換が行われています。*

詳しい説明を

下準備に使用する変数

     kana_separate = []                    #分割されたひらがなリスト(kana-separate["あ","し","た"] ← kana"あした")
     string_small = ["ぁ","ぃ","ぅ","ぇ","ぉ","ゃ","ゅ","ょ"] #小文字(string_small)の処理に使用
     ltu = ["a","i","u","e","o","n"]
     count = 1                             #小文字(string_small)の処理に使用
     judge = -1                            #「っ」の処理に使用

1行目 ひらがなの文字列をバラバラに分割する空のリストを用意する。

2,3行目 上の例を見てわかる通り、小文字等の処理をするのに使用する。

4,5行目 小文字の処理をする際のカウンター

↓↓for文の使用↓↓ ここでリストに加える処理を行う

for i in range(len(kana)):            #kanaの文字数分繰り返す

ふぁ、きゅ、しょ、みゃ、にょ などの文字セットはここで処理しています。

             if i != 0 and kana[i-1] + kana[i] in string_dict:   #小文字の処理↓
                 b = kana_separate.pop(i-count)#ひとつ前の文字を削除
                 a = b + kana[i]   #ひとつ前の文字と合わせてリスト(kana_separate)に加える
                 kana_separate.append(a)
                 count += 1             

「ふ」「ぁ」は、二つの要素としてリストに返すのではなく、ひとまとめにしてリストに返す。

これをしないと次の記事でかく関数内で、「fa」だけで済む打ち方を「hula」と変換してしまう。

Next→

っひ、っじ、っめ、っそ、っしょ、などの文字列はここで処理しています。

             elif i != len(kana) - 1 and kana[i] == "っ" and string_dict[kana[i+1]][0][0] not in ltu:         #「っ」の処理↓
                 a = kana[i] + kana[i+1]   #次の文字と合わせてリスト(kana_separate)に加える
                 kana_separate.append(a)
                 judge = i+1               #次の処理を飛ばす判定に使用
                 count += 1                #リストとiずれを修正

「っ」は、次の文字と合わせてリストに加える。

これをしないと「jji」で済む打ち方を「xtuji」と変換してしまう。

Next→

             else :                        #通常の処理↓
                 a = kana[i]               #そのままリスト(kana_separate)に加える
                 kana_separate.append(a)

特殊文字がない場合はそのままリストに加えることができる。(小文字処理以外はここで行われる。)

*例えば「あした」という文字列ならば「あ」「し」「た」とわけられるので、このelseに引っかかって処理が行われる。

最後に

return kana_separate 

returnを使って最初の文字列を分解したリストを返す。

“へっじふぁんど” ー→ [‘へ’, ‘っじ’, ‘ふぁ’, ‘ん’, ‘ど’]

これで文字を分解する作業は終わったので、次にそれらをつづり辞書を参考にしてローマ字に変換していく作業を行っていきます。その過程で、打ち方が複数るもの屁の対処の下準備を行っていきます。

感想

説明ムズイ。

日本語複雑。

勘弁してほしい。

コメントを残す

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