J'ai suivi les tutos du site pour apprendre le C et je bloque à l'amélioration du jeu du Pendu. Je veux afficher les lettres déjà proposées et c'est là que le code coince. La compilation se passe sans problème mais pendant l'exécution du jeu, l'application plante systématiquement lorsqu'il faut afficher les caractères déjà proposées. J'ai bien essayé en concaténant la chaîne et le caractère proposé, ou même de copier la chaîne et j'ai aussi essayé avec sprintf mais je suis dans l'impasse. J'avais eu le même problème lorsque je voulais afficher le nom du joueur (j'ai enlevé cette partie du code) en affectant nomJ2 = "Bernard"; lors de l'affichage avec un printf("%s", nomJ2). J'ai l'impression qu'il y a un problème avec mes chaînes de caractère. Si quelqu'un de se pencher sur mon problème, je vous en remercie d'avance.
Bonne fin de journée.
Voici le main.c :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "main.h"
#include "dico.h"
int main(int argc, char *argv[])
{
int nombreParties = 1;
int rejouerPartie = 1;
int scoreJoueur1 = 0;
int scoreJoueur2 = 0;
int changerMot = 1;
printf(" ----------------------------------------\n");
printf(" ------------------------------------------\n");
printf("|| ||\n");
printf("|| LE PENDU ||\n");
printf("|| 1 ou 2 joueurs ||\n");
printf("|| ||\n");
printf(" ------------------------------------------\n");
printf(" ----------------------------------------\n");
printf(" ---------------------------\n");
printf(" -------------\n");
printf(" -----\n");
do
{
char motSecret[50] = {0};
int tailleMot = 0;
int i;
int *lettreTrouvee = NULL;
int nbJoueurs = 0;
do
{
printf("\n\n\nTu joues contre un humain ou contre la machine ?\n\n");
printf("HUMAIN vs MACHINE -------> Tape 1\n");
printf("HUMAIN vs HUMAIN --------> Tape 2\n");
nbJoueurs = choixMenu();
if (nbJoueurs == 1)
{
if (!piocherMot(motSecret))
exit(0);
}
else if (nbJoueurs == 2)
{
do
{
printf("\nJoueur 2 : Choisis un mot a faire deviner :\n");
lireEntreeClavier(motSecret, 50);
tailleMot = strlen(motSecret);
for (i=0; i<strlen(motSecret); i++)
{
motSecret[i]=toupper(motSecret[i]);
}
do
{
printf("\nTu as ecrit -----> %s. Veux-tu changer le mot ?\n", motSecret);
printf("NON ----- > 0\n");
printf("OUI ----- > 1\n");
changerMot = choixMenu();
}while (changerMot !=0 && changerMot !=1);
if (changerMot)
{
printf("On recommence...\n\n\n");
}
}while (changerMot != 0);
}
else
printf("Faute de frappe !!! On recommence...\n");
}while (nbJoueurs != 1 && nbJoueurs != 2);
tailleMot = strlen(motSecret);
lettreTrouvee = malloc(tailleMot * sizeof(int));
if (lettreTrouvee == NULL)
{exit (0);}
for (i = 0; i < tailleMot; i++)
{lettreTrouvee[i] = 0;}
system("cls");
char maLettre = 0;
int tentativesRestantes = 5;
int coupsJoues = 1;
char lettresProposees[26] = {0};
int j = 0;
while (tentativesRestantes > 0 && !gagne(lettreTrouvee, tailleMot))
{
printf("\n-----> Partie # %d // Coup # %d\n", nombreParties, coupsJoues);
printf("Lettres proposees : ");
for (j = 0 ; j < coupsJoues ; j++)
{printf("%c ", lettresProposees[j]);}
printf("\n\nJoueur 1 : Tu as %d chances pour trouver le mot mystere.\n", tentativesRestantes);
printf("Quel est le mot secret ? ");
for (i = 0 ; i < tailleMot ; i++)
{
if (lettreTrouvee[i])
printf("%c", motSecret[i]);
else
printf("*");
}
printf("\nPropose une lettre :\n");
maLettre = lireCaractere();
sprintf(lettresProposees, maLettre);
if (!rechercheLettre(maLettre, motSecret, lettreTrouvee))
{
tentativesRestantes--;
}
coupsJoues++;
}
if (gagne(lettreTrouvee, tailleMot))
{scoreJoueur1++;
printf("\n\nGagne ! Le mot secret etait bien : %s\n\n\n", motSecret);
printf(" ----------------------------- \n");
printf("| Humain | Joueur 2 |\n");
printf("|-----------------------------|\n");
printf("| %d | %d |\n", scoreJoueur1, scoreJoueur2);
printf(" -----------------------------\n");}
else
{scoreJoueur2++;
printf("\n\nPerdu ! Le mot secret etait : %s\n\n\n", motSecret);
printf(" ----------------------------- \n");
printf("| Humain | Joueur 2 |\n");
printf("|-----------------------------|\n");
printf("| %d | %d |\n", scoreJoueur1, scoreJoueur2);
printf(" -----------------------------\n\n\n");}
free(lettreTrouvee);
do
{
printf("\nVeux-tu refaire une partie ?\n");
printf("NON ----- > 0\n");
printf("OUI ----- > 1\n");
rejouerPartie = choixMenu();
}while (rejouerPartie !=0 && rejouerPartie !=1);
if (rejouerPartie)
{
printf("On recommence une partie...\n\n\n\n");
nombreParties++;
}
else
{
printf("\n\n\n////////////////////////////////////////////////////////////////////////\n");
printf(" Merci d avoir joue au Pendu !!! Au revoir !!\n");
printf("//////////////////////////////////////////////////////////////////////////\n\n\n");
return 0;
}
}while (rejouerPartie != 0);
return 0;
}
le problème vient de là j’en suis conscient mais je n’arrive pas à copier la lettre proposée (maLettre) dans ma chaîne (lettresProposees) pour l’afficher. Avez-vous une piste ?
On peut faire cela avec sprintf(). Tu veux ajouter à la fin de la chaîne la nouvelle lettre. Ça donnerait
sprintf( chaine+strlen(chaine) , "%c" , lettre );
On peut aussi, remplacer le terminateur par le nouveau caractère (sachant que le tableau est initialement rempli de '\0', on n'a pas besoin de déplacer le terminateur) c'est plutôt à éviter.
soit tu inserts la lettre à sa position alphabétique dans le tableau (A indice 0), des espaces pour les lettres non piochées et tu affiches le tableau.
soit tu insert les lettres les une à la suite des autres dans le tableau (il faudra mémoriser avec un compteur ou calculer la position) et tu affiches le tableau.
J'en ai profiter pour modifier le code pour afficher le nom du second joueur selon le choix en début de jeu. Voici le code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "main.h"
#include "dico.h"
int main(int argc, char *argv[])
{
int nombreParties = 1;
int rejouerPartie = 1;
int scoreJoueur1 = 0;
int scoreJoueur2 = 0;
int changerMot = 1;
printf(" ----------------------------------------\n");
printf(" ------------------------------------------\n");
printf("|| ||\n");
printf("|| LE PENDU ||\n");
printf("|| 1 ou 2 joueurs ||\n");
printf("|| ||\n");
printf(" ------------------------------------------\n");
printf(" ----------------------------------------\n");
printf(" ---------------------------\n");
printf(" -------------\n");
printf(" -----\n");
do
{
char motSecret[50] = {0};
int tailleMot = 0;
int i;
int *lettreTrouvee = NULL;
char nomJ2[9] = {0};
int nbJoueurs = 0;
do
{
printf("\n\n\nTu joues contre un humain ou contre la machine ?\n\n");
printf("HUMAIN vs MACHINE -------> Tape 1\n");
printf("HUMAIN vs HUMAIN --------> Tape 2\n");
nbJoueurs = choixMenu();
if (nbJoueurs == 1)
{
sprintf(nomJ2+strlen(nomJ2), "Machine ");
if (!piocherMot(motSecret))
exit(0);
}
else if (nbJoueurs == 2)
{
sprintf(nomJ2+strlen(nomJ2), "Joueur 2");
do
{
printf("\nJoueur 2 : Choisis un mot a faire deviner :\n");
lireEntreeClavier(motSecret, 50);
tailleMot = strlen(motSecret);
for (i=0; i<strlen(motSecret); i++)
{
motSecret[i]=toupper(motSecret[i]);
}
do
{
printf("\nTu as ecrit -----> %s. Veux-tu changer le mot ?\n", motSecret);
printf("NON ----- > 0\n");
printf("OUI ----- > 1\n");
changerMot = choixMenu();
}while (changerMot !=0 && changerMot !=1);
if (changerMot)
{
printf("On recommence...\n\n\n");
}
}while (changerMot != 0);
}
else
printf("Faute de frappe !!! On recommence...\n");
}while (nbJoueurs != 1 && nbJoueurs != 2);
tailleMot = strlen(motSecret);
lettreTrouvee = malloc(tailleMot * sizeof(int));
if (lettreTrouvee == NULL)
{exit (0);}
for (i = 0; i < tailleMot; i++)
{lettreTrouvee[i] = 0;}
system("cls");
char maLettre = 0;
int tentativesRestantes = 5;
int coupsJoues = 1;
char lettresProposees[26] = {0};
int j = 0;
while (tentativesRestantes > 0 && !gagne(lettreTrouvee, tailleMot))
{
printf("\n-----> Partie # %d // Coup # %d\n", nombreParties, coupsJoues);
printf("Lettres proposees : ");
for (j = 0 ; j < coupsJoues ; j++)
{printf("%c ", lettresProposees[j]);}
printf("\n\nJoueur 1 : Tu as %d chances pour trouver le mot mystere.\n", tentativesRestantes);
printf("Quel est le mot secret ? ");
for (i = 0 ; i < tailleMot ; i++)
{
if (lettreTrouvee[i])
printf("%c", motSecret[i]);
else
printf("*");
}
printf("\nPropose une lettre :\n");
maLettre = lireCaractere();
sprintf(lettresProposees+strlen(lettresProposees), "%c", maLettre);
if (!rechercheLettre(maLettre, motSecret, lettreTrouvee))
{
tentativesRestantes--;
}
coupsJoues++;
}
if (gagne(lettreTrouvee, tailleMot))
{scoreJoueur1++;
printf("\n\nGagne ! Le mot secret etait bien : %s\n\n\n", motSecret);
printf(" ----------------------------- \n");
printf("| Humain | %s |\n", nomJ2);
printf("|-----------------------------|\n");
printf("| %d | %d |\n", scoreJoueur1, scoreJoueur2);
printf(" -----------------------------\n");}
else
{scoreJoueur2++;
printf("\n\nPerdu ! Le mot secret etait : %s\n\n\n", motSecret);
printf(" ----------------------------- \n");
printf("| Humain | %s |\n", nomJ2);
printf("|-----------------------------|\n");
printf("| %d | %d |\n", scoreJoueur1, scoreJoueur2);
printf(" -----------------------------\n\n\n");}
free(lettreTrouvee);
do
{
printf("\nVeux-tu refaire une partie ?\n");
printf("NON ----- > 0\n");
printf("OUI ----- > 1\n");
rejouerPartie = choixMenu();
}while (rejouerPartie !=0 && rejouerPartie !=1);
if (rejouerPartie)
{
printf("On recommence une partie...\n\n\n\n");
nombreParties++;
}
else
{
printf("\n\n\n////////////////////////////////////////////////////////////////////////\n");
printf(" Merci d avoir joue au Pendu !!! Au revoir !!\n");
printf("//////////////////////////////////////////////////////////////////////////\n\n\n");
return 0;
}
}while (rejouerPartie != 0);
return 0;
}
Plantage de l'application_Le pendu
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.