Programmation perl, exercice du pendu

Résolu/Fermé
pomme.c84 Messages postés 6 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 8 septembre 2010 - 15 nov. 2008 à 13:44
 gilles c. - 14 déc. 2008 à 23:17
Bonjour,
J'ai un travail à faie sur perl qui correspond à l'exercice du pendu.

Le but est de programmer le jeu du pendu .
Pour cela suivez pas à pas les étapes … rien ne sert de voir la fin, il faut commencer
par le début
Le jeu est pour 2 joueurs le premier joueur choisit le mot à chercher le deuxième doit le
trouver

Première étape :
Dans cette partie nous allons considérer que le mot
que doit choisir le premier joueur doit avoir 7
caractères.
Pour être sur qu’il n’y a pas d’erreur dans la suite
nous allons l’obliger à prendre un mot de 7
caractères.

Deuxième étape
Maintenant c’est au tour du deuxième joueur
Il doit entrer une lettre et il faut vérifier sa présence dans le mot. Si la lettre apparaît plusieurs
fois pour cette étape on affichera plusieurs fois le message « la lettre est présente » en
précisant la position

Troisième étape
Il faut maintenant que le joueur 2 puisse saisir
plusieurs lettres.
Il a le droit de jouer 10 coups (7+3)

Quatrième étape : Gagné ?
Dans un premier temps on veut afficher un message à l’utilisateur pour lui dire si il a gagné
ou pas.
Le joueur 2 aura gagné si le nombre de lettres trouvé correspond au nombre de lettres du
mot à chercher.
On voit que même si le joueur a trouvé toutes les lettres il continue à jouer. Il faut donc lui
permettre d’arrêter de jouer dès qu’il a trouvé toutes les lettres.
Pour cela vous devez modifier les conditions d’arrêt de la boucle.

Bonus
Plutôt que d’afficher la position de la lettre dans le mot on fait au fur et à mesure afficher le
mot composé
La fonction substr doit être
utilisée plusieurs fois pour
composer le mot

Je suis à l'étape du Bonus. On veut obtenir cela:
Saisir un mot: machine
-------
Saisir une lettre: m
m------
saisir une lettre: b
saisir une lettre: i
m---i-e
.... jusqu'a obtenir le mot

Je ne sais pas comment faire.

Merci de votre aide.

Cordialement,

Pomme.c84
A voir également:

1 réponse

Bonsoir,
Désolé, il se peut que j'arrive un peu tard pour vos exercices, voici quand même ma réponse.
Je vous propose le code suivant pour un hangman simplifié incluant la fonction de remplacement des '-' dans la chaîne "-------" par le(s) '<charactère trouvé(s)>'.

#!/usr/bin/perl -w

# @(#)$Name: wordguess.pl$

use 5.010_0;
use strict;
use feature 'say';
my $a='machine';
my $b = '-' x length($a);
my $c;
my($i,$notfound)=(0,0);

say "Word to guess is " . length($b) . " character long: " . $b;

while ((print "Give me one char you guess ($b): ") and (chomp($c=<STDIN>))
       and ($c ne '') and ($b ne $a) ) {
  ( say( qq/Invalid character '/ , $c , qq/'/) ,
    next
  ) if $c =~ /\B/;
  $i=0;
  while ($a =~ m/$c/ixg) {
    say "Found '$c' in the magic word at pos: " , pos($a);
    substr( $b , pos($a)-1 , 1 ) = $c;
    # say $b;
    $i=1;
  };
  (say("'$c'", qq/ not found in magic word/),
   system("hangman " . ++$notfound)
  ) if not $i;
  die "Toooo baaad: You're hanged!\n" if $notfound >=6;
  (say("YOU FOUND IT! *** $b ***") , exit 0) if $a eq $b;
};


Dans votre cas ce qui va vous intéresser (enfin j'espère) sera l'instruction
substr( $b , pos($a)-1 , 1 ) = $c;
qui fait ce que vous demandez.
Attention pour que cela fonctionne il faut bien sûr la boucle :
while ($a =~ m/$c/ixg)
qui d'une part cherche toutes les occurences du caractère (g), ne tient pas compte de la casse (i) et utilise les regexp étendues (x) (encore que ça doit pouvoir fonctionner sans cette dernière). L'important c'est le 'g'.
NB: la fonction pos() donne la position de la dernière iccurence trouvée dans une chaîne comparée à un 'pattern'., Il lui faut donc le 'g' dans l'opérateur 'm//'.

En espérant vous avoir aidé.

Gilles

PS: j'avais oublié le petit plus du script hangman.pl appelé pour 'faire joli' dans le cas d'une erreur ci-dessus:
#!/usr/bin/perl -w

# @(#)$Name: hangman.pl$

#|--|
#|  O
#| /|\
#| / \
#|
#/\

use 5.010_0;
use strict;
use feature 'say';

my @hangman=(
  ['/',qq/\\\n/],
  [qq/|\n/],
  ['|',' /',qq/ \\\n/],
  ['|',' /','|',qq/\\\n/],
  ['|',qq/  O\n/],
  ['|-',qq/-|\n/]
);

my($aref , $i, $limit);
$limit = scalar @hangman;
$limit = $ARGV[0] if (defined $ARGV[0]) and ($ARGV[0] =~ m/[1-6]/);

for $aref (reverse @hangman) {
  # print scalar @$aref, ' ';
  print @$aref;
  exit if ++$i >= $limit;
};
# say scalar @hangman;
3