Search code examples
javakeyboardio

How to check for a sequence of keystrokes


I'm making a game and want to implement cheat codes like the Konami code.

But how do I check for that sequence of keystrokes?

I want it to work so that if a player just types the code it will trigger.

Thanks in advance!


Solution

  • Below is a class that checks for the Konami code, including cases such as "UP, UP, UP, DOWN, etc."

    This should work for any given sequence.

    import java.util.Map;
    import java.util.TreeMap;
    
    public class Konami {
    
        static private int[] code = 
            {UP, UP, DOWN, DOWN, LEFT, RIGHT, LEFT, RIGHT, B};
        static private Map<Integer, Integer>[] graph;
        static private int currentNode = 0;
    
        public static void main(String args[]) {
            //Create graph
            graph = generateSequenceMap(code);
    
            //Call checkKonami(key) whenever a key is pressed
        }
    
    
        static public boolean checkKonami(int keyPressed) {
            Integer nextNode = graph[currentNode].get(keyPressed);
    
            //Set currentNode to nextNode or to 0 if no matching sub-sequence exists
            currentNode = (nextNode==null ? 0 : nextNode);
    
            return currentNode == code.length-1;
        }
    
    
        static private Map<Integer, Integer>[] generateSequenceMap(int[] sequence) {
    
            //Create map
            Map<Integer, Integer>[] graph = new Map[sequence.length];
            for(int i=0 ; i<sequence.length ; i++) {
                graph[i] = new TreeMap<Integer,Integer>();
            }
    
            //i is delta
            for(int i=0 ; i<sequence.length ; i++) {
                loop: for(int j=i ; j<sequence.length-1 ; j++) {
                if(sequence[j-i] == sequence[j]) {
                    System.out.println("If at Node "+j+" you give me seq["+(j-i+1) 
                            + "] OR " + (sequence[j-i+1]) + " , goto Node " + (j-i+1));
    
                    //Ensure that the longest possible sub-sequence is recognized
                    Integer value = graph[j].get(sequence[j-i+1]);
                    if(value == null || value < j-i+1)
                        graph[j].put(sequence[j-i+1], j-i+1);
                }
                else
                    break loop;
                }
            }
            return graph;
        }
    }