@@ -192,6 +192,7 @@ SNAKE.Snake = SNAKE.Snake || (function() {
192
192
2
193
193
*/
194
194
me . handleArrowKeys = function ( keyNum ) {
195
+ if ( isDead ) { return ; }
195
196
196
197
var snakeLength = me . snakeLength ;
197
198
var lastMove = moveQueue [ 0 ] || currentDirection ;
@@ -306,12 +307,20 @@ SNAKE.Snake = SNAKE.Snake || (function() {
306
307
me . snakeHead . elm . style . zIndex = getNextHighestZIndex ( me . snakeBody ) ;
307
308
me . snakeHead . elm . className = me . snakeHead . elm . className . replace ( / \b s n a k e - s n a k e b o d y - a l i v e \b / , '' )
308
309
me . snakeHead . elm . className += " snake-snakebody-dead" ;
309
- //me.snakeHead.elm.style.backgroundImage = "url('./deadblock.png')";
310
+
310
311
isDead = true ;
311
312
playingBoard . handleDeath ( ) ;
312
- moveQueue = [ ] ;
313
+ moveQueue . length = 0 ;
313
314
} ;
314
315
316
+ /**
317
+ * This method sets a flag that lets the snake be alive again.
318
+ * @method rebirth
319
+ */
320
+ me . rebirth = function ( ) {
321
+ isDead = false ;
322
+ } ;
323
+
315
324
/**
316
325
* This method reset the snake so it is ready for a new game.
317
326
* @method reset
@@ -339,13 +348,11 @@ SNAKE.Snake = SNAKE.Snake || (function() {
339
348
blocks [ ii ] . elm . style . top = "-1000px" ;
340
349
blocks [ ii ] . elm . className = me . snakeHead . elm . className . replace ( / \b s n a k e - s n a k e b o d y - d e a d \b / , '' )
341
350
blocks [ ii ] . elm . className += " snake-snakebody-alive" ;
342
- //blocks[ii].elm.style.backgroundImage = "url('./snakeblock.png')";
343
351
}
344
352
345
353
blockPool . concat ( blocks ) ;
346
354
me . snakeHead . elm . className = me . snakeHead . elm . className . replace ( / \b s n a k e - s n a k e b o d y - d e a d \b / , '' )
347
355
me . snakeHead . elm . className += " snake-snakebody-alive" ;
348
- //me.snakeHead.elm.style.backgroundImage = "url('./snakeblock.png')";
349
356
me . snakeHead . row = config . startRow || 1 ;
350
357
me . snakeHead . col = config . startCol || 1 ;
351
358
me . snakeHead . xPos = me . snakeHead . row * playingBoard . getBlockWidth ( ) ;
@@ -570,7 +577,7 @@ SNAKE.Board = SNAKE.Board || (function() {
570
577
571
578
elmAboutPanel = document . createElement ( "div" ) ;
572
579
elmAboutPanel . className = "snake-panel-component" ;
573
- elmAboutPanel . innerHTML = "<a href='http://patorjk.com/' class='snake-link'>patorjk.com</a> - <a href='http://patorjk.com/ blog/software/' class='snake-link'>more online apps from patorjk.com</a> - <a href='http ://patorjk .com/blog/about/#contact ' class='snake-link'>contact </a>" ;
580
+ elmAboutPanel . innerHTML = "<a href='http://patorjk.com/blog/software/' class='snake-link'>more patorjk.com apps </a> - <a href='https ://github .com/patorjk/JavaScript-Snake ' class='snake-link'>source code </a>" ;
574
581
575
582
elmLengthPanel = document . createElement ( "div" ) ;
576
583
elmLengthPanel . className = "snake-panel-component" ;
@@ -579,6 +586,14 @@ SNAKE.Board = SNAKE.Board || (function() {
579
586
elmWelcome = createWelcomeElement ( ) ;
580
587
elmTryAgain = createTryAgainElement ( ) ;
581
588
589
+ SNAKE . addEventListener ( elmContainer , "keyup" , function ( evt ) {
590
+ if ( ! evt ) var evt = window . event ;
591
+ evt . cancelBubble = true ;
592
+ if ( evt . stopPropagation ) { evt . stopPropagation ( ) ; }
593
+ if ( evt . preventDefault ) { evt . preventDefault ( ) ; }
594
+ return false ;
595
+ } , false ) ;
596
+
582
597
elmContainer . className = "snake-game-container" ;
583
598
584
599
elmContainer . appendChild ( elmPlayingField ) ;
@@ -612,11 +627,24 @@ SNAKE.Board = SNAKE.Board || (function() {
612
627
welcomeTxt . innerHTML = "JavaScript Snake<p></p>Use the <strong>arrow keys</strong> on your keyboard to play the game. " + fullScreenText + "<p></p>" ;
613
628
var welcomeStart = document . createElement ( "button" ) ;
614
629
welcomeStart . appendChild ( document . createTextNode ( "Play Game" ) ) ;
615
- SNAKE . addEventListener ( welcomeStart , "click" , function ( ) {
630
+
631
+ var loadGame = function ( ) {
632
+ SNAKE . removeEventListener ( window , "keyup" , kbShortcut , false ) ;
616
633
tmpElm . style . display = "none" ;
617
634
me . setBoardState ( 1 ) ;
618
635
me . getBoardContainer ( ) . focus ( ) ;
619
- } , false ) ;
636
+ } ;
637
+
638
+ var kbShortcut = function ( evt ) {
639
+ if ( ! evt ) var evt = window . event ;
640
+ var keyNum = ( evt . which ) ? evt . which : evt . keyCode ;
641
+ if ( keyNum === 32 || keyNum === 13 ) {
642
+ loadGame ( ) ;
643
+ }
644
+ } ;
645
+ SNAKE . addEventListener ( window , "keyup" , kbShortcut , false ) ;
646
+ SNAKE . addEventListener ( welcomeStart , "click" , loadGame , false ) ;
647
+
620
648
tmpElm . appendChild ( welcomeTxt ) ;
621
649
tmpElm . appendChild ( welcomeStart ) ;
622
650
return tmpElm ;
@@ -631,12 +659,25 @@ SNAKE.Board = SNAKE.Board || (function() {
631
659
tryAgainTxt . innerHTML = "JavaScript Snake<p></p>You died :(.<p></p>" ;
632
660
var tryAgainStart = document . createElement ( "button" ) ;
633
661
tryAgainStart . appendChild ( document . createTextNode ( "Play Again?" ) ) ;
634
- SNAKE . addEventListener ( tryAgainStart , "click" , function ( ) {
662
+
663
+ var reloadGame = function ( ) {
635
664
tmpElm . style . display = "none" ;
636
665
me . resetBoard ( ) ;
637
666
me . setBoardState ( 1 ) ;
638
667
me . getBoardContainer ( ) . focus ( ) ;
639
- } , false ) ;
668
+ } ;
669
+
670
+ var kbTryAgainShortcut = function ( evt ) {
671
+ if ( boardState !== 0 || tmpElm . style . display !== "block" ) { return ; }
672
+ if ( ! evt ) var evt = window . event ;
673
+ var keyNum = ( evt . which ) ? evt . which : evt . keyCode ;
674
+ if ( keyNum === 32 || keyNum === 13 ) {
675
+ reloadGame ( ) ;
676
+ }
677
+ } ;
678
+ SNAKE . addEventListener ( window , "keyup" , kbTryAgainShortcut , true ) ;
679
+
680
+ SNAKE . addEventListener ( tryAgainStart , "click" , reloadGame , false ) ;
640
681
tmpElm . appendChild ( tryAgainTxt ) ;
641
682
tmpElm . appendChild ( tryAgainStart ) ;
642
683
return tmpElm ;
@@ -738,7 +779,6 @@ SNAKE.Board = SNAKE.Board || (function() {
738
779
cHeight = getClientHeight ( ) - 5 ;
739
780
document . body . style . backgroundColor = "#FC5454" ;
740
781
} else {
741
- //elmContainer.style.display = "inline-block";
742
782
cTop = config . top ;
743
783
cLeft = config . left ;
744
784
cWidth = config . width ;
@@ -799,59 +839,41 @@ SNAKE.Board = SNAKE.Board || (function() {
799
839
// setup event listeners
800
840
801
841
myKeyListener = function ( evt ) {
802
-
803
- var keyNum ;
804
- if ( evt . which ) {
805
- keyNum = evt . which ;
806
- } else if ( evt . keyCode ) {
807
- keyNum = evt . keyCode ;
808
- }
842
+ if ( ! evt ) var evt = window . event ;
843
+ var keyNum = ( evt . which ) ? evt . which : evt . keyCode ;
809
844
810
- if ( me . getBoardState ( ) === 0 ) {
811
- // do nothing
812
- } else if ( me . getBoardState ( ) === 1 ) {
813
- if ( ! ( keyNum >= 37 && keyNum <= 40 ) ) {
814
- return ; // if not an arrow key, leave
815
- }
845
+ if ( me . getBoardState ( ) === 1 ) {
846
+ if ( ! ( keyNum >= 37 && keyNum <= 40 ) ) { return ; } // if not an arrow key, leave
816
847
848
+ // This removes the listener added at the #listenerX line
817
849
SNAKE . removeEventListener ( elmContainer , "keydown" , myKeyListener , false ) ;
818
850
819
851
myKeyListener = function ( evt ) {
820
- var keyNum ;
821
- if ( evt . which ) {
822
- keyNum = evt . which ;
823
- } else if ( evt . keyCode ) {
824
- keyNum = evt . keyCode ;
825
- }
852
+ if ( ! evt ) var evt = window . event ;
853
+ var keyNum = ( evt . which ) ? evt . which : evt . keyCode ;
854
+
826
855
mySnake . handleArrowKeys ( keyNum ) ;
827
856
828
- if ( ! evt ) var evt = window . event ;
829
857
evt . cancelBubble = true ;
830
858
if ( evt . stopPropagation ) { evt . stopPropagation ( ) ; }
831
859
if ( evt . preventDefault ) { evt . preventDefault ( ) ; }
832
860
return false ;
833
861
} ;
834
862
SNAKE . addEventListener ( elmContainer , "keydown" , myKeyListener , false ) ;
835
863
836
- SNAKE . addEventListener ( elmContainer , "keyup" , function ( evt ) {
837
- if ( ! evt ) var evt = window . event ;
838
- evt . cancelBubble = true ;
839
- if ( evt . stopPropagation ) { evt . stopPropagation ( ) ; }
840
- if ( evt . preventDefault ) { evt . preventDefault ( ) ; }
841
- return false ;
842
- } , false ) ;
843
-
864
+ mySnake . rebirth ( ) ;
844
865
mySnake . handleArrowKeys ( keyNum ) ;
845
866
me . setBoardState ( 2 ) ; // start the game!
846
867
mySnake . go ( ) ;
847
868
}
848
- if ( ! evt ) var evt = window . event ;
869
+
849
870
evt . cancelBubble = true ;
850
871
if ( evt . stopPropagation ) { evt . stopPropagation ( ) ; }
851
872
if ( evt . preventDefault ) { evt . preventDefault ( ) ; }
852
873
return false ;
853
874
} ;
854
875
876
+ // Search for #listenerX to see where this is removed
855
877
SNAKE . addEventListener ( elmContainer , "keydown" , myKeyListener , false ) ;
856
878
} ;
857
879
@@ -874,6 +896,7 @@ SNAKE.Board = SNAKE.Board || (function() {
874
896
elmContainer . appendChild ( elmTryAgain ) ;
875
897
elmTryAgain . style . zIndex = index ;
876
898
elmTryAgain . style . display = "block" ;
899
+ me . setBoardState ( 0 ) ;
877
900
} ;
878
901
879
902
// ---------------------------------------------------------------------
0 commit comments