中学・高校・大学を海外で過ごしている日々のブログ

12歳から僕は日本の学校に行かずに海外に留学、移住しました。僕はWestlake Boys High Schoolという高校を卒業し、オークランド大学に通っています。

Unityで英単語が学べるタイピングゲームを作る記録 #3 正確性表示、過去に出てきた英単語に印をつけた

こんにちは!ニュージーランドで高校生をしている17歳の太朗@taroj1205です。現在、Westlakeという高校に通っています。

昨日の集会(Assembly)で話があったのですが、日本から高校生が数人Westlakeに短期留学しているようです。Director of International Studentsという役割の人に「I heard there is a Japanese exchange students here at Westlake this year again, feel free to ask me for any help.(今年も留学生が居るって聞いたけど遠慮なく助けを求めていいよ!)」って伝えたら長期留学している生徒が居たようで、「明日その生徒たちに会って話してあげて」と言われたので明日話に行ってきます。

それでは本題のゲームについて書いていこうと思います。

Unityでタイピングゲーム #3

過去に出てきた英単語に印をつけた

過去に出てきた英単語に*を付けるのは比較的簡単でした。

if (words > 0 && history[0].Contains(_eString))
{
    _jString += " *";
}

これは打った事がある単語リストに1つでも単語が入っていて履歴の英単語がある列(history[0])に出題された英単語(_eString)がある場合のみ実行されます。実行時にその単語(日本語)に*を追加します。

void Save()
{
    string eHistory = _eString;
    string jHistory = _jString;

    jHistory = jHistory.Replace(" *", "");

    string existingHistory = File.ReadAllText(GlobalVariables.historyPath);

    string history = eHistory + "," + jHistory;

    File.WriteAllText(GlobalVariables.historyPath, history + "\r\n" + existingHistory, Encoding.UTF8);
}

今のdictionary.csvだと過去に出てきた英単語が出題された場合、本当に*が表示されるのかがわからないので以下のように置き換えました。

english,日本語
a,あ
i,い
u,え
o,お

このcsvで動作確認して*がついたので機能追加完了です。

正確性表示

正確性の導入はとても大変でした。やったことは以下です。

  • csv正解,間違えのスコアを,で分けて保存しする
  • csvを読んで,で2つに分けて1つ目をcorrect、2つ目をwrongの関数に入れる。
  • 80%以上の場合は緑、未満の場合は赤の文字。
  • 小数点第一位まで表記する。
  • 計算方法は正解の数/(正解の数+間違えの数)です。計算方法がこれで良かったのか自信ないです。
void ShowAccuracy()
    {
        // Read all the lines of the file into a string array
        string[] statsData = File.ReadAllLines(GlobalVariables.statsPath);

    // split the line with comma separator
    string[] parts = statsData[0].Split(',');
    // assign the first part as correct
    int correct = int.Parse(parts[0]);
    // assign the second part as wrong
    int wrong = int.Parse(parts[1]);
    UnityEngine.Debug.Log(correct + "," + wrong);
    if (wrong == 0)
    {
        aText.text = "<color=#1fd755>" + "100%" + "</color>";
    }
    else if (correct == 0 && wrong > 0)
    {
        aText.text = "<color=#e06c75>" + "0%" + "</color>";
    }
    else
    {
        float accuracy = correct / (float)(correct + wrong) * 100.0f;
        accuracy = Mathf.Round(accuracy * 10f) / 10f;
        if (accuracy > 80)
        {
            string accuracyText = accuracy.ToString();
            aText.text = "<color=#1fd755>" + accuracyText + "%" + "</color>";
        }
        else if (accuracy <= 80)
        {
            string accuracyText = accuracy.ToString();
            aText.text = "<color=#e06c75>" + accuracyText + "%" + "</color>";
        }
    }
    string wCorrect = correct.ToString();
    string wWrong = wrong.ToString();

    string stats = wCorrect + "," + wWrong;
    File.WriteAllText(GlobalVariables.statsPath, stats, Encoding.UTF8);
}

この際詰まったの理由はゲームを2回目以降開く時、保存された正解率を表示することが中々できなかったからです。これはShowAccuracy();を置く場所を変えることで改善できました。

#TODO

TODOリストをアップデートしました。完了したものには取り消し線を入れます。

  • スタートメニュー
    • ここには設定、スタート、リセットなどのオプションを入れる予定です。
  • Escを押したとき用のメニュー
    • 現在、Escはリセット用のボタンですが、他のゲームにもあるようにゲームを中断するためのメニューにします。
  • スコア表示
    • +の時は緑、-の場合は赤など色もつけたいと思います。
  • 正確さの表示
    • 80%の時は緑、それ以下の場合は赤などにする予定です。
  • WPM表示
    • どのように計算して打っていない時の判断方法などは難しそうなので、最後の方に追加すると思います。
  • 単語リストを1つのcsvファイルにまとめる。
    • 1列目に英単語を置き、その横に和訳を置くと見やすくなり、編集もしやすくなるので変える予定です。
  • 過去に出た単語
    • 過去に出た単語をときどき出す。
      • 打ち間違えが多かった単語などもできると尚良し。
    • 過去に出てきた単語に印をつける。
      • 打った回数や正確性表示もありかも。

余分な部分を消すなどをして、コードを改善する。

コード

今回のC#スクリプトです。改善点や提案などがあったら教えてきただけると嬉しいです。

github.com

締め

ここまで読んでくださった方々、ありがとうございました。このブログが良いと思ったらツイッターのフォローとシェアをしていただけると嬉しいです。


ブログ村に参加しています。クリックしていただけると嬉しいいです!ランキングも上がります!