Why not stay in a tail-recursive loop forever - or at least until a "stop criterium" has been reached. This "stop criterium" can result directly from asking the user whether to stop or play another round.
game :-
round(SomeInitialState). % The initial state may be an empty
% game board for example
round(State) :-
(stop_criterium(State)) % Should we stop? (Maybe ask the user).
-> true % Yes, stop: predicate round/1 succeeds,
% thus ending the loop.
; % ... otherwise ...
(play(State,NewState), % Play a round; a new state is proposed.
display(NewState), % Show what's going on.
round(NewState)). % Then do a tail-recursive call.
% The new round/1 context has new state.
Bonus: Using Delimited Continuations
If you are using SWI-Prolog, you can use the disconcerting magic of Delimited Continuations together with a global variable to store state to create an infinite loop with exit possibility like this (You don't really need the global variable, but the code becomes much more complex without it):
game :-
nb_setval(game_state,SomeInitialState), % Save an initial game state to a "global variable" called "game_state"
Goal = loop_forever(game_round), % We will call this in reset/3
reset( % Mark this point as exit point from a shift/1 called inside "Goal"
Goal, % Run this underneath the "reset" point
escape(FinalState), % The "Ball" term matching the "escape from loop command"
_). % The continuation to get back into the loop; we don't need it.
% The "infinite loop maker"
loop_forever(Goal) :-
call(Goal),
loop_forever(Goal).
% The "action function" called from the infinite loop maker.
% N.B.: Not a loop, just a straight conjunction!
game_round :-
nb_getval(game_state,State), % Get the game state from a "global variable" called "game_state"
(stop_criterium(State)) % Should we stop? (Maybe ask the user).
-> shift(escape(State)) % Jump out of the "infinite_goal_works(game_round)" context to the reset/3 point.
; true), % Otherwise continue with this predicate.
play(State,NewState), % Play a round; a new state is proposed.
display(NewState), % Show what's going on.
nb_setval(game_state,NewState). % Save the game state to a "global variable" called "game_state"
% It will be picked up by the next activation of game_round