我想让一个C#应用程序实现Konami代码以显示复活节彩蛋。 http://en.wikipedia.org/wiki/Konami_Code
最佳的实现方式是什么?
这是一个标准的C# Windows窗体应用程序。
我想让一个C#应用程序实现Konami代码以显示复活节彩蛋。 http://en.wikipedia.org/wiki/Konami_Code
最佳的实现方式是什么?
这是一个标准的C# Windows窗体应用程序。
答案可以在Reactive Extensions中找到。你需要一个滑动缓冲区才能使其工作。这意味着你必须将最新的十个按键与Konami代码进行比较。这可以使用两个不同的语句来实现:
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"));