C#中的Konami Code

24

我想让一个C#应用程序实现Konami代码以显示复活节彩蛋。 http://en.wikipedia.org/wiki/Konami_Code

最佳的实现方式是什么?

这是一个标准的C# Windows窗体应用程序。


你需要提供更多细节。你正在做什么类型的应用程序,控制台,GDI+,WPF?只需将键盘按键读入缓冲区并测试匹配即可。 - smaclell
维基百科文章链接的有趣内容:http://www.pcworld.com/article/163936/espncom_the_konami_code_and_a_whole_lotta_ponies.html。显然,ESPN也变得可爱了! - Michael Myers
11个回答

0

答案可以在Reactive Extensions中找到。你需要一个滑动缓冲区才能使其工作。这意味着你必须将最新的十个按键与Konami代码进行比较。这可以使用两个不同的语句来实现:

  • 使用窗口获取流的流(最终导致10个同时流)
  • 使用缓冲区将每个流汇总为IList

RX中的缓冲区为我们完成了这两个任务。它会缓冲最后10个项目并跳过1个(因此有效地创建了10个缓冲区)。

        var keysIO = Observable.FromEventPattern<KeyEventArgs>(this, "KeyDown")
                                    .Select(arg => arg.EventArgs.Key)
                                    .Buffer(10, 1)
                                    .Select(keys => Enumerable.SequenceEqual(keys, _konamiArray))
                                    .Where(result => result)
                                    .Subscribe(i =>
                                                    {
                                                        Debug.WriteLine("Found Konami");
                                                    });

编辑:已删除定时解决方案,过于复杂。

编辑 II:我也破解了超时解决方案。SelectMany 的美妙之处 :-)

        var keysIO = Observable.FromEventPattern<KeyEventArgs>(this, "KeyDown")
                            .Select(e => e.EventArgs.Key)
                            .Window(10, 1)
                            .SelectMany(obs => obs.Buffer(TimeSpan.FromSeconds(10), 10))
                            .Where(keys => Enumerable.SequenceEqual(_konamiArray, keys))
                            .Subscribe(keys => Debug.Write("Found Konami"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接