CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Aide pour la lecture d'un fichier

delafayette
delafayette
Niveau 10
08 mai 2007 à 14:11:23

Bonjour,
Je suis en train de créer un jeu de stratégie, avec une carte divisée en plusieurs cases, avec les bases du TP de Mario Sokoban venant du siteduzéro.
Dans ce TP, il n´y a que 6 sprites différents.
Moi j´en ai 16.
Et je concevais l´éditeur en ce moment. Pour le Mario Sokoban, au niveau de la fonction pour charger une carte, il nous suffisait de faire:
for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
{
switch (ligneFichier[(i * NB_BLOCS_LARGEUR) + j])
{
case ´0´:
niveau[j][i] = VIDE;
break;
case ´1´:
niveau[j][i] = MUR;
break;
case ´2´:
niveau[j][i] = CAISSE;
break;
case ´3´:
niveau[j][i] = MARIO;
break;
case ´4´:
niveau[j][i] = OBJECTIF;
break;
}
}
}
C´est à dire qu´on parcourait le fichier niveaux.lvl où se trouvait des 0, des 1, des 2, des 3 et des 4, et si aux coordonnées (20; 5) par exemple on avait 1 dans le fichier, alors on blitait un mur à ces coordonnées là sur la carte.
Le problème c´est qu´ayant 16 sprites, je suis naivement allé jusqu´à
case ´16´:niveau [j][i] = Armée10
Et donc, lorsque je place dans mon éditeur l´armée 10, que je sauve et que je quitte puis que je recharge ma carte, au lieu de mon armée 10 je me retrouve avec une plaine et la montagne qui correspondent aux sprites 1 et 6...
J´ai compris que lorsque je lisais le fichier au lieu de lire 16, il lisait 1 et 6.
J´ai donc essayé de tout numéroter sur 2 chiffres: 01, 02, 03 etc...
Là non plus ça ne marche pas, et en plus ça me met:
Warning: multi-character character in octal contant
J´ai même essayé les lettres, rien de plus... Ca reste des chiffres! Et mieux, ça ne lit pas mon fichier :hum:
Ne peut-on donc mettre que 10 sprites et pas plus?
Aidez moi please... :snif:
Et merci d´avance de vos réponses :-)

dnob700
dnob700
Niveau 10
08 mai 2007 à 15:28:02

tu peut, mais avec cette méthode, si tu en mets plus, donne leur des noms avec des lettres : d´abord les sprite de ´0´ à ´9´ puis des sprite ´a´, ´b´, ..., ´z´ et puis des majuscule s´il t´en faut plus de 36.

Et donc tu mets des lettres dans ton fichier de carte et dans le swith aussi tu li des lettres.

delafayette
delafayette
Niveau 10
08 mai 2007 à 16:01:53

Bien merci de ta réponse.
J´ai essayé avec les lettres, c´est à dire comme cela:
case ´0´:
niveau[j][i] = A;
break;
case ´1´:
niveau[j][i] = B;
break;
case ´2´:
niveau[j][i] = C;
break;
case ´3´:
niveau[j][i] = D;
break;
case ´4´:
niveau[j][i] = E;
break;
case ´5´:
niveau[j][i] = F;
break;
case ´6´:
niveau[j][i] = G;
break;
case ´7´:
niveau[j][i] = H;
break;
case ´8´:
niveau[j][i] = I2;
break;
case ´9´:
niveau[j][i] = J2;
break;
case ´k´:
niveau[j][i] = K;
break;
case ´l´:
niveau[j][i] = L;
break;
case ´m´:
niveau[j][i] = M;
break;
case ´n´:
niveau[j][i] = N;
break;
case ´o´:
niveau[j][i] = O;
break;
case ´p´:
niveau[j][i] = P;
break;
Mais j´ai regardé, après avoir essayé les sprites correspondant aux lettre, le fichier niveaux.lvl, et il me gardait les chiffres! o_O
au lieu de mettre quand j´essaie tous mes sprites:
0123456789abcdefg etc
il mettait:
0123456789101112131415
D´où le même problème :S
J´ai donc tenté d´écrire les lettres manuellement, mais aparemment, il ne les reconnait pas :(
As-tu une idée du problème?
Si tu veux, je peux de poster le code source en entier ou alors l´heberger si tu préfères, mais je doute sérieusement que le reste du code ne soit mauvais...

delafayette
delafayette
Niveau 10
08 mai 2007 à 16:07:16

Ah juste deux petits trucs en plus :p
Bon, en changeant manuellement le fichier niveaux.lvl , il reconnait bien, je m´étais trompé de lettres.
Mon fichier ressemble à ça:
0123456789klmnop
Bon là il reconnait tout
Ensuite pour le code que j´ai posté là-haut, les constantes A,B,C etc, sont les noms de mes sprites (j´ai eu la flemme de leur donner un véritable nom ;) )
Mais mon problème persiste, j´ai essayé mon éditeur avec les sprites qui devaient correspondre aux lettres, mais au lieu de faire:
0123456789klmnop etc quand j´enregistre, il fait toujours:
123456789101112131415... :rire:
des idées?

