Bonjour, pour mon premier projet C je dois créer un solitaire en console.
J'ai donc choisis de faire un plateau de jeu en txt.
Mais dans mon algorithme je dois modifier un caractère du fichier texte en le parcourant, remplacer un "0" par un "*", voici le code que j'ai fais :
FILE* fichier = NULL;
fichier = fopen("plateau.txt", "r+");
int formule =(13+10*y+x+y+1);
printf("%d",formule);
while (stop != 1)
{
current_char = fgetc(fichier);
pos = ftell(fichier);
if(pos==formule)
{
fputc(fichier, "*");
stop = 1;
}
}
fclose(fichier);
printf("Plateau mis a jour");
La formule donne l'endroit ou se trouve le caractère a remplacer, et si la position du curseur et la meme que celui calculé par la formule alors on remplace le caractère
Mais le problème rien ne se passe, on rentre bien dans le if(pos==formule) mais aucun changement de le fichier texte.
Ton code ne compile pas, je n'ai donc pas le courage de le regarder !
Mais j'ai une question, pourquoi faire cela dans un fichier et non pas en mémoire ?
C'est le seul moyen que je connais pour afficher quelque chose de compréhensible en console, en soit le jeu marche avec des tableaux, mais le coté affichage ce fait avec le fichier texte
Si tu n'es pas obligé d'utiliser un fichier, n'utilise pas un fichier, c'est trop compliqué (en tout cas pour moi)...
Une solution pourrait être d'utiliser un tableau de caractères (avec un '\0' final ce serait même une chaîne de caractères). La position dans ce tableau serait donnée par une formule similaire à celle de la ligne 3 (qu'on pourrait transformer en fonction, ou en 'inline').
Pour afficher le plateau de jeu, il suffit alors d'afficher le tableau de caractères (si c'est une chaîne, un simple 'puts' suffit).
C'est le seul moyen que je connais pour afficher quelque chose de compréhensible en console, en soit le jeu marche avec des tableaux, mais le coté affichage ce fait avec le fichier texte
Ton fichier comporte-t-il plusieurs lignes? Pourquoi utiliser ftell()? Tu n'as qu'à compter les caractères que tu sautes. Et tant qu'à utiliser ftell(), pourquoi pas fseek() qui va te positionner d'un seul coup. J'ai l'impression que le problème n'est pas seulement l'affichage, mais de sauver le jeu entre deux coups, je me trompe?
Le Tout est souvent plus grand que la somme de ses parties.
Mon fichier texte est sous la forme https://prnt.sc/wnfbz5
Et je l'affiche tel quelle dans la console, on ne peut pas faire d'interface graphique. Donc c'etait plus compréhensible pour moi d'afficher dans la console avec ce fichier texte que avec le simple tableau ou j'enregistre les coordonnées des pions. Et a chaque coup j'enregistre dans mon tableau mais je voudrais actualiser l'affichage aussi donc je voudrais mettre a jour ce fichier texte, qui pour moi etait plus simple
dans l'idéal, tu auras bien conçu et bien modélisé tout le problème et tu seras arrivé à la conclusion suivante :
comme il faut toujours séparer un programme en module ayant des responsabilité bien définies, je vais avoir besoin d'une partie qui modélise le jeu indépendamment de toute visualisation. Cela signifie avoir quelque chose comme une structure qui contiendra entre autre un tableau qui ne modélisera que le plateau et qui contiendra quelque chose qui modélisera les pions (ou pas si une case est vide).
Du coup tu pourras ensuite te concentrer sur une procédure uqi te permettra de visualiser cette structure … graphique ou non.
Mais permet moi de te dire que si tu as besoin de passer par un fichier pour afficher quelque chose à l'écran en te servant du dit fichier comme un ersatz de tableau … ton projet est très mal parti.
Salut, j'ai l'impression que tu t'embrouilles un peu : Ton but est de remplacer un O par un * dans un fichier si je comprends bien ? Dans ce cas tu as juste à parcourir ton fichier avec fgetc() comme tu le fais, pas besoin de contrôler la position dans le fichier.
Sinon tu es sûr de bien rentrer dans ta boucle ? Ta variable stop est initialisée à quelle valeur ?
Comme dit précédemment c'est plus simple de passer par un tableau de char plutôt qu'un fichier.
Ton but est de remplacer un O par un * dans un fichier si je comprends bien ? Dans ce cas tu as juste à parcourir ton fichier avec fgetc() comme tu le fais, pas besoin de contrôler la position dans le fichier.
Il me semble que c'est parce qu'il doit remplacer un caractère précis, pas tous. Il y a peut-être d'autres 'O', mais c'est celui de la 3ème ligne, 5ème colonne qu'il doit remplacer. Quelque chose comme ça. Peut-être. Ou pas.
Bref, encore un sujet inutile puisqu'on n'a aucune information permettant d'apporter une aide concrète.
Peut-être que ce petit exemple fera comprendre à socoolmen qu'un fichier n'est vraiment pas nécessaire
#include <stdio.h>
void display(char solitaire[][8]) {
for(int i=0;i<7;i++)
printf("%s\n",solitaire[i]);
puts("");
}
int main(void) {
char solitaire[7][8]=
{
{" xxx "},
{" xxx "},
{"xxxxxxx"},
{"xxx xxx"},
{"xxxxxxx"},
{" xxx "},
{" xxx "}
};
display(solitaire);
// on déplace la bille de la 4ème ligne 6ème colonne
// dans le 'trou' 4ème ligne 4ème colonne et
// on élimine la bille de la 4ème ligne 5ème colonne
solitaire[3][5]=' ';
solitaire[3][3]='x';
solitaire[3][4]=' ';
display(solitaire);
return(0);
}
Reste à mettre autour de ça la gestion de l'entrée du joueur.
- Edité par edgarjacobs 15 janvier 2021 à 16:56:46
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Peut-être que ce petit exemple fera comprendre à socoolmen qu'un fichier n'est vraiment pas nécessaire
#include <stdio.h>
void display(char solitaire[][8]) {
for(int i=0;i<7;i++)
printf("%s\n",solitaire[i]);
puts("");
}
int main(void) {
char solitaire[7][8]=
{
{" xxx "},
{" xxx "},
{"xxxxxxx"},
{"xxx xxx"},
{"xxxxxxx"},
{" xxx "},
{" xxx "}
};
display(solitaire);
// on déplace la bille de la 4ème ligne 6ème colonne
// dans le 'trou' 4ème ligne 4ème colonne et
// on élimine la bille de la 4ème ligne 5ème colonne
solitaire[3][5]=' ';
solitaire[3][3]='x';
solitaire[3][4]=' ';
display(solitaire);
return(0);
}
Reste à mettre autour de ça la gestion de l'entrée du joueur.
- Edité par edgarjacobs 15 janvier 2021 à 16:56:46
Merci beaucoup ! C'etait la chose qui me manquait pour mon projet !! Plus que quelques détail et j'aurais terminé je te remercie !
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent