foetus Posté(e) le 27 novembre 2012 Partager Posté(e) le 27 novembre 2012 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é #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 Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 27 novembre 2012 Auteur Partager Posté(e) le 27 novembre 2012 lol! je regard Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 27 novembre 2012 Auteur Partager Posté(e) le 27 novembre 2012 a vue de nez c'est bon Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 29 novembre 2012 Auteur Partager Posté(e) le 29 novembre 2012 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 More sharing options...
foetus Posté(e) le 29 novembre 2012 Partager Posté(e) le 29 novembre 2012 C'est simple il faut prendre ligne pas ligne avec la fonction "fgets" et ensuite "tokeniser" la ligne prise en fonction d'un séparateur [qui est l'espace] avec la fonction "strtok" Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 30 novembre 2012 Auteur Partager Posté(e) le 30 novembre 2012 simple pour toi!! je vois pas comment utilisé strtok de plus j'ai un 'hight score donc je doit trier le tableau, je coule Lien vers le commentaire Partager sur d’autres sites More sharing options...
foetus Posté(e) le 30 novembre 2012 Partager Posté(e) le 30 novembre 2012 Donne un bout de fichier Lien vers le commentaire Partager sur d’autres sites More sharing options...
percubabs Posté(e) le 30 novembre 2012 Auteur Partager Posté(e) le 30 novembre 2012 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 More sharing options...
foetus Posté(e) le 30 novembre 2012 Partager Posté(e) le 30 novembre 2012 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 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 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 More sharing options...
percubabs Posté(e) le 30 novembre 2012 Auteur Partager Posté(e) le 30 novembre 2012 { 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 More sharing options...
foetus Posté(e) le 2 décembre 2012 Partager Posté(e) le 2 décembre 2012 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 More sharing options...
percubabs Posté(e) le 2 décembre 2012 Auteur Partager Posté(e) le 2 décembre 2012 ok merci je vais regarder ca Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.