2018年12月14日

タイパー Advent Calendar 2018の14日目の記事です。

タイパーアドカレですがプレイヤー側の話が多いのでタイピングソフト制作側の話を書いてみたいと思います。
タイピングゲーム製作者がタイパーとは限らないですがタイピングソフトを作ってみたいタイパー向けです。
作る気がなくてもタイピングゲームの中身を知りたい人にもおすすめです。

ローマ字による日本語タイピングでは英語タイピングやかな入力による日本語タイピングと違って複数の入力パターンがあることが特徴です。
今回はそこそこ簡単に、まあまあいい感じにローマ字の打ち分けをする方法を考えていきたいと思います。


1. 英語タイピングの判定


まず表示されるワードと入力すべき文字が同じで、対象の文字を打つ方法が1つしか無い英語タイピングについて考えましょう。
タイピングゲームにはいろいろな方式がありますが、今回考えるのは正しい文字を打ったら次の文字へ進み、ミスタイプした場合はミス数が増えて行くものを考えます。
「word」という単語があった場合「w」を打ったら次の文字oが打つ対象になり、「o」を打ったら次へ進むといった感じですね。
word
用意された文字列の今見る位置の文字と入力された文字が同じだったら進む、違っていたら進まない(ミス)という比較的簡単な方法で作ることができます。
最後まで行った時間を測るか時間内にどれだけ進んだかをスコアにすればタイピングゲームの完成です。

ポイント1. 用意した文字と同じ文字が入力されたら次に進む


2. 日本語をやってみる


日本語入力タイピングと英語タイピングの違いとして表示する文字列と打つ対象のキー入力に対応する文字列が別であるということです。
「価格」というワードがあったら入力対象は「kakaku」という感じで別になっています。
「kakaku」というローマ字だけ扱うタイピングソフトは一般的ではないですね。
また、日本語タイピングでは同じワードでも複数の入力パターンがあります。
そのため、英語とは同じようにはいきません。

「価格」というワードですが
kakaku
kakacu
kacaku
cakaku
kacacu
cakacu
cacaku
cacacu
と8通りの入力パターンがあります。(今の所「qu」→「く」のパターンは無視します)
まず簡単に打ち分けなしで一番上の「kakaku」を入力するソフトを考えましょう。

「価格」というデータを用意してもコンピュータは勝手に「kakaku」というデータに変換してくれないので、打つ対象のワードとして「kakaku」をセットで用意します。
{「価格」,「kakaku」}こんな感じですね。こうすることで表示用は左側の漢字、入力用は右側のローマ字を使うようにします。

右側のローマ字は英語タイピングと同じように判定することができます。

ポイント2. 表示用のワードと入力用のワードを分けてペアにする

3. ローマ字を選べるようにする


このままでは「kakaku」1通りの打ち方しかできないので打ち分けに対応する方法を考えていきましょう。
「価格」には8通り(quに対応するともっと)のパターンがありますがそれぞれは「かかく」という読みをそれぞれ変換したものと考えることができます。
なので
{「価格」,「かかく」}
という漢字とひらがなのペアを用意してひらがなの方をうまく変換してローマ字を作ることにします。

よくあるタイピングソフトでは複数のパターンが存在するひらがなからローマ字への変換の方法を選ぶものがあります。
例えば今回の対象では「か」と「く」をそれぞれ「か」→「ka」と変換するか、「か」→「ca」と変換するかを選んでローマ字に変換します。
例えば「か」→「ca」、「く」→「ku」を選んだ場合「かかく」→「cacaku」と変換されます。
このように打つ対象をひらがなとして、ローマ字に変換するロジックを挟むとひらがなに対応するローマ字を選ぶことができるようになります。
実装するときの小ネタとしては「きょ」を変換したいときに先に「き」→「ki」と変換してしまうと「きょ」→「kiょ」→「kilyo」となってしまうので先に「きょ」→「kyo」と変換するようにする必要があったりします。
このような方式ではひらがなとローマ字が1対1で対応してしまうため「kacaku」など同じひらがなを異なるローマ字で打つパターンはできません。
同じひらがなをワードによって違うローマ字で打ったりとかもできません。
ただしひらがなとローマ字の対応を選べるようになりました。

