タイピングゲーム制作記の第三弾です。
前回から1週間と経たないうちに更新です。(*‘∀‘)
まぁ大幅な機能を追加したわけではないので、それほど時間がかからなかっただけです。
前回の記事
で伸ばし棒(-)や記号、数字の問題にも対応し、複数の問題文の排他制御をする機能を作成するということでしたが、
今回は伸ばし棒や記号、数字の問題に対応するだけにしました。( 一一)
今回作成したもの
今回は伸ばし棒や記号、数字の問題に対応するのと、シフトキーを押した時の処理、問題文の作り方の処理に対応しました。
伸ばし棒や記号、数字の問題に対応する
前回まででどんな入力方法をしても正解とする処理が出来ていましたが、伸ばし棒や記号数字の問題には対応していませんでした。
問題文の中に記号や数字などを入れると、平仮名→ローマ字の変換テーブルにキーがないのでそれようの処理をしていない為に「キーが見つかりません」というエラーになります。
変換時に変換テーブルにキーが見つからない場合はその文字をそのまま問題文に入れようとしました。
例えば「$4になります」という平仮名をローマ字に変換する時に変換テーブルには「$」や「4」というキーは登録していません。
そこで「$」や「4」等の変換テーブルにキーが含まれていないものはその文字をそのままローマ字変換後の文字として入れてしまいます。
$4になります。 → $4ninarimasu
こうすれば簡単かなと思ったんですが、こうするとタイピングした時の正解処理の所でも変換テーブルにその文字が見つからなかった時の処理を入れる必要があり結構面倒なことになりました。
というわけでやはり単純に平仮名→ローマ字の変換テーブルであるkeyTableに記号や数字等も入れてしまう事にしました。
以下は記号と数字部分の変換テーブル部分です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | // 入力キーテーブル public static Dictionary<string, List<string>> keyTable = new Dictionary<string, List<string>>() { {"!", new List<string>() {"!"}}, {"!", new List<string>() {"!"}}, {"\"", new List<string>() {"\""}}, {"#", new List<string>() {"#"}}, {"$", new List<string>() {"$"}}, {"$", new List<string>() {"$"}}, {"%", new List<string>() {"%"}}, {"%", new List<string>() {"%"}}, {"&", new List<string>() {"&"}}, {"&", new List<string>() {"&"}}, {"'", new List<string>() {"'"}}, {"’", new List<string>() {"'"}}, {"(", new List<string>() {"("}}, {"(", new List<string>() {"("}}, {")", new List<string>() {")"}}, {")", new List<string>() {")"}}, {"=", new List<string>() {"="}}, {"=", new List<string>() {"="}}, {"^", new List<string>() {"^"}}, {"~", new List<string>() {"~"}}, {"\\", new List<string>() {"\\"}}, {"|", new List<string>() {"|"}}, {"@", new List<string>() {"@"}}, {"`", new List<string>() {"`"}}, {"[", new List<string>() {"["}}, {"{", new List<string>() {"{"}}, {";", new List<string>() {";"}}, {"+", new List<string>() {"+"}}, {"+", new List<string>() {"+"}}, {":", new List<string>() {":"}}, {"*", new List<string>() {"*"}}, {"*", new List<string>() {"*"}}, {"]", new List<string>() {"]"}}, {"}", new List<string>() {"}"}}, {"、", new List<string>() {","}}, {"<", new List<string>() {"<"}}, {"。", new List<string>() {"."}}, {".", new List<string>() {"."}}, {">", new List<string>() {">"}}, {"/", new List<string>() {"/"}}, {"・", new List<string>() {"/"}}, {"?", new List<string>() {"?"}}, {"?", new List<string>() {"?"}}, {"_", new List<string>() {"_"}}, {"ー", new List<string>() {"-"}}, {"-", new List<string>() {"-"}}, {"0", new List<string>() {"0"}}, {"1", new List<string>() {"1"}}, {"2", new List<string>() {"2"}}, {"3", new List<string>() {"3"}}, {"4", new List<string>() {"4"}}, {"5", new List<string>() {"5"}}, {"6", new List<string>() {"6"}}, {"7", new List<string>() {"7"}}, {"8", new List<string>() {"8"}}, {"9", new List<string>() {"9"}}, {"0", new List<string>() {"0"}}, {"1", new List<string>() {"1"}}, {"2", new List<string>() {"2"}}, {"3", new List<string>() {"3"}}, {"4", new List<string>() {"4"}}, {"5", new List<string>() {"5"}}, {"6", new List<string>() {"6"}}, {"7", new List<string>() {"7"}}, {"8", new List<string>() {"8"}}, {"9", new List<string>() {"9"}}, } |
一部の記号や数字では半角や全角で問題を書いた時にも同じ変換を出来るように両方登録しておきます。
変換処理のメソッドやタイピングが成功したかどうかのメソッド内で処理するよりも変換テーブルに登録しておく方が処理を変更する必要がないので楽ですね。(^^)/
シフトキーの対応について
前回まででタイピング時の正解か失敗かの判断をする機能は作っていましたが、シフトキーを押した時にも正解処理をするようになっていました。
記号を打てるようにしたことでシフトキーを押す必要があり今までの処理だとシフトキーを押した時も正解か失敗かを判定し、正解の処理になってしまっていました。
理由としては、正解処理をする時に「今見ている問題の平仮名の入力方法」と「今入力したキー」と同じ文字列数分の比較で正解かどうかを判定している為、例えば「か」の平仮名を打とうとしている場合は「か」の変換テーブルは
1 2 3 | {"か", new List<string>() {"ka", "ca"}}, |
となっており「ka」「ca」の入力が出来ます。
前述したとおり、前回までは変換テーブルの入力法と今まで打った文字列数分の比較をして正解かどうかを判断していました。
その為、今「k」や「c」を打つ段階にある時にシフトキーを押すと、シフトキーを打った時のInput.inputStringは空の状態で文字数は0となっており。
変換テーブルと今まで打った文字列の0文字数分を比較する為、必ず正解処理をするようになってしまっていました。
そこで左のシフトキーと右のシフトキーを押している時は正解かどうかを判定しているメソッド内でそもそもの判断をする処理の前にreturnで呼び出し元に戻るようにしてそれ以降の処理をしないようにしました。
1 2 3 4 5 6 | // シフトキーの場合は無視 if(Input.GetKeyDown(KeyCode.LeftShift) || Input.GetKeyDown(KeyCode.RightShift)) { return; } |
これで左右のシフトキーを押した時は正解でも失敗でもなく無視することが出来ました。
問題分の作り方
問題文の作成方法は現時点でまだ決定してませんが、一つの文字列に問題文を詰め込み問題と問題との間の区切り文字を使って配列等に分割して作ろうと思っています。
例えば
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 問題文の文字列 private static string kanjiQuestionString = "え?そうなんだ 判断 $4になります。 ドラッグ&ドロップ 1+1=2 1.0/2.0=0.5"; private static string hiraganaQuestionString = "え?そうなんだ はんだん $4になります。 どらっぐ&どろっぷ 1+1=2 1.0/2.0=0.5"; // 個々の問題を入れる配列 private static string[] kanjiQuestions; private static string[] hiraganaQuestions; void Start() { // 問題文の文字列から個々の問題に切り分ける kanjiQuestions = Regex.Split(kanjiQuestionString, @"\s"); hiraganaQuestions = Regex.Split(hiraganaQuestionString, @"\s"); } |
上のように漢字の問題文と平仮名の問題文をスペースを区切り文字として一つの文字列を作成し、それを正規表現を使って\sのパターンと一致する部分を区切り文字として配列を作成します。
正規表現については
で使ったRegex.Splitを使います。
最初は区切り文字として「、」を使うと楽なので使っていたんですが、問題文の文章中にも読点(、)を使いたい事が多いのでスペースを区切り文字としました。
現時点ではスペースにしてますが、問題文を作成する時の事も考えていずれ別ファイルに問題文を1文ごとに改行し、ファイルから問題を読み取った後に改行コード(\n)を区切り文字として使う可能性もあります。
Regex.Splitを使うと区切り文字をパターンで指定出来るので、あまり使わないような「|」という記号を区切り文字としてこの記号自体は問題文に含めないというやり方でなく「||」というように「|」が2連続で来た場合に区切り文字として使うようなパターンを指定すれば「|」自体の問題も作成出来そうです。
ただ前述した問題文の作り方だと「||」という記号を問題の間に記述していかなければならず、そうとう面倒になりそうなので考えものかもしれません・・・・(-_-)
今回の成果物
今回作成した記号や数字の問題に対応する機能は
上のようになりました。
次回作成するもの
次回は複数の問題が出た時の排他処理を作っていく予定です。
既に入力途中の問題をキャンセルし、また複数の問題から選択しなおす機能も作成していきたいと思います。
終わりに
記号や数字の問題を出せるようにするには変換テーブルに登録するだけで対処出来ました。
ただそれに伴ってシフトキーの対応をして無かったためそれにも対応しました。
前回作った機能でほとんどタイピングの処理は出来上がっていたので、今回はそれにちょこっと追加したという感じでした。
こんな感じでちょこちょこ追加してればいつかは出来上がってくれると信じています。(´Д`)