DOBON.NETプログラミング道掲示板

ツリー一括表示

Nomalアイコン C#コンソールアプリでタイピング練習ソフト作成 /yulico mexicali (20/04/06(Mon) 14:58) #34454
Nomalアイコン Re[1]: C#コンソールアプリでタイピング練習ソフト作成 /Hongliang (20/04/06(Mon) 19:31) #34455
  ├Nomalアイコン Re[2]: C#コンソールアプリでタイピング練習ソフト作成 /yulico mexicali (20/04/07(Tue) 07:40) #34456
  └Nomalアイコン Re[2]: C#コンソールアプリでタイピング練習ソフト作成 /yulico mexicali (20/04/07(Tue) 08:22) #34457 解決み!


親記事 / ▼[ 34455 ]
■34454 / 親階層)  C#コンソールアプリでタイピング練習ソフト作成
□投稿者/ yulico mexicali 一般人(1回)-(2020/04/06(Mon) 14:58:50)
  • アイコン環境/言語:[windows7 sp1 32bit .NET Framework 4.5] 
    分類:[.NET] 

    C#のコンソールアプリでタイピング練習ソフトを作成しています。

    概要としては、
    ---------------------------------------
    english
        ↓

    ---------------------------------------
    この様に、横座標ランダムで表示された文字列が、再下段に到着するまでにタイピングを完成させる、というようなものを作成中です。

    問題点は、文字列は一定間隔で1行ずつ落ちていきますが、そのループ中にキー入力をどうすれば良いのかが解りません。

    一応、自分なりに調べて試行錯誤しているソールを載せます。

    環境:Windows7 sp1、Visual Studio 2019 Community


    int s = Environment.TickCount;

    Random rnd = new Random(s++);

    int r = rnd.Next(60);
    int c = rnd.Next(5);

    string[] word = new string[] { "english", "franch", "spanish" };

    for (int l = 2; l < 22; l++) {
    if (Console.KeyAvailable) {
    for (int i = 0; i < word[c].Length; i++) {
    if (word[c].Substring(i, 1) != "*") {
    if (Console.ReadKey(true).Key.ToString() == word[c].Substring(i, 1).ToUpper()) {
    word[c] = word[c].Substring(0, i) + "*" + word[c].Substring(i + 1, word[c].Length - (i + 1));
    }
    }
    }
    }

    if (l > 2) {
    Console.SetCursorPosition(0, l - 1);
    Console.Write(new string(' ', 80));
    }

    Console.SetCursorPosition(r, l);
    Console.ForegroundColor = ConsoleColor.Green;
    Console.Write(word[c]);
    Console.ForegroundColor = ConsoleColor.Gray;

    System.Threading.Thread.Sleep(500);
    }


    文字を入力し始めると、一旦とまり、最後まで正しく文字列を入力すると、全ての文字が*になり、そのまま落ちていきます。

    やりたい事は、止まらずに、文字列の左から、正解したらリアルタイムに*に変わっていく処理です。

    よい方法はないでしょうか・・・
違反を報告
[ □ Tree ] 返信 削除キー/

▲[ 34454 ] / ▼[ 34456 ] ▼[ 34457 ]
■34455 / 1階層)  Re[1]: C#コンソールアプリでタイピング練習ソフト作成
□投稿者/ Hongliang 大御所(577回)-(2020/04/06(Mon) 19:31:46)
  • アイコンConsole.KeyAvailableを確認した後、word.Lengthのfor文内でConsole.ReadKeyしてますよね。
    なのでここでキーがword.Length回入力されるまでReadKeyでブロックされます。

    1. 次回1段進む目標時刻を算出しておく
    2. KeyAvailableがtrueならReadKeyし、必要に応じ画面を更新する
     2.1. すべての文字が入力されればゲームクリア
    3. 現在時刻が目標時刻に達していなかったら2に戻る
    4. 1段進めて、段数がオーバーしていなければ1に戻る
    5. ゲームオーバー

    こんな感じで考えてみてはどうでしょうか?
違反を報告
[ 親 34454 / □ Tree ] 返信 削除キー/

▲[ 34455 ] / 返信無し
■34456 / 2階層)  Re[2]: C#コンソールアプリでタイピング練習ソフト作成
□投稿者/ yulico mexicali 一般人(2回)-(2020/04/07(Tue) 07:40:45)
  • アイコンご回答ありがとうございます。

    この方法でテストしてみます。

    後ほど結果の報告しますので、まだこのスレは閉じません。

    ありがとうございました。
違反を報告
[ 親 34454 / □ Tree ] 返信 削除キー/

▲[ 34455 ] / 返信無し
■34457 / 2階層)  Re[2]: C#コンソールアプリでタイピング練習ソフト作成
□投稿者/ yulico mexicali 一般人(3回)-(2020/04/07(Tue) 08:22:50)
  • アイコン結果報告です。

    > なのでここでキーがword.Length回入力されるまでReadKeyでブロックされます。
    この文章をヒントに、とりあえずbreakしてみようと追加してみました。

    一応、解決しました。

    if (Console.ReadKey(true).Key.ToString() == word[c].Substring(i, 1).ToUpper()) {
    word[c] = word[c].Substring(0, i) + "*" + word[c].Substring(i + 1, word[c].Length - (i + 1));

    break; ←追加行
    }

    この度は、ご回答くださり、本当に助かりました。

    ありがとうございました。


解決み!
違反を報告
[ 親 34454 / □ Tree ] 返信 削除キー/


Mode/  Pass/


- Child Tree -