多线程问题

时间:2013-06-06 19:10:42

标签: c# multithreading

我有这两个方法

    public void L1Timer()
    {
        Console.Clear();
        int score = tot;
        Console.Write("Chances : " + ch);
        Console.CursorLeft = 40;
        Console.Write("Marks : " + score);
        for (int time = 0; time <= 100000; time++)
        {
            Console.SetCursorPosition(65, 0);
            Console.Write("Time Elapsed : " + time + " Secs");
            Console.CursorLeft = 40;
            stime = time;
            Thread.Sleep(1000);
            Console.Beep();
            //Level1();
        }
    }

    public void Level1()
    {
        Console.WriteLine("\n\n");
        Console.CursorLeft = 40;
        Console.WriteLine("C _ _ E _ _ _ T _ _ N");
        Console.WriteLine("\n\n");
        tot = 0;
        while ((tot <= 70) && (ch > 0))
        {
            Console.Write("Guess : ");
            string gues = Console.ReadLine();
            switch (gues)
            {
                case "E": tot += 10; ch--; L1Timer(); Level1(); break;
                case "L": tot += 10; ch--; break;
                case "B": tot += 10; ch--; break;
                case "R": tot += 10; ch--; break;
                case "A": tot += 10; ch--; break;
                case "I": tot += 10; ch--; break;
                case "O": tot += 10; ch--; break;
                default: tot += 0; ch--; break;
            }
            Console.WriteLine();
        }
    }

我想首先执行第一个方法,然后使用第一个方法计时器继续执行第二个方法,但不延迟第二个线程......我试过这个

            Thread T1 = new Thread(new ThreadStart(L1Timer));

            Thread T2 = new Thread(new ThreadStart(Level1));

            T1.Start();

            T2.Start();

但它没有按照我想要的方式工作。它执行了第一个和第二个但是将光标带回第一个方法,它不允许用户键入第二个方法并回答问题......请帮帮我

1 个答案:

答案 0 :(得分:0)

这是基本想法: Console Word Game Example

运行它并观察右上角经过的时间。点击一些字母并检查分数/机会。点击Escape然后'q'或'r',看看会发生什么。

这只是一个简单的例子来演示“花式”控制台界面的流程。 我在这个“游戏”背后几乎没有真正的逻辑,你还没有在你的原始问题描述中以某种方式发布;因此我不认为这是“为你做功课。”这只是游戏中的“绒毛”。一个真正的任务可能会让你将游戏逻辑放入 Class 。如果您将类实例声明为静态,就像我使用“Score”和“Chances”变量一样,那么Main()之外的不同例程可以访问它并使用类“游戏状态”中的值更新屏幕。培养班级代表董事会和当前的博弈状态通常是任务的核心,也是你的重点所在。

希望它有所帮助...

class Program
{

    static int Score = 0;
    static int Chances = 10;
    static int promptX, promptY;
    static string board = "{No Board Loaded}";
    static System.Diagnostics.Stopwatch SW = new Stopwatch();

    static void Main(string[] args)
    {
        ConsoleKeyInfo cki;
        Console.Title = "Some Word Game";

        bool quit = false;
        bool gameWon = false;
        bool gameOver = false;

        while (!quit)
        {
            Reset();
            ShowBoard("C _ _ E _ _ _ T _ _ N");

            gameWon = false;
            gameOver = false;
            while (!gameOver)
            {
                UpdateStats();

                // make it appear as though the cursor is waiting after the prompt:
                Console.SetCursorPosition(promptX, promptY);
                if (Console.KeyAvailable)
                {
                    cki = Console.ReadKey(true); // don't display key
                    if (cki.Key == ConsoleKey.Escape)
                    {
                        gameOver = true;
                    }
                    else
                    {
                        // if it's A thru Z...
                        if (char.IsLetter(cki.KeyChar)) 
                        {
                            string key = cki.KeyChar.ToString().ToUpper();
                            Console.Write(key);
                            switch (key)
                            {
                                case "E":
                                    Score += 10;
                                    Chances--;
                                    break;

                                case "L":
                                    Score += 10;
                                    Chances--;
                                    break;

                                case "B":
                                    Score += 10;
                                    Chances--;
                                    break;

                                case "R":
                                    Score += 10;
                                    Chances--;
                                    break;

                                case "A":
                                    Score += 10;
                                    Chances--;
                                    break;

                                case "I":
                                    Score += 10;
                                    Chances--;
                                    break;

                                case "O":
                                    Score += 10;
                                    Chances--;
                                    break;

                                default:
                                    Score += 0;
                                    Chances--;
                                    break;
                            }

                            // ... possibly update the board somehow in here? ... 
                            // ... some board logic ...
                            // ShowBoard("updated board in here");

                            // set gameOver to drop out of loop
                            // also set gameWon if the user beat the board

                        }
                        else
                        {
                            Console.Write(" ");
                        }

                    }
                }

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

            if (gameWon)
            {
                // ... do something ...
            }
            else
            {
                // ... do something else ...
            }

            quit = QuitProgram();
        }
    }

    static void Reset()
    {
        // reset game variables and clock:
        Score = 0;
        Chances = 10;
        SW.Restart();

        Console.Clear();
        CenterPrompt("Guess: ");
        promptX = Console.CursorLeft;
        promptY = Console.CursorTop;
    }

    static void ShowBoard(string NewBoard)
    {
        board = NewBoard;
        Console.SetCursorPosition(Console.WindowWidth / 2 - board.Length / 2, promptY - 2);
        Console.Write(board);
    }

    static void UpdateStats()
    {
        // hide cursor while we update the stats:
        Console.CursorVisible = false;

        Console.SetCursorPosition(0, 0);
        Console.Write("Score: " + Score.ToString("000"));

        Console.SetCursorPosition(35, 0);
        Console.Write("Chances: " + Chances.ToString("00"));

        TimeSpan ts = SW.Elapsed;
        string totalTime = String.Format("Time Elapsed: {0}:{1}:{2}", ts.Hours, ts.Minutes.ToString("00"), ts.Seconds.ToString("00"));
        Console.SetCursorPosition(Console.WindowWidth - totalTime.Length, 0);
        Console.Write(totalTime);

        // ... add other output statistics in here? ...

        // turn cursor back on for the prompt:
        Console.CursorVisible = true;
    }

    static void CenterPrompt(string message)
    {
        Console.SetCursorPosition(Console.WindowWidth / 2 - message.Length / 2, Console.WindowHeight / 2);
        Console.Write(message);
    }

    static bool QuitProgram()
    {
        Console.Clear();
        CenterPrompt("Thanks for playing! Press 'q' to Quit, or 'r' to Retry.");
        while (true)
        {
            if (Console.KeyAvailable)
            {
                ConsoleKeyInfo cki = Console.ReadKey(true);
                switch (cki.KeyChar.ToString().ToUpper())
                {
                    case "Q":
                        return true;

                    case "R":
                        return false;

                }
            }
        }
    }

}