タイピングゲームを作る | マーブルルール

タイピングゲームを作る

LabVIEW Games

スポンサーリンク

この記事で扱っていること

タイピングゲームを作る方法

を紹介しています。

キーボード操作に楽しく慣れるための方法としてタイピングゲームがあります。

世の中に出回っているタイピングゲームは、当然ゲームを作った人が決めた単語、言葉に対してタイピングを行っていくことになりますが、これはつまりゲームを作る側になれば好きな言葉でタイピングゲームができるようになるということです。

LabVIEWでも簡易的なタイピングゲームであればそこまで難しいことをせずに作れるので、その一例を紹介しています。

スポンサーリンク

どんな結果になるか

フロントパネルにはゲーム画面として2Dピクチャ表示器、ゲームのジャンルを選べるためのリング制御器、かかった時間を表示する数値制御器、タイピング入力のための文字列制御器が配置されています。

プログラムを実行してジャンルを選択します。

ジャンルはあらかじめ用意しておいた、問題文を定義しているcsvファイルのファイル名がそのまま表示されるようにしています。

ジャンルを選んだら問題が開始されます。

同じジャンルでも、毎回出題される問題はランダムになります。

今回のプログラムではローマ字入力かどうかは関係なく、全く同じ日本語文字列を入力したら次に進めるといったゲームとしています。

プログラムの構造

自作でタイピングゲームを作る醍醐味は、自分で問題を作れることです。

そのために、各問題文はあらかじめcsvファイルとして用意しておき、これらをgenreフォルダに入れておきます。

csvファイルの中では、各行に問題を書いていきます。

今回のプログラムではcsvファイルのファイル名が、ユーザーがプログラム実行時に選ぶジャンルの名前になるので、それらしいファイル名にしておきます。

上記のファイル、フォルダが用意されている前提で、以下のLabVIEWプログラムを紹介していきます。

なるべく簡単に実装することを目指すのであれば、シンプルなステートマシンが適しているので、今回は1つのループのみのステートマシンで構成していきます。

本来は、イベントストラクチャを使用した「効率のいい」プログラムにするべきですが、今回のように入力の早さを競うようなプログラムの場合にはいっそのことイベントストラクチャを使用しない方が作りが簡単です。

ステートは5つ用意します。

プログラムがどのような状態であっても停止できるように、停止ボタンが押されたかどうかの判定はケースストラクチャの外で行っています。

各ステートでは以下のような実装としています。

まずinitステートでは、制御器等を初期化していきます。

今回のプログラムで多用することになる、「ポイントにテキスト描画」(関数パレットのグラフィック&サウンドパレットの中のピクチャ関数パレットにあります)ではUser-specified Fontを選び、フォントやそのサイズを指定します。

今回はフォントとして明朝を選んでいますが、別に何でも構いません。

また、2Dピクチャの描画範囲サイズプロパティを定数で指定していますが、この定数も以下の図の通りである必要はありません。(ただ、文字を描画する位置は調整が面倒だと思うので、もしその調整をしたくない、ということであれば、この描画範囲サイズプロパティの定数含め、以降のブロックダイアグラム図で指定している文字列表示の座標位置定数を図の通りに指定してください)

他のステートで使用することになるパラメータをクラスタで持っておき、その中のproblem counter等の制御器にはデフォルト値を入れておきます。

initステートで使用しているget genre list.viというサブVIでは、先ほど用意していたcsvファイルの、拡張子を含まないファイル名を配列で取得しています。

genreフォルダがどこのパスにあるかを正しく指定する必要があることに注意してください。(下の図の例では、今回のプログラムをプロジェクトファイル、lvprojとして管理している前提で、そのプロジェクトファイルと同じ階層にgenreフォルダがある状態の場合の指定となっています)

次のselect genreステートでは、ユーザーがジャンル決定のボタンを押すまで同じステートを繰り返すようにしています。

ジャンル決定ボタンがTrueになると中のケースストラクチャがTrueとなり、problem listが更新されます。

サブVIとして使用しているget problem.viは、ジャンルとして指定した問題文csvファイルの中の問題文を抜き出して、ここから問題数(今回は5問としています)をランダムに抽出するという処理を行っています。

抜き出している部分の数を変えれば問題数は好みに変えられるので、ユーザーが選択できるようにしても面白いと思います。

ready countステートでは、タイピングを始める前のカウントダウンを表示させるという処理を行っています。

別にこのステートはなくてもいいのですが、このステートがないとジャンルを選んでいきなり問題が始まるようになります。

なお、経過時間のExpress VIからの出力である経過時間(秒)出力を3.99から引いている処理がありますが、もしこの定数を3.99ではなく3とすると、実際の動作としては3が表示されてすぐに(1秒待たずに)2が表示されるようになるため、なるべく3を1秒近く表示させるためにこのような値を使用しています。

引き算した結果を切り下げ整数化して、さらに文字列に変換して、これを2Dピクチャに表示させます。

main gameステートがタイピングゲームの本体ですが、やっていることは大したことはなく、problem listにある文字列と、ユーザーが入力欄に入力した文字列が一致しているかどうかを判定し、一致していたら入力欄をリセットしかつproblem counterを1増やすように処理しています。

このステートは常に10ミリ秒周期で回り、problem counterが指定回数(今回は5回としています)に達したらfinishステートに向かうようにしています。

また、経過時間はティックカウントの関数を用いて最初に実行されてからの時間を引くことで計算しています。

ちなみに、入力欄である文字列制御器を制御器パレットから取り出したままの状態で使用している場合、このプログラムだとうまくタイピングゲームとして成り立ちません。

動作自体はしますが、問題の文章をタイプしてから、文字列制御器以外の部分をクリックしないと、入力した内容が確定しないので、正しく判定が行われません。

つまりクリックの手間が入ってしまい、時間を競うゲームとしては面白みが薄れてしまいます。

そこで、入力した文字をすぐに確定させるための処理として、文字列制御器の設定で「タイプ中に値を更新する」にチェックを入れてください。

最後のfinishステートでは終わりと表示させるだけのシンプルな構成としています。

長い文章に対応させる場合

問題文を自由に作れると、好き勝手な文章でタイピングゲームを作れるわけですが、たまには難しい(?)長い文章も問題にしたくなります。

ただし表示する部分の大きさは有限であるため、問題文が一行だと収まりきらないということが起こりえます。

これだと不便なので、改行も許した問題文にすることで対応します。

この場合、ユーザーが入力するのも当然問題文と同じ場所で改行しなければ正解にならないようにしています。

改行するためには問題文に改行を入れていてもいいのですが、今回は問題文(csvファイルの中身)で、改行したい部分に半角スペースを入れて、プログラム中でその半角スペースを改行文字と置換するようにしました。

こうすることで問題文は常に1行で記述することができます。

半角スペースを改行文字に置換する場合には、文字列の検索と置換関数を使用できます。

実装時にはmain gameステートの以下の部分にこの仕組みを設けます。

時間が減っていく作りにする場合

上で紹介したプログラムは、決まった問題数を解き終わるタイムを測る形式でした。

そうではなく、最初に持ち時間が決められていて、時間が尽きるまでに何問できるかを競う形式にしても面白いと思います。

早くタイピングできると残り時間が少し増え、その分記録を伸ばせる、といった具合です。

少しの改造だけでこのような異なったルールにできるので、そのやり方を紹介します。

まずは、問題数の変更です。

上のプログラムでは5問と設定していましたが、時間を競うのではなく解ける数を競うので、問題数はもっと用意します。

そのために、get problem.viで5問と限定していた部分を無くします。

メインプログラムでは、main gameステートを変更します。

改造の一例は以下の通りです。

今まで経過時間を扱っていた部分の仕組みは残し、「最初の制限時間+(解いた問題×5)-経過時間」を残り時間としています。

(以下の図で複合演算を用いている部分の一番下の入力は「反転」して引き算になっています)

最初の制限時間は以下の図では30(秒)としていますが、これは好みで変えて構いませんし、問題を1問解くごとに加算される時間も以下では5秒としていますが別の値に調整も可能です。

このステートからfinishステートに行く条件は、残り時間が0を下回った場合、あるいは用意していた問題すべてを解き終わった場合としています。

あとは、finishステートも少し改造し、プログラム終了時に何問解けたかを表示させます。

溶けた問題数はproblem counterにあるので、その値を文字列に変換するだけです。

本記事では、LabVIEWでタイピングゲームを作る方法について紹介しました。

なるべく、ステートマシンの構造さえ理解できれば実装できるようなシンプルな形のプログラムをこころがけたため、LabVIEW初心者の方が取り組みやすいかと思うので、腕試しとして参考になればうれしいです。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました