現在、コンソールゲームを作成しようとしています。基本的な考え方は、ユーザーが多数のランダムな文字を取得し、これらの文字を可能な限り多くの単語にする時間が限られていることです。たとえば、有効な単語が「取得」、「取得」、「テスト」などである場合、ユーザーは[a、a、c、t、t、e、g、s、o、i]ユーザーの入力は、単語リストに存在するかどうか、およびそれが使用が許可されている文字で構成されているかどうかでチェックされます。残念ながら、このゲームのタイマーを実装して表示しようとするといくつかの問題があります。C# - ReadLine()を通じてユーザー入力のコンソールにカウントダウンタイマーを表示
注:私の初心者なので、私のC#の知識は非常に限られています。私はReadLineメソッド()関数でループが含まれているバックグラウンドスレッドを持っている瞬間
問題
。 「通常の」コードは、Sleep()関数で一時停止し、時間が経過すると続行されます。 hereに与えられた解決策に大いに触発されています。私が達成しようとしているのは、コンソールにタイマーを表示することです。これは、ユーザーが単語を何秒間入力するかを示します。しかし、私はこれを達成する方法を考え出していません。
次の理由により、私は解決策を検討することができません。 「通常の」コードが一時停止した後、ユーザー入力を求めるループを含むスレッドが中断することなくアクティブになるため、タイマーワードが存在する理由。これは、タイマーが印刷されるような中断がないことを意味します。私は、その機能を維持しながら、readline関数を定期的に「一時停止」する方法を知らない。
あなたに私の質問がありますが、これをどのように達成できますか?
コード
これは単に、この機能を含む単離されたコードの一部です。したがって、これらの単語は要件を満たしているかどうかについてはテストされません。
using System;
using System.Collections.Generic;
using System.Threading;
namespace UnderstandingThreading
{
class Reader
{
private static Thread inputThread;
private static List<string> userInput = new List<string>();
private static bool closeLoop = new bool();
static Reader()
{
inputThread = new Thread(reader);
closeLoop = false;
inputThread.IsBackground = true;
inputThread.Start();
}
private static void reader()
{
while (!closeLoop)
{
userInput.Add(Console.ReadLine());
}
}
public static List<string> ReadLine(int timeOutMilliseconds)
{
Thread.Sleep(timeOutMilliseconds);
closeLoop = true;
return userInput;
}
}
class MainClass
{
public static void Main(string[] args)
{
List<string> allEntries = new List<string>();
Console.WriteLine("Please enter random things for the next 5 seconds");
allEntries = Reader.ReadLine(5000);
for (int i = 0; i < allEntries.Count; i++)
{
Console.WriteLine(allEntries[i]);
}
}
}
}
Sebastiaan
ありがとう!それは素晴らしい仕事だと思われる!コードを理解するのに少し時間を費やしています。また、最後のコードブロックで最後の行に2番目の間違いがあるようです。 'Console.CursorVisible = true; currentLineCursorTopをコードする必要があります。 'be 'コードConsole.CursorVisible = true; '? – Fluous
ちょっと@Luc、私はあなたのコードに関して1つの質問があります。この行では、 'var t = Task.Delay(i * 1000).ContinueWith(_ => WriteTimeLeft());'ラムダ式を使用します。私はなぜここでラムダを使用するのか、なぜ "_"が渡されるのかは分かりません。あなたは説明したいですか?ありがとうございました! – Fluous
Hey @SebastiaanThuis、Console.CursorVisibleの行についてはまったく正しいですが、私は自分のコピー/パスを駄目にしています、それは修正されました) ラムダ式を使用すると、ContinueWithメソッドをパラメータとしてActionを取る必要があります。新しいアクションを作成するための最良の方法は、ラムダを使用することです。あなたのメソッドがパラメータを取っていないときにはコンベンションであるので、私は入れて、下線を引いています。あなたも見ることができます:()=> ... 詳細についてはこちらをご覧ください: - http://stackoverflow.com/questions/ 1382950/confusion-over-action-delegate-and-lambda-expressions –