如何在C#中读取按钮混搭

时间:2018-11-26 16:41:05

标签: c# console-application

我一直试图在我的RPG中使用一个按钮混搭迷你游戏,但是我没有设法使其正常工作。这是我创建的代码:

using System;

namespace CounterAttack
{
class Program
{
    public static int n = 0;
    public static int buttonmash = 0;
    public static string buttonpressed;
    public static void CounterAttack()
    {
        n = 0;
        while (n < 4000)
        {
            buttonpressed = Console.ReadKey().ToString();
            System.Threading.Thread.Sleep(1);
            n = n + 1;
            if (buttonpressed == " ")
            {
                buttonmash = buttonmash + 1;
                buttonpressed = "a";
            }
            else
            {
                buttonpressed = "a";
            }
        }
        Console.WriteLine($"You pressed spacebar {buttonmash} times ");
    }
    static void Main(string[] args)
    {
        CounterAttack();
        System.Threading.Thread.Sleep(1000);
        Console.ReadKey(); 
    }
}

}

由于我未知的原因,该程序将不会退出while循环。这意味着我无法检查代码的其他部分是否可以正常工作。

所以我的问题是:如何更改此代码以读取空格键在4秒钟内被按下的次数?

4 个答案:

答案 0 :(得分:1)

“我一直试图在我的RPG中使用按钮混搭迷你游戏,但是我没有设法使其正常工作。”

您正在控制台应用程序中执行此操作。因此,答案是从“不容易”到“简单不可能”的范围。我希望其他人可以在该轴上为您提供更精确的答案。

游戏开发和GUI技术不能很好地融合在一起。那个旧的纸牌游戏几乎是您可以在其中进行的游戏的上限。控制台甚至比它匹配 less

所有严肃的游戏开发都是在游戏循环附带的任何环境中完成的。 XNA有点过时,但是对于.NET Core,有一些选择:https://www.microsoft.com/net/apps/gaming

答案 1 :(得分:1)

尝试一下:

class Program
    {
        private static int numSpaces = 0;

        static void Main(string[] args)
        {
            Thread th = new Thread(CheckSpace);

            th.Start();
            th.Join();

            Console.WriteLine($"You pressed space {numSpaces} times");
            Console.Read();
        }

        private static void CheckSpace()
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            while (true)
            {
                if (Console.KeyAvailable)
                {
                    if (Console.ReadKey().Key == ConsoleKey.Spacebar)
                    {
                        numSpaces++;
                    }
                }
                if (sw.ElapsedMilliseconds>= 4000)
                {

                    break;
                }

                Thread.Sleep(10);
            }
        }
    }

答案 2 :(得分:1)

@auberg的解决方案很好,但是您实际上不需要第二个线程。是的,在主线程上调用Thread.Sleep()是一个坏主意,但是在这么短的时间内执行它还是不明显的。

尝试一下:

 public static void CountKeyPresses()
 {
     Console.WriteLine("OK, start pressing the space bar");
     var numPresses = 0;
     var stopWatch = new Stopwatch();
     stopWatch.Start();
     while (stopWatch.ElapsedMilliseconds < 4000)
     {
         if (Console.KeyAvailable && Console.ReadKey().Key == ConsoleKey.Spacebar)
         {
             ++numPresses;
         }
         System.Threading.Thread.Sleep(10);
     }
     Console.WriteLine($"\r\nYou pressed the spacebar {numPresses} times");
 }

答案 3 :(得分:0)

这种排序有效,只要您在4秒钟计时器启动后按空格键即可。

    static void Main(string[] args)
    {
        var startTime = DateTime.Now;
        var n = 0;
        while (DateTime.Now < startTime.AddSeconds(4))
        {
            var key = Console.ReadKey();
            System.Threading.Thread.Sleep(1);
            if (key.Key == ConsoleKey.Spacebar) n = n + 1;
        }
        Console.WriteLine($"You pressed spacebar {n} times ");
    }