Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- % Définir les mouvements possibles
- move(state(X, X, Z, T), state(Y, Y, Z, T), 'Prendre le loup') :-
- opposite(X, Y),
- X = Z. % Le loup doit être sur la même rive que le fermier
- move(state(X, Y, X, T), state(Y, Y, Y, T), 'Prendre la chèvre') :-
- opposite(X, Y),
- X = Y. % La chèvre doit être sur la même rive que le fermier
- move(state(X, Y, Z, X), state(Y, Y, Z, Y), 'Prendre la laitue') :-
- opposite(X, Y),
- X = Z. % La laitue doit être sur la même rive que le fermier
- move(state(X, Y, Z, T), state(Y, Y, Z, T), 'Traverser seul') :-
- opposite(X, Y).
- % Définir la rive opposée
- opposite(0, 1).
- opposite(1, 0).
- % Vérifier si l'état est valide (les objets ne doivent pas être laissés ensemble sans le fermier)
- safe(state(_, W, G, L)) :-
- (W = G ; G = 0), % La chèvre est en sécurité si elle est avec le fermier ou seule
- (G = L ; L = 0). % La laitue est en sécurité si elle est avec le fermier ou seule
- % Exécuter un mouvement valide
- perform_move(CurrentState, Action, NextState) :-
- move(CurrentState, NextState, Action),
- safe(NextState). % Vérifie si l'état résultant est sûr
- % Vérifier si une action est valide (syntaxe correcte)
- valid_action('Prendre le loup').
- valid_action('Prendre la chèvre').
- valid_action('Prendre la laitue').
- valid_action('Traverser seul').
- % Identifier la rive où se trouve l'utilisateur
- describe_location(0, 'rive gauche').
- describe_location(1, 'rive droite').
- % Fonction pour nettoyer et valider l'action saisie
- ask_valid_action(CurrentState, Action) :-
- writeln('Entrez votre action (par exemple : Prendre le loup, sans guillemets) :'),
- read_line_to_string(user_input, UserInput), % L'utilisateur entre une action sans guillemets
- string_trim(UserInput, CleanedInput), % Retirer les espaces superflus
- (CleanedInput = 'STOP' -> % Si l'utilisateur entre STOP, on arrête le jeu
- writeln('Le jeu est terminé.'),
- !;
- (valid_action(CleanedInput) ->
- (perform_move(CurrentState, CleanedInput, _) ->
- Action = CleanedInput
- ;
- writeln('Action invalide ou interdite dans cet état. Vous avez perdu !'),
- fail) % Si l'action est invalide, on indique l'échec du joueur
- ;
- writeln('Erreur : L\'action saisie n\'est pas valide. Vérifiez la syntaxe.'),
- ask_valid_action(CurrentState, Action))).
- % Jeu interactif
- play_game(state(1, 1, 1, 1)) :-
- writeln('Félicitations ! Vous avez transporté tout le monde sur la rive droite.').
- play_game(CurrentState) :-
- CurrentState = state(X, _, _, _),
- describe_location(X, Location),
- format('Vous êtes actuellement sur la ~w.\n', [Location]),
- writeln('État actuel : '), writeln(CurrentState),
- writeln('Actions disponibles :'),
- writeln('- Prendre le loup'),
- writeln('- Prendre la chèvre'),
- writeln('- Prendre la laitue'),
- writeln('- Traverser seul'),
- writeln('- STOP'), % Afficher l'option de STOP pour arrêter le jeu
- ask_valid_action(CurrentState, Action),
- perform_move(CurrentState, Action, NextState),
- writeln('Mouvement réussi : '), writeln(Action),
- writeln('Nouvel état : '), writeln(NextState),
- % Vérification après chaque mouvement
- (safe(NextState) ->
- play_game(NextState) ;
- writeln('Vous avez échoué ! Le jeu est terminé.')
- ).
- % Afficher des instructions initiales
- start_game :-
- writeln('Bienvenue dans le jeu du fermier, du loup, de la chèvre et de la laitue !'),
- writeln('Pour commencer le jeu, vous devez entrer :'),
- writeln('?- play_game(state(0, 0, 0, 0)).'),
- writeln('Puis, vous pourrez choisir les actions disponibles pour déplacer le fermier, le loup, la chèvre et la laitue.'),
- writeln('Bonne chance !').
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement