英単語学習ツール "Carvo" に得点加算機能を付けました

以前にこのブログでも紹介しました自作のPerl製英単語学習ツール "Carvo"ですが、

英単語学習ツール "Carvo" - 機能拡張&モジュール化してGitHubに公開しました - the code to rock

その時点でやりたいことはだいぶ反映してあったのですが、続けてみるとどうも、ゲーム性というか、やり続けたい、という気持ちを喚起/誘発する要素に欠けるな・・ほっておいても自然にやりたくなるような、射幸心を煽るまでは行かなくても、それに似た何かがほしいなあ〜、とは思っていて、とりあえず得点を加算できるようにしてみました。

note103/Carvo · GitHub

「とりあえず〜できるようにしてみました」とかサラッと言ってみましたが、上手く加算できてるのを見たときには飛び上がりそうなほど嬉しかったですね。

とはいえ、じつはそれもすでに10日ぐらい前の話で、というのも結局こういうのって仕事の合間とか寝る前みたいなときにしか手を入れられない&ようやく出来ても紹介するためのキャプチャ撮ったりブログ書いたりする時間もあまりとれない、とかなのでなかなか紹介できずにいたのですが、えいやって感じでREADMEの更新&新たなDEMO(得点加算バージョン)も作ってみました。

f:id:note103:20140629101633g:plain
Carvo/README.md at master · note103/Carvo · GitHub

あまり分かりやすくはないですが、正答すると「hit」、誤答は「error」、その両方の合計を「try」という感じに加算して適宜出力しています。

このツールでは途中で4つのモードを選択&切り替えできるのですが(「英→日」「日→英」「ショートバージョン」「ラージバージョン」の組み合わせ)、そのモード切り替えではリセットされず(得点保持)、最後にプログラム終了すると、総計スコアを出力して、そこでリセットされます。
プログラム終了しても記録に残るといいんですが、そこからはもうデータベースの登場になるんでしょうか。

あと、最初は「hit」のみ加算していくつもりだったのですが、モチベーション的にはじつは誤答の加算も重要というか、その正答を得るためにどれだけの試行、トライを重ねたか、という点を記録に残したかったので、「hit/error/try(hit+error)」を出すことにしました。

ちなみに「error」(誤答)は「非正答」ではなくて、何かを入力してそれが間違っていた場合に加算されます。つまり何も入力せずに解答を見た場合にはノーカウント。これは別にそういう思想に基づいているのではなく、その方が作りやすかったのでそうしただけですが。

それから出力時に、

You tried 3 times. 2 hits and 1 error.

みたいなメッセージを出すようにしていますが、この「time(s)/hit(s)/error(s)」という単語の単数形/複数形を変えるのにも地味にif文を使ったりして、最初はそこで条件分岐せずに済む方法ないかな・・としばらく考えましたが(面倒なので)、ちょっと浮かばなかったので何とか頑張ってそのようにしました。

ソースコード的にはこんな感じで・・

sub plural {
    ($times, $hits, $errors) = @_;
    unless ($times == 1) {
        $times = 'times';
    } else {
        $times = 'time';
    }
    unless ($point == 1) {
        $hits = 'hits';
    } else {
        $hits = 'hit';
    }
    unless ($miss == 1) {
        $errors = 'errors';
    } else {
        $errors = 'error';
    }
}

今思い出しましたが、それ用の関数を別に立てて都度それを呼んでるんですね。おつかれさまです。

その辺のソースコード全体はこちらです。(上記の関数は現時点では一番下の方にあります)
https://github.com/note103/Carvo/blob/master/lib/Carvo.pm

得点加算の他にも地味にいくつか、気になっていた変なところや不便だったところに手を入れています。

たとえば、登録語の最後まで行ったとき、今までは「もう終わったよ!最初に戻って!」みたいなメッセージを出すようにしていたのですが(それですら単なるエラーじゃなくて独自メッセージ出すようにできただけで最初は満足していましたが)、それも自動的に(登録語のリミットを過ぎたら)最初に戻るようにしたり、他にもメッセージの整合性が合わないところを調整したり、とかそんな感じですね。

あとはもう、ひたすらやっていけばよいだけ! という感じなのですが、こうなると今度はまた新たな欲望が出てくるもので、ランダムモードに入ったら後はずっとランダムに出てくるとか(今は基本、語順に出てくる)、リバースモードにしたら逆順に出てくるとかしたいし、あるいは僕の場合はやっぱり英語の勉強とかしたい&できそうなときって基本、モバイル環境時だったりするので、同じようなレッスン(単語が出てきてそれの日本語訳or英語訳を回答する)をモバイルでサクサクできるようにしたいなあ〜、といったあたりが現時点での次のハードルです。

とはいえ、モバイル対応のためには、とりあえずWebアプリ化してそれをローカルのサーバーに上げて同ネットワークからアクセスできるようにして・・とかなのかなあ・・? あるいは自分用のiOSアプリを作るとか・・? どっちの方がより現実的かと言ったら、とりあえず前者でしょうかね・・わからないですが。

英語の勉強よりも英語の勉強ツールの作成、のための勉強の方が楽しい! というありがちなパターンになりつつありますが、まあそれはそれ、楽しみとしてやっていますから楽しいならどっちにせよ正解でしょう。

ちなみに、GitHub上のサンプルデータ(単語ソース)ですが、当初は10〜20語ぐらいだったのですが、あまりにこれじゃ少ないかと思って、ショートモード(単語少ない版)は50語、ラージモード(単語多い版)は200語、というふうにしてみました。
以前のよりは少しは楽しめるかもしれないです。

ちなみに自分の手元の単語データはショートで200語、ラージ版で1000語近くありますが、案外感覚的には、このサンプルの方でもあまり変わらない感じかもしれません。登録語の多少よりも、単に毎日やるかどうか、とかの方が重要な違いなのかも。

以上です。