Aller au contenu

aide en C


percubabs

Messages recommandés

Code sans recopie, et pas optimisé

Édit1: Version 2 -> Un premier parcours pour détecter les bien placés [0] et ensuite un deuxième parcours pour les mal placés et les manquants [X]

Édit2: Version 3 -> En fait, il ne faut pas "cramer" seulement la clef mais aussi le test et tester la valeur "cramée" dans le test et non pas dans le clef.

Par exemple pour la clef [4,0,3,6,5] et test [0,5,6,3,4]. Pour le premier chiffre 0, on le trouve mal placé en 2ième position dans la clef. Mais si on met le "fake number" dans le clef et qu'ensuite qu'on teste si dans la clef il y a le "fake number" le deuxième chiffre 5 à chercher va être passé :transpi:

#include <stdlib.h>#include <stdio.h>#define FAKE_NUMBER 666void compare(int key[], int test[],char result[], int size) { if (size == 0) { return; } int index1 = 0, index2 = 0, is_found = 0; for(index1 = 0; index1 < size; index1++) {if (test[index1] == key[index1]) {  result[index1] = '0';  key[index1] = FAKE_NUMBER;  test[index1] = FAKE_NUMBER;} } for(index1 = 0; index1 < size; index1++) {if (test[index1] == FAKE_NUMBER) { continue; }for(index2 = 0, is_found = 0; ((index2 < size) && (!is_found)); index2++) {  if (test[index1] == key[index2]) {	result[index1] = 'I';	key[index2] = FAKE_NUMBER;	is_found = 1;   }}if (!is_found) { result[index1] = 'X'; }; } for(index1 = 0; index1 < size; index1++) {printf("[%c]", result[index1]); } printf("\n");}int main(){ int key[5] = {1, 1, 2, 1, 1}; int test[5] = {2, 2, 2, 2, 2}; char result[5] = {'\0'}; compare(key, test, result, 5); return 0;}

PS: Merci au béta testeur percubabs :siffle:

Lien vers le commentaire
Partager sur d’autres sites

voili mon code made in moi

void compare(int combiBase[], int saisieJ[],char resulCompare[], int taille, int *compx, int *compi, int *tour ){int saveCombi [6] = {0};int pastrouve = 0;(*tour)++;		 // compter les tours*compi = 0, *compx = 0;for(i = 0; i < taille; i++){ saveCombi [i] = combiBase [i];   //save combibase avant destruction resulCompare[i] = 0;	 // initialise relulta}if (taille == 0)	   //vérif taille{  return;}for(i = 0; i < taille; i++){ if (saisieJ[i] == combiBase[i])   //rentrer et compter les X {  resulCompare[i] = 'X';  combiBase[i] = numb;  saisieJ[i] = numb;  (*compx)++;  	}}for(i = 0; i < taille; i++){	if (saisieJ[i] == numb) //passer déja fait {  continue; }	for(j = 0, pastrouve = 0; ((j < taille) && (!pastrouve)); j++) {  if (saisieJ[i] == combiBase[j])  {resulCompare[i] = 'I'; //remplire les I			combiBase[j] = numb;			pastrouve = 1;(*compi)++;  }	}	if (!pastrouve) { resulCompare[i] = '0'; }}for(i = 0; i < taille; i++) //réinitialisation{ combiBase [i] = saveCombi [i];}}

par contre si quelqu'un pouvais m'expliquer comment rentrer stocker des scores

1 nom mode nombre coups

j'arrive a lire mais qu'une ligne avec sa

FILE* fichier = NULL;int taillech = 100;char chaine[100] = "";fichier = fopen("scores.txt", "r+") ;if(fichier == NULL){	exit(EXIT_FAILURE);}while (fgets(chaine, taillech, fichier) != NULL){ printf("%s", chaine);}fclose(fichier);}

mais j'arrive pas trop après

Lien vers le commentaire
Partager sur d’autres sites

if ((*compx) == 5) { printf("Entrez votre nom\n"); scanf("%s", nom); fprintf(fichier, "\nPseudo: %s ", nom, fichier); fprintf(fichier, "- Nombre d'essais: %d // Noob\n", *tour, fichier); if (fclose(fichier) == EOF) printf("impossible de fermer le fichier\n"); }

je rentre une ligne mais j'écrase l'ancienne

je lit mon tableau en entier now

FILE* fichier = NULL;int caractereActuel = 0;fichier = fopen("scores.txt", "r+") ;if(fichier == NULL)   {    exit(EXIT_FAILURE);   }do    {	    caractereActuel = fgetc(fichier);	    printf("%c", caractereActuel);    } while (caractereActuel != EOF);    fclose(fichier
Lien vers le commentaire
Partager sur d’autres sites

if ((*compx) == 5) { printf("Entrez votre nom\n"); scanf("%s", nom); fprintf(fichier, "\nPseudo: %s ", nom, fichier); fprintf(fichier, "- Nombre d'essais: %d // Noob\n", *tour, fichier); if (fclose(fichier) == EOF) printf("impossible de fermer le fichier\n"); }

je rentre une ligne mais j'écrase l'ancienne

Ouais c'est ultra-normal :transpi:

Il faut faire un "fseek(fichier, 0L, SEEK_END);" quelque part pour écrire à la fin du fichier.

Et il faut faire un fichier type CSV. Si tu commences à mettre du "garbage" tu vas :crever:

if ((*compx) == 5) { printf("Entrez votre nom\n"); scanf("%s", nom); fprintf(fichier, ";%s", nom, fichier); fprintf(fichier, ";%d\n", *tour, fichier); if (fclose(fichier) == EOF) {printf("impossible de fermer le fichier\n"); }}
Lien vers le commentaire
Partager sur d’autres sites

{ if ((*compx) == 5) { printf("Entrez votre nom\n");// remplir score scanf("%s", nom); fprintf(fichier, "\nPseudo: %s ", nom, fichier); fseek(fichier, 0L, SEEK_END); fprintf(fichier, "- Nombre d'essais: %d // PGM\n", *tour, fichier); if (fclose(fichier) == EOF) printf("impossible de fermer le fichier\n"); }}

ca m'écrase un partie de mon ancien score

Pseudo: tatata - Nombre d'essais: 2 // Noob- Nombre d'essais: 2 // PGM
Lien vers le commentaire
Partager sur d’autres sites

En fait, comme je l'ai dit ton fichier est trop chargé. Tu ne peux pas le découper facilement. À chaque fois il faut que tu supprimes "- Nombre d'essais:" "Pseudo:" et "// XXX".

C'est pour cela que ton strtok ne fonctionne pas bien.

Par contre si tu fais un fichier style csv:

toto;2;XXXtata;3;YYYPGM;48;ZZZZ

Avec un fgets dans un while, tu vas récupérer chaque ligne: "toto;2;XXX", "tata;3;YYY" et "PGM;48;ZZZZ"

Et ensuite:

pseudo = strtok(line, ";");if (pseudo != NULL) { str_score = strtok(NULL, ";"); // Au deuxième appel tu ne passes plus la ligne: la fonction se débrouille if (str_score != NULL) {   score = (int) atoi(str_score); // Conversion: char to int   comment = strtok(NULL, ";"); // ou comment = strtok(NULL, ";\n"); Il faut tester si strtok gère la fin de ligne. Sinon rajoute un ';' à la fin de chaque ligne//  if (comment != NULL) { ... } }}

Pour ton problème d’écrasement, c'est normal. Tu dois faire ton "fseek(fichier, 0L, SEEK_END);" trop tôt. Il faut le faire avant ton premier fprintf.

Sinon, je me demande si [version crade] une lecture complète et une écriture complète de ton fichier ne serait pas mieux, avec une liste chainée.

Puisque tu as parlé de trier les scores.

À l'initialisation de ton jeu: Lecture de ton fichier de scores -> Création d'une liste chainée

Exemple: [tata, 3] -> [toto, 2] -> [PGM, 48] -> NULL

Au cours de ta partie, tu modifies ta liste chainée, tu peux même la trier etc...

Exemple: [toto, 2] -> [PGM, 48] -> [tata, 50] -> [NULLOS, 150] ->NULL

Et lorsque le joueur quitte le jeu tu sérialises, c'est à dire tu écris ta liste chainée dans le fichier des scores.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...