implement KeyListener, call addKeyListener(this) to whatever context you’re using (Applet, Frame, etc), then:
public void keyPressed(KeyEvent ke) {
keyQueue.add(KeyEvent.KEY_PRESSED, ke.getKeyCode(), ke.getWhen());
}
where keyQueue is a key of some sort… you pick your data structure you wanna use. The idea though is that you push all keys coming on to the top, and read them from the bottom and check to see if they make up a move.
Perhaps you could time so you only read from the queue every .2 seconds or something, which would account for your leniency for keys being pressed simultaneously.
So you start at the bottom whenever you decide to read from it and if a key on the queue begins in one of your special moves, then check further to see if that move was inputted. If it does, evaluate that special move. Otherwise, evaluate what the individual keys should do on their own.
To explain why I passed 3 parameters to the “add” method in that code snippet, consider what you want to know. I passed whether or not the key was pressed or released, which key it was, and when exactly it happened. This way you can have a move that has specific sequences such as: “Up, Down, Hold Punch & Forward, Kick, Kick, Release Punch, Kick, Release Forward”. With the structure I’ve given you, you can check if all of that has happened.
Put in some of that and see what you come up with. I look forward to see what you do with this and what questions beyond this you might have! Good luck 
EDIT: typos