dnob700
dnob700
Niveau 10
08 mai 2007 à 16:23:56

Là c´est juste qu´il faut adapter l´éditeur. Evidemment, il ne vas pas deviner qu´il faut faire des lettres.

Je ne saitpas coment il fonctionne, mais tu doit trouver la fonction qui écrit le fichier, je suppose qu´elle prend un entier en argument et si l´entier est inférieur à 10 il faut l´écrire, sinon il faut le convertir en la lettre qui lui correspond. Bref, c´est à toi de voir comment faire ça avec ton éditeur.

delafayette
delafayette
Niveau 10
08 mai 2007 à 16:28:46

Oui, ça c´est la fonction SauvegarderNiveau:
int sauvegarderNiveau1(int niveau[][NB_BLOCS_HAUTEUR])
{
FILE* fichier = NULL;
int i = 0, j = 0;

fichier = fopen("niveaux.lvl", "w");
if (fichier == NULL)
return 0;

for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
{
for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
{
fprintf(fichier, "%d", niveau[j][i]);
}
}

fclose(fichier);
return 1;
}
Mais là, il faut que je detecte comment la changer justement lorsque j´enregistre le 11eme sprite.
Car en effet ça prend un entier en argument...

delafayette
delafayette
Niveau 10
08 mai 2007 à 16:32:45

Sinon, pour convertir une lettre en nombre, c´est de l´ASCII non?
Olala, vivement que j´arrive à finir ça, il me tarde de pouvoir développer le gros de mon jeu :)

Fvirtman
Fvirtman
Niveau 10
08 mai 2007 à 19:31:43

"pour convertir une lettre en nombre"
--> sache que pour le langage C, il n´y a pas de lettres, tout est nombre :)

Quand tu fais :

char c = ´a´;
--> le C code, dans la valeur de c, le code ASCII de ´a´, c´est a dire 95. Donc c = 95 :)

La preuve, si tu fais c = c + 2; et que tu fais afficher c, en format lettre, il t´affichera ´c´, car 2 lettres plus loin que ´a´

Quand tu écris dans ton fichier : soit tu fais :

fprintf(F,"%d",c); // ecrira 95
soit :
fprintf(F,"%c",c); // ecrira ´a´

Utilise donc des %c pour les fprintf et les fscanf pour lire un seul caractere.

delafayette
delafayette
Niveau 10
08 mai 2007 à 19:43:13

Ok, merci beaucoup pour vos réponses :)
Là je suis en train de me casser le bec sur la fonction, à un moment ça n´enregistrait même plus :clown:
Je vais tenter de mettre à l oeuvre ce que tu viens de me dire Fvirtman.
Si j´ai besoin d´aide, je vous demande ;)

delafayette
delafayette
Niveau 10
08 mai 2007 à 20:18:14

Ca y est!!! J´y suis parvenu, et c´est grace à vous :-) Merci les gars!
Enfin, je parle pas trop vite car si ça se trouve je vais bloquer apres :rire2:
En tous cas, je sais que si j´ai un problème je peux vous demander!
encore :merci:

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment