game loop uses tail call optimized recursion