2010-12-02 10 views

Antwort

7

Hier ist meine Version:

<html> 
<head> 
<script type="text/javascript" src="jquery-1.4.4.min.js"></script> 
<script type="text/javascript" src="rx.js"></script> 
<script type="text/javascript" src="rx.jQuery.js"></script> 
</head> 
<body> 
<p id="result"></p> 
<script type="text/javascript"> 
    $(function() { 
     var konami = $(document).toObservable("keyup").Select(function(e) { 
      return e.keyCode 
     }).SkipWhile(function(k) { 
      return (k != 38) 
     }).BufferWithCount(
      10 
     ).Where(function(ks) { 
      return ks.length == 10 && 
       ks[0] == 38 && ks[1] == 38 && 
       ks[2] == 40 && ks[3] == 40 && 
       ks[4] == 37 && ks[5] == 39 && 
       ks[6] == 37 && ks[7] == 39 && 
       ks[8] == 66 && ks[9] == 65 
     }) 

     var konamisub = konami.Subscribe(function(e) { 
      $("#result").text("KONAMI!") 
      $("#result").fadeIn().fadeOut() 
     }) 
    }) 
</script> 
</body> 
</html> 

ich den Strom von keyup Ereignisse in einen Strom von keycodes mit dem Select konvertieren, dann Tastenanschläge ignorieren, bis der Benutzer mit der SkipWhile (Tastencode 38) hochdrückt, dann 10 Tastenanschläge mit der BufferWithCount sammelt und dann die Tastenanschläge mit der Where überprüft.

Ich habe versucht, mit BufferWithTime, aber es neigt dazu, in der Mitte der Tastenanschläge zu schneiden.

Wenn jemand Verbesserungen vorschlagen kann, würde ich sie gerne hören.

+0

[Dieses Rx.js-Konami-Codebeispiel auf GitHub scheint idiomatisch zu sein] (https://github.com/Reactive-Extensions/RxJS/blob/master/examples/konamicode/konamicode.js). Sieht so aus, als ob sie jetzt die konventionelle JS-Funktionsbenennung verwenden (kein initialer Großbuchstabe). –

1

Ich möchte nicht die Antwort für Sie verderben, da Sie lernen, aber ich würde versuchen, das Problem als "Wie kann ich das Key up Ereignis in die Sequenz der letzten 10 zu transformieren Zeichen, die waren vor kurzem gedrückt ", und vergleichen Sie diese Liste mit der Konstantenliste von" UUDDLRLRBA ". (Hinweis: Puffer, Wo, Select, Take, Repeat sind deine Freunde hier)

+0

Eigentlich stört es mich nicht Spoiler :) aber ja, es wäre nicht so viel Spaß. Danke für den Tipp! –

+0

Ich habe es funktioniert, aber es verwendet nicht "Take" noch "Repeat". Wie würden Sie Take and Repeat in diesem Szenario verwenden? –

Verwandte Themen