**Executive summary**

Are there any good tutorials on Game State FSMs, particularly OOP/OOD-based and not switch-statement-based?

**Summary**

Is there a practical process for creating a game state engine other than using a switch statement, preferably with examples? [Wikipedia's event-driven FSM article][1] only shows a switch statement and the article on [FSMs][2] is strictly theory-based with no practical examples.

**Background**

Currently all my games use a very simplistic game state "engine" that uses switch statements everywhere. It's very messy, violates DRY horribly, and does not scale very well.

Each state is treated as a level and must be checked at all three points throughout the game loop, i.e. Input, Processing, and Render. If a level or screen is added it must be added to all the switch statements.

Practical example of recreation of pac-man for educational purposes (seriously, this was a school project a few years ago):

    enum STATE {
    	LOADING,
    	TITLE,
    	LEVEL_ONE,
    	LEVEL_TWO,
    	// ...
    	WIN,
    	GAME_OVER,
    	CREDITS,
    }GAME_STATE;
    
    
    void Input() {
    	// ...
    
    	switch(GAME_STATE) {
    		case LOADING:
    			break;
    		case TITLE:
    			break;
    		case LEVEL_ONE:
    		case LEVEL_TWO:
    		// ...
    			InputCommon();
    			break;
    		case WIN:
    		case GAME_OVER:
    			if(keyboard->KeyDown(KEY_ENTER))
    				GAME_STATE = CREDITS;
    			break;
    		case CREDITS:
    			if(keyboard->isKeyPressed())
    				quit = true;
    			break;
    	}
    }
    
    void Processing(int dead) {
    
    	// ...
    
    	switch(GAME_STATE) {
    		case LOADING:
    			break;
    		case TITLE:
    			break;
    		case LEVEL_ONE:
    		case LEVEL_TWO:
    		// ...
    			ProcessLevel();
    			if(GAME_STATE == LEVEL_SEVEN) {
    				// ...
    			}
    			break;
    		case WIN:
    			break;
    		case GAME_OVER:
    			break;
    		case CREDITS:
    			break;
    	}
    }
    
    void Render() {
        // ...
    
    	switch(GAME_STATE) {
    		case LOADING:
    			break;
    		case TITLE:
    			sh->Draw(_gw->GetBackBuffer(), sh->Index(0));
    			break;
    		case LEVEL_ONE:
    		case LEVEL_TWO:
            // ...
    
    			// ...
    			break;
    		case WIN:
    			sh->Draw(_gw->GetBackBuffer(), sh->Index(3));
    			break;
    		case GAME_OVER:
    			sh->Draw(_gw->GetBackBuffer(), sh->Index(1));
    			break;
    		case CREDITS:
    			sh->Draw(_gw->GetBackBuffer(), sh->Index(2));
    			break;
    	}
    
    	//End render process, display to screen.
    	_gw->EndRender();
    
    }


  [1]: http://en.wikipedia.org/wiki/Event_driven_finite_state_machine
  [2]: http://en.wikipedia.org/wiki/Finite_state_machine