ポイント3. ひらがなをローマ字に変換することでパターンを選ぶことができる


4. 打ち分けに対応する


やっと本題です。
上に上げた方法ではひらがなとローマ字が1対1対応してるため同じひらがなでもワードによって違うパターンで入力するといったことができません。
8通りのパターンを用意してそれを選んでもらうという手もなくはないですがすべてのワードを予めパターンを選ぶのは非常に大変ですし、毎回場合によって違うパターンを使う場合などには対応できません。
簡単に用意でき、毎回どのように打っても大丈夫なようにするにはどうすればいいでしょうか。
「かかく」というワードに対応する各パターンで重要な点は「cかk」どちらでも正解という点です。
なので「かかく」というワードがあれば最初の文字はcまたはkだったら1文字進め、それ以外はミスという扱いにすればいいということになります。
でどうするか結論を言ってしまうと「kakaku」と「cacacu」を用意してどちらかのローマ字に入力文字が一致したら次の文字へ進むという方法です。
まず1文字目に「k」が入力された場合「kakaku」の1文字目と一致されているので正解として1文字進めます。また、「c」を打った場合でも「cacacu」の1文字目と一致しているので1文字進めます。
kでもcでもなければミスタイプとして扱います。
ここで重要なのは「k」を打って「kakaku」の1文字目と一致して1文字進んだ場合に次の判定は正しく打った方の「kakaku」だけでなく「cacacu」の方も2文字目が対象となることです。
こうしておくと8パターンすべてで正しく文字を進めることができます。
kakaku
このような判定方法を使うと今まで無視してきた「kakaqu」というパターンにも簡単に対応することができます。
「kakaku」,「cacacu」,「kakaqu」を用意しておけば「cakaqu」のように打っても問題ないということになります。
「kakaku」,「cacacu」,「kakaqu」の3つのパターンは「かかく」からそれぞれプログラムで作ることができます。

このようにひらがなを「か行をkで打つパターン」と「か行をcで打つパターン」と「くをquで打つパターン」を用意しておけば入力したときにパターンを選ぶことができるようになります。
ここまででローマ字の打ち分けが完成です。

ポイント4. 複数の打ち方を用意しておき、どれかと一致したら正解とする

このままでもいいのですがいくつか問題があります。
細かい実装方法は書きませんがいくつか問題点のみ挙げていきます。

1. 2文字以上のまとまりで打ち分けがある場合
例えばこのような方法では「かちょう」というひらがなでは「kachou」と「catyou」のパターンが作られますが「kathou」と入力しても正解とされてしまいます。
「kathou」と打った場合に変換されるひらがなは「かてょう」です。ミスとして扱ってほしいですね。
他にも「がっこう」とかも「gakcou」で通過できてしまったりします。
なのでこういう場合はどちらを打ったか固定するなど細かい対応が必要になったりします。

2. 文字数が変わる場合
「じゃ」をローマ字に変換する場合「ja」と「zya」がありますが文字数が違うため最初にjを打ってもzを打っても反対側のパターンでは文字数がずれてしまいます。
このような場合ではこれまでの方法は使えません。
タイプウェルの場合はzを打つと表示されていたjがyに変わってyを打つようになってますね。
他にも「ち」→「ti」,「chi」などがあります。
1文字程度の文字数の違いは例外を入れて対応できますが、大きく文字数が変わる場合(「jilya」など)はこれまで書いてきたロジックを細かく対応させるより別のロジックを使ったほうがいいでしょう。
タイピングソフト制作の方針としてこのように文字数が変わる場合は対応しない(少ない文字数のものを強制する)というのもアリでしょう。

以上そこそこ簡単に、まあまあいい感じにローマ字の打ち分けをする方法でした。
これを見てタイピングソフトを作る人が増えればいいなーと思います。

ソフトを作らない人も一見正しいローマ字しか受け付けないように見えるよくできたタイピングソフトでも実は間違ったパターンで入力できたり面白い部分が発見できるかもしれないのでいろいろ試したり、ロジックについて考えてみるのも楽しいのではないでしょうか。

(00:00)

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