TOP サイトマップ お小遣い タイピングゲームを作る講座 ゲーム DIABLO
チャット BBS リンク集 顔文字 逆アクセスランキング

Flashでタイピングゲームを作ろう講座
〜タイピングアルゴリズム1〜

タイピングゲームの作り方については講座内で作成法を学べばできますが、 ここではそのタイピングソフトのアルゴリズム的なことを考察しようと思います。

アルゴリズムとは作成しようとしている物がどうやったらできるか? というような事です。


1.タイピングソフトの基本概念

1-1.基本的な仕様

まずタイピングソフトであればタイピングソフトの種類にもよりますが、ローマ字入力のタイピングソフトであれば 入力させる文字を日本語、ローマ字、タイピングした文字を出力しなければ なりません。 ここでは日本語、ローマ字のどちらかを表示しない仕様であったとしてもできます。 これ以降は日本語、ローマ字、タイピングした文字を出力するという仕様で話しを進めていきます。

タイピングがスタートしてから終了するまでただ単にタイピングが成功していった時に終了とした場合、 これではタイピング能力の上達を促す事ができません。 そこで、タイピングが成功した時に成功数をプラス、失敗した時に失敗数をプラス。 タイピングに制限時間を設け、無理なタイピングや精神的な苦痛を避けます。 その数値を元にタイピングの成功率、タイピングのレベルなどをタイピング終了時の結果として出力します。

最終的にタイピングのレベルを設定させるとした場合、内部的にレベルを設定するのではかなりの問題点がでてきます。 そこで幾人かのテストプレイヤー(初心者から上級者まで)にプレイしてもらい、そのレベルの平均値を『標準』、 平均値から最小値を『初心者』、平均値から『最大値』を上級者と設定します。 『初心者』、『上級者』の中でも小さくわけてレベルを細かく設定していきます。

テストプレイヤーの人数やそのプレイヤーのレベルの平均がどこにあるかによって、そのレベル自体が意味をなさない 場合もありえます。 そこで、プレイしてもらった人の点数や成功数などのレベルの指標となるものをランキング形式で表示することにより、 プレイデータが取得できるので、そのデータを元にレベルの再構築ができます。

1-2.デザインの仕様

実際にタイピングソフトが実行される前に、タイピングがスタートするスタートボタンや、キーセッティング、 ランキングの観覧、ヘルプなどのボタンを設け、タイピングがスタートする以外の項目を設けます。

(1)スタートボタンが押されたらタイピングがスタートするが、スタートボタンを押してすぐにタイピングが始まったのでは、 準備ができずにいきなりタイピングしなければならない。そこでスタートボタンが押された後にカウントダウン数字を 表示して、タイピングの準備をする時間を与える。

(2)キーセッティングボタンはタイピングの入力方法をユーザー毎に設定してもらうものであるが、入力方法を自動的に判別し、 成功と間違いを判別する機能を搭載する場合この機能は必要ない、キーセッティングについてのアルゴリズムは後述する。

(3)ランキングの観覧はプレイしてもらったユーザーの得点をランキング化したものを表示する。 このランキング機能を搭載するためにCGIを使って、ユーザーの名前やメールアドレス、HPのアドレスなどを 入力してもらうこととする。

(4)ヘルプボタンはタイピングソフトの使い方などの情報を表示し、ユーザーがプレイの仕方を覚えられるようにする。

次にタイピングのメイン画面、日本語、ローマ字、タイピングが成功した文字を出力するテキストを表示する。 タイピングソフトではその3つのテキストと初心者用にキーボードの配置と現在打つべき文字を点灯させるなどの 処理があると便利。


2.詳しい仕様

2-1.出力するテキストに関して

実際に詳しい仕様を考えてみる。画面上に以下の3つの文字列があるとする。

『走れオレンジ君』 /*日本語を出力*/
『hashireorennjikun』 /*ローマ字を出力*/
『ha』 /*タイピングした文字列を出力*/

一番上が日本語を出力するテキスト、真ん中がローマ字を出力するテキスト、一番下がタイピングした文字を出力するテキストである。 実際にこれらのテキストを出力する時に、日本語、ローマ字は関連付けて最初に設定されていなければならない。 一番下のタイピングした文字列の部分はローマ字を出力したテキストから導かれるので設定の必要はない。

onClipEvent(load){
 randomnihongo=new Array("オレンジ","かがやかしい","ホームページ");
 randomroma=new Array("orennji","kagayakashii","ho-mupe-ji");
 randomchi=Math.floor(Math.random()*randomnihongo.length);
 this.nihongo=randomnihongo[randomchi];
 this.roma=randomroma[randomchi];
}

上記のスクリプトのようにタイピングが始まったら用意しておいた日本語とローマ字で対応しているものをランダムに選び、 テキストとして出力する。

ここで問題となるのが問題作成時に日本語とローマ字をそれぞれ対応する順番に記述しなければならない。 またローマ字の自動判別機能やキーセッティングがない場合作り手の勝手な入力方法をタイピングさせる事になる為 あまり使い勝手がよくない。
もし入力方法を指定してソフトを使用してもらうとしても、作り手側での問題作成のミスが発生する可能性が大きいだろう。

そこで、日本語とローマ字の二つの文字列郡を順番にそれぞれ書くのではなく、ひらがなをローマ字に変換させるという 方法もある。
簡単に言えば、『あ』→『A』、『か』→『KA』
と、ひらがなの文字列だけ作成しておけば、スクリプトで勝手にローマ字を作成させようというものだ。
このスクリプトができたならば、入力方法をユーザーに設定させるキーセッティングを作成した場合に、 例えば、『つ』は『tu』、『tsu』と二通りの入力方法があるが、
ユーザーがキーセッティングで『tu』という入力方法を選択した場合

『つまらない』というひらがなはそれぞれ対応するローマ字を出力させ、
『つ』→『tu』、『ま』→『ma』、『ら』→『ra』、『な』→『na』、『い』→『i』
と変換し、それぞれローマ字変換したものを連結させて、『tumaranai』という文字列を作成することができる。
こうすることでユーザーにキーセッティングで入力方法を設定してもらいそれに応じて文字列を変化させるということが 実現できる。
ただこの方法にも実は問題があり、完全な設定を作る事が難しい。その理由については後述する。

出力するテキストについても問題が発生する。
問題のテキストとタイピングしたテキストは近接して表示しなければならない為、長い文章の問題を作った場合に、 テキストがはみだしたりしてしまう。
問題のテキストを段落にわけて表示する場合、タイピングした文字も段落になって表示されなければならない為に、 どのようにしたらテキストがうまく表示されるかも考えなくてはならない。

2-2.表示するタイプ情報に関して

さて、タイピングをしながら正解数や失敗数、それらを元にした得点などをタイピング時に表示した方が良いのか? ということに関して、実際タイピングしながら他の情報を見ているのか?という問題が一番になる。
ほとんどの人が『次にタイピングする文字しか見ていない』という結果になるであろう。
なぜならタイピングに集中する為に他の情報は見る暇がないのだ。
それを見ている一瞬の間でさえタイピングは続いているわけで、その一瞬でタイプ結果が悪くなってしまう。
こう結論付けてしまうと、タイピングゲームなどでアニメーションやグラフィックをもちいていていても あまり見られていないのでなくてもいいんじゃないか?ということになってしまう・・。

だが実際文字以外の情報などが現れてそれを見る場合もある。
アニメーションと同時に文字列自体が動くものであったり、タイピングをしている途中に小休止があるようなゲーム、 または複数の文字列が同時に出現していくつかの文字列から打つべき文字列を選択するゲームなどである。

そういったゲームでなければ現在の正解数や失敗数、正解率などの表示はタイピングが終わった後の結果画面での 表示で十分ではないだろうか。
そういった理由からタイピング中に表示する情報としては打つべき文字列と制限時間などのタイピング終了条件など が表示されていれば問題ないだろう。

2-3.結果表示に関して

タイピングが終了した後に結果の表示を行うタイピングソフトがほとんどであろう。
それではどんな情報を表示すればユーザーにとってありがたい情報となるのか?
ユーザーが知りたい情報としては何文字打って何回正解、何回失敗したか、タイピング成功率、 それらの情報による得点、その得点がどの程度のレベルなのか、今までプレイした中で何番目の得点なのか。 という情報になる。
また繰り返しプレイすることによっての成長度がわかるもの、どのキーを打つときによく間違えるのかという 苦手キーの表示などであろう。

情報の中で『どの程度のレベルなのか?』という情報を与える『得点』という情報に関して、この得点をどう 算出するか?というのも重要な事柄である。
これは作り手の考えによって得点法というものが変わるかもしれない、基本的にはタイプが成功した時に得点アップ、 タイプミスした時に減点するという方法であろう。
ただ、日本語入力の場合、文字を打ち間違えた時に削除して新しい文字を入力するという作業が発生する。 だがローマ字入力のタイピングソフトの場合この削除機能がなく、正解するまで文字を打ち続けるという点で 通常のタイピングとは異なる部分が発生している。

そこで問題となるのが、タイピングが速い人はどうして速いのか?ということである。
キーの場所を指で覚えていてキーボードを見ないで素早く打てる人であろう。
そこで、素早く打てるようになるにはキーボードの位置を指で覚えかつ間違いが少ない事であり、 得点法は間違いをした場合は減点の度合いを多くするということである。
しかし間違いが多くてもタイピングが速い人もいる。
しかし間違いが多くタイピングが速い人と間違いは少ないがタイピングは普通の人との差はさほどないので、 ここでは間違いによっての減点を多くするという手法を取る。

では実際にどんな得点方法を用いればよいのか?
タイプが成功した時にプラス、失敗した時に大幅に減点としタイピングは制限時間がきたら終了とする。
正解数、失敗数をそれぞれ設定して得点を導くとする。
以下にサンプル例を示す。

200*2-40*4=320-160=240(正解:200、失敗:40)
200*2-41*4=318-164=236(正解:200、失敗:41)

上の例は単純に正解数×2−失敗数×4として得点結果を求めている。
この結果同じ正解数で失敗数が1違う場合4点の差がでる。この得点法であれば失敗を少なくし、多く正解をすれば 得点がアップすることがわかる。

しかしこの得点法であると失敗数が正解数の二分の一になると得点が0になってしまう。
さらに失敗数がそれより多くなると得点がマイナスの得点となってしまう。
これでは得点としてどの程度のレベルなのかわからなくなってしまうという問題がある。
マイナスの得点結果が出た場合すべて0にしてしまう事もできるがこれでは0点以下の場合に すべて同じ0という得点になり、自分のレベルがどの程度なのか?ということがまったくわからない。

そこで得点がマイナスにならないように得点法を決める。
失敗数によって減点するのではなく、減点ではない方法で失敗数を得点に反映させてみる。
失敗数が反映されてるデータは正解率なので正解率を使用する。
例えば制限時間を100秒とした場合

(正解数/制限時間)×300+(正解率×10)としたら
100/100×300+40×10=700(正解:100、失敗:150、総タイプ数250)
200/100×300+40×10=1000(正解:200、失敗:500、総タイプ数600)
200/100×300+39×10=990(正解:200、失敗:501、総タイプ数601)

上のようにすると正解数が同じでも失敗がひとつ多いと10点違ってくる。
(厳密に言うと小数点を加味してないので10点の違いはでなく1点ほどしか変わらない)
確かにこの計算方法であればマイナス点はなくなるし、ひとつの打ち間違いによって得点も変わってくる。
しかしこの場合の得点は1000点という高得点でわかりづらいので、なるべくなじみやすい100点までの方式を取り、 小数点以下3位ぐらいまでを使って個々の得点の差をだしていきたい。
小数点まで細かく採点し、かつなじみやすい100点法を取り入れることができれば、個人の得点の差をわかりやすく 得点化することができる。
得点法にタイプ速度も加味するのであれば、終了判定を制限時間ではなく正解した数の制限を設けて、 制限の正解数に達したら終了という様に仕様変更するのもよい。

今までの例は最初に挙げてきた失敗数が多い場合に大幅にペナルティーを与えるという事から 離れてしまっているので、失敗数が多い場合は得点が低くなるように考えてみる。
なので正解率によって得点差が多くなるようにする。

正解数+正解率×3としてみる。

200+83.333×3=449.999(正解数200、失敗数40)
200+82.987×3=448.961(正解数200、失敗数41)

例えば上の例のように200文字ぐらい正解してタイピングが終了する場合、 小数点第3位までを有効数字として計算に入れたとすると、失敗数が1違う時に 0.038点違う。
この得点を100点前後で表示する為に5で割るとすると、
449.999/5=89.999
448.961/5=89.792
これで100点前後でしかも得点の差を出す事ができる。
このように細かい得点で評価する場合、細かいレベルを設定しなければいけないので、 どの程度のレベルなのか?ということをよく考慮しなければならない。

タイピングアルゴリズム2ではキーセッティング、入力方法自動判別機能について 考察する。(まだ作成中・・・)

前に戻る 講座のTOPへ戻る 次に進む