学校法人角川ドワンゴ学園 R高等学校の通学プログラミングコース所属、@dice00580572(通称:さいころ)です。
僕は半年間、ゲーム制作だのアプリ制作だの、いろいろなことをこの通プロで触れてきましたが、その中でも印象的だった「タイピングゲーム制作」について、この場で共有させていただきます。
制作の経緯
通プロコースに入学した僕は、「とりあえず何か制作するもの決めないとなぁ」と軽い気持ちで、やりたかったゲーム制作を始めました。
入学する前に使っていたPython、そのライブラリのPygameを使い、タイピングゲームの制作を開始。
「タイピングゲームなんてキー入力のやり方だけ知ってりゃ余裕っしょ🤣🤣🤣」
そう思っていた僕が馬鹿でした。
タイピングゲーム制作は伊達じゃない
「えっ、タイピングゲームなんてゲーム制作のチュートリアルみたいなもんでしょ?」
そう思った人もいるはず……
実際「ゲーム制作の教科書」みたいな本や教材で、タイピングゲームを最初のほうにやることは多々ある印象です。(個人の見解)
少なくとも僕は制作に入る前、そう思っていました。 ところがどっこい!
それはキー入力が半角に限った話です。日本語、つまりローマ字入力を扱い始めるともうすんごい面倒になっちゃうんだからっ!
ローマ字だと何が面倒?
例えば
「I killed 2704 people. If I could get out of the prison, I want to kill a lot of people.」
といった英文を記入するとします。
半角でアルファベットをキーを押して入力すればいいだけですね。誰だってそうする。僕もそうする。
次に
「情状酌量の余地なし」
という日本語の文章を記入します。
これは、ローマ字で入力すれば……とこのとき、人によって入力の仕方が異なる場合があります。
例えば「情状酌量」の「じょ」や「しゃ」、「余地なし」の「ち」や「じ」など、ローマ字入力の一部には、入力パターンが複数あるからです。
「入力パターンが複数ある」英数字のみの半角入力にはない特性。そして、この仕様に対応させるのが、とんでもなく面倒でした。
なぜなら、入力パターンが複数ある場合、入力するまでプレイヤーがどっちのパターンで入力するか未定だからです。
そのため、場合によっては「si」、「shi」と、リアルタイムでプレイヤーの入力に対応させる必要がありました。
そんなめんどっち〜仕様を僕はどうやって対応させたのか?
次はそのことについて語っていきます。
「入力パターンが複数ある」仕様への対応
とりあえず、実際に作ったゲームの画面を見てください。
一番上には入力する文字とそのふりがな、ローマ字
左にはスコアとコンボ(ノーミスでタイプした回数)
そして一番下には残り時間を表す黒いバー
とても、シンプルなデザインですね……どことなく、⚪︎⚪︎打を思い出させるような文字の配置をしています。
そして、文字の下のローマ字に注目してください。
「素晴らしい景色」にある二つの「し」のうち、1つめは「shi」、2つめは「si」と表記されていますね。
このタイピングゲームでは、ローマ字入力パターンのほとんどを対応させています。
どうやって対応させた
まず僕は、Pythonにローマ字入力をサポートさせるようなライブラリがないか探しました。
見つかりませんでした。 そのため、イチから自分で作成するハメになりました。
そこで僕はまず、日本語にある、あいうえおかきくけこ……といったひらがなプラス、濁音半濁音、促音拗音を含めた162文字を全て、辞書型で全ての入力パターンを割り当てました。
とんでもない脳筋戦法ですが、これが一番手っ取り早かったんです。
次に、その辞書をどう使うか。
僕はまず、お題のひらがな一文字ずつ入力パターンを確かめ、プレイヤーが使う入力パターンが確定したらそのパターンに合わせるといった方法を取りました。
……言葉だけでは少々表しづらいので、実際の例を出します。
例えば、「アシカ」という単語がお題だとします。
「あしか」
をローマ字にすると
「asi(shi)ka」
です。
中心の「し」は、プレイヤーが入力するまで「si」なのか、「shi」なのかがわからなくなっています。
一文字ずつ見ていきます。
「あ」
入力パターンは「a」のみなので、これで確定です。
「し」
入力パターンは「si」と「shi」の二つがあります。
「s」と入力します。
この時点ではどっちの入力パターンかわかりません。
次に「h」と入力します。
この時、「s」の後に「h」が来るパターンは「shi」のみのため、プレイヤーが入力しているパターンは「shi」で確定となります。
このように、ひとつずつひらがなを見ていき、プレイヤーの入力履歴に応じてパターンを確定させるといったプログラムを最初に作りました。
これならいけるか……と思ったのも束の間、まだ問題がありました。
厄介な拗音
それは「じゃ」や「しゃ」など、二文字を同時に入力できるもの。
先ほどの方法では、「じゃ」の場合「じ」と「ゃ」に分かれてしまい、デフォルトが「jilya」っていう気持ちの悪い入力パターンになってしまいます。
これに関しては、少しプログラムを変更して修正しました。
先ほどは、一文字ずつひらがなを分け、プレイヤーの入力と比較していました。
例 「社会」→ 「し」「ゃ」「か」「い」
それを、可能な限り要素を少なくしてひらがなを分けるプログラムに変えました。
例 「社会」→ 「しゃ」「か」「い」
また、プレイヤーが既に入力したひらがなは削除し、そこからさらに分けるようにしています。
つまりは、「社会」を記入する時、最初に「し」を入力したら、後の「ゃかい」のみを残し、同じように分ける……といった感じです。
かなり面倒なプログラムでしたが、試行錯誤の末、ほぼ全てのひらがなへの対応に成功させました。
ついにタイピングゲーム完成……?
と、思っていると!
っ。 ーローマ字入力の最も面倒な点についてー
このゲームは不都合に未完成でした。
ええ、見出しにもある通り、ローマ字入力史上最も面倒なひらがな、「っ(促音)」です。
何が面倒?
「っ」には入力方法として、「ltu」「xtu」「ltsu」「xtsu」と、四通り存在しますがそんなことはどうでもよくて。
例えば「バッタ」と入力するとしましょう。
「baltuta」と入力した人、いますか?いませんよね。
大半の人は、「batta」と、頭文字を二回繰り返す方法を用いて入力するはずです。
そう、この頭文字を二回繰り返す方法がもうももう面倒なのです。
面倒なところその1 『次の文字の頭文字が必要』
この方法を再現するには無論、次の文字の頭文字を取得する必要があります。
これはまだ「た」など、入力パターンが変わらないようなひらがななら救いはあります。
しかし、「じ」や「ち」など、入力パターンによって頭文字も変わるような文字が奇しくもあります。
これが面倒!なぜなら、「っ」を入力する時点では、次の文字はまだ入力パターンが確定していないからです。
例として「っち」を入力する場合、「cchi」なのか「tti」なのかが未定です。そのため、次の文字を参照し、「っ」の入力パターンも随時変える必要がありました。
面倒なところその2 『次の文字の入力パターンが「っ」の時点で変わる』
これはどういうことでしょうか?
先ほどの「っち」で考えましょう。
最初に、「t」と入力するとします。そして、「っ」はこれで入力となり、次の文字「ち」
に移ります。
「ち」は「chi」と入力しましょう。すると、入力パターンは「tchi」となります。
???
そう、「っ」と「ち」を別のものとして扱う際、このように入力パターンをバラバラにできてしまいます。これを対処するには前の「っ」の入力を記録し、「ち」にそれを当てはめるほかありません。
面倒なところその3 『頭文字を二回繰り返す方法が使えない場合もある』
例えば「っえ」や「あっ」、「っっっ」など、頭文字を二回繰り返す方法が使えない組み合わせがあります。
まるで過去形の不規則動詞ですね。
これが面倒。僕の場合、頭文字を二回繰り返す方法が使えないひらがなをリストに格納し、それを取り出すことで対応させました。
と、このように、「っ」はひらがなの中でも群を抜いて面倒な仕様となっています。
このせいで僕は一週間近く「っ」とトライ&エラー繰り返し格闘する羽目になりました。
しかし、執念でアルゴリズムを作成しなんとか対応させることに成功できました。
これが僕がプロクラに入って初めて作ったタイピングゲームとの格闘録でした。
……正直、もっと効率的なプログラム絶対あると思う
さいごに
いかがでしたでしょうか。
正直、作ったの半年近く前なので、自分でもどうやって作ったかよく覚えておらず、Qiitaで記事を書くのも初めてだったので、説明がわかりづらかったかもしれません。しかし、タイピングゲームは想像以上に作るのが面倒だということは伝わったと思います。
僕も作る前までは、タイピングゲームでここまで苦戦を強いられるとは思ってもみませんでした。
ですが、いろいろ試行錯誤し、トライ&エラーを繰り返し、なんとかゲームとして動かせるまでには完成できました。
最初の制作で、このような試行錯誤する力が身についたのは、とても良い経験になったと思います。
これからもこのN(SR)高で、様々な制作に触れていきたい、そういう所存でございます。
ここまで読んでくださったり、ありがとうございました。
