A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
bon bah alors je vais essayer de coder tout ça alors pour que le changement de map et le déplacement se fasse bien et une fois cette partie achevée je reviendrai poster le code source pour que vous puissiez voir si j'ai été bonne elèvemerci a vous
Absolument pas...
si tu as une fonction moveTo(Position const & newPosition), quel besoin as tu de savoir que c'est un déplacementc'est indiqué dans le nom de la fonction
Par contre, il peut etre utile d'avoir une structure qui représente un déplacement (relatif à la position actuelle), mais je ne suis même pas sur que ce soit indispensable dans le cas présent (ce serait plutôt utile dans le cadre d'un jeu dans lequel les éléments peuvent se déplacer de plusieurs cases à la fois (comme les échecs, par exemple)
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Ha, je voyais ça différemment.
Mais effectivement, si on set juste la nouvelle position, on parle toujours de position et aucun typedef n'est utile.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef Position Deplacement; Deplacement d(5, 0); // représente un déplacement de 5 cases à droite player.move(d);
Question de point de vue je suppose.![]()
En effet, mais, l'un dans l'autre, on peut de toutes manières se dire que hors cas particulier d'une porte ou d'un télé-porteur, tout ne se déplace que d'une case à la fois dans un rpg.
Une fonction move pourrait donc très bien utiliser une direction (en fait une valeur énumérée représentant la direction dans laquelle aller et permettant d'identifier la nouvelle position) de manière bien plus efficace que s'il fallait utiliser une notion de distance relative en abscisse et en ordonnée
Je verrais sans doute quelque chose comme
De cette manière, la position reste ce qu'elle est sensée être: une donnée qui ne sert qu'à permettre aux différents objets qui en ont besoin de rendre les services que l'on attend de leur part (et dont l'utilisateur n'a absolument pas besoin de connaitre l'existence, à l'extrême limite
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 enum Direction { north, northWest, west, southWest, south, southEast, east, northEast }; class Gamer { public: int x() const{return position_.x();} int y() const{return position.y();} void move(Direction d) { switch(d) { case north: position_=Position(x(),y()+1); break; case northWest: position_=Position(x()-1,y()+1); break; case west: position_=Position(x()-1,y()); break; case southWest: position_=Position(x()-1,y()-1); break; case south: position_=Position(x(),y()-1); break; case southEast: position_=Position(x()+1,y()-1); break; case east: position_=Position(x()+1,y()); break; case northEast: position_=Position(x()+1,y()+1); break; } } /* tout le reste */ private: Position position_; };)
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
C'est probablement la meilleure solution si on à que des déplacements d'une case / tour oui (ce qui semble quelques chose d’acquis).
(avec une fonction moveTo(const Position& pos); pour les téléporteurs).
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Si on voulait être pédant, Déplacement devrait être un type séparé de Position, avec des opérations définies:
- Position + Position interdit
- Déplacement + Déplacement = Déplacement
- Position - Position = Déplacement
- Déplacement - Déplacement = Déplacement
- Position + Déplacement = Position
- Position * Nombre interdit
- Déplacement * Nombre = Déplacement
Et rajouter un static const Position origine = Position(0, 0) dans la classe Position, car soustraire/ajouter à l'origine est comment on convertit sémantiquement de l'un à l'autre:
- Position - Origine = Position - Position = Déplacement
- Origine + Déplacement = Position + Déplacement = Position
C'est exactement comme pour les points et les vecteurs en géométrie, en fait. Ou comme les DateTime et TimeSpan en .Net.
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
re bonjour
alors voila cette fois ci je viens par rapport a des problèmes de compilation j'ai corriger deja plusieurs des problèmes mais il y en a qui persiste donc pouvais vous me renseigner sur le pourquoi voici le code source :
main.cpp :
main.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 #include "main.h" using namespace std; int main() { map<Position, string> maplist; //<------ ici c'est le map que je comprend pas loadMapList(maplist) ; auto it = maplist.find(Position(0,0)); // find methode de map SMap Map; loadMap(Map, it.second); return 0; } /* Pour pouvoir utiliser la std::map, on a besoin de l'opérateur de *comparaison < * */ bool operator <(Position const & first, Position const & second) { return first.x() < second.x() || (first.x() == second.x() && first.y() < second.y() ); } /* et, tant qu'à faire, te l'opérateur de comparaison == (pour d'autres * usages ultérieurs, très certainement ;) */ bool operator ==(Position const & first, Position const & second) { return ( first.x() == second.x() && first.y() == second.y() ); } void loadMapList(std::map<Position, std::string> & toFill) { std::ifstream ifs("ephernia.txt"); int x; int y; std::string filename; while(ifs>>x>>y>>filename) { toFill.insert(std::make_pair(Position(x,y),filename)); // insert methode de map } } void loadMap(SMap & Map, std::string const & filename) { Map.tiles.clear(); //supprime les informations de la map précédante Map.wraps.clear(); ifstream ifs(filename); size_t rows; size_t cols; ifs>>rows>>cols; for(size_t y = 0; y <rows; ++y) { for(size_t x = 0; x <cols; ++x) { char c; ifs>>c; Map.tiles.push_back(c); } } int wrapCount; ifs>>wrapCount; for(int i = 0; i< wrapCount;++i) { SWrap wrap; ifs>>wrap.sourceX>>wrap.sourceY >>wrap.destMapX>>wrap.destMapY >>wrap.destX>>wrap.destY; Map.wraps.push_back(wrap); } ifs>>Map.title; }
position.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 #ifndef MAIN_H_INCLUDED #define MAIN_H_INCLUDED #include "position.h" #include "deplace.h" #include <iostream> #include <windows.h> #include <vector> #include <fstream> #include <map> #include <string> struct SMap { size_t rows; size_t cols; std::vector<unsigned char> tiles; std::vector<SWrap> wraps; std::string title; /* et, comme on peut travailler en orienté objets, on peut rajouter * une fonction membre qui renvoie le caractère qui se trouve en X,Y ;) */ const unsigned char tileAt(size_t x, size_t y) const {return tiles[y*cols + x];} /* et la même chose avec une Position (sait on jamais ;)) */ const unsigned char tileAt(Position const & pos) {return tileAt(pos.x(), pos.y());} }; struct SWrap { /*ici les coord de départ sur la map courante*/ int sourceX; int sourceY; /*ici, l'identification de la map de sortie: nom, coordonnées, etc.*/ int destMapX; int destMapY; /*ici les coordonnees d'arrive sur la map de sortie*/ int destX; int destY; }; bool operator <(Position const & first, Position const & second); bool operator ==(Position const & first, Position const & second); void loadMapList(std::map<Position, std::string> & toFill); void loadMap(SMap & Map, std::string const & filename); #endif // MAIN_H_INCLUDED
deplace.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #ifndef POSITION_H_INCLUDED #define POSITION_H_INCLUDED #include "main.h" class Position { public: Position(int x, int y):x_(x), y_(y){} int x() const{return x_;} int y() const{return y_;} private: int x_; int y_; }; #endif // POSITION_H_INCLUDED
et maintenant voici la liste d'erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 #ifndef DEPLACE_H_INCLUDED #define DEPLACE_H_INCLUDED #include "position.h" enum Direction { nord, nordouest, ouest, sudouest, sud, sudest, est, nordest }; class deplace { public: int x() const{return position_.x();} int y() const{return position_.y();} void bouger(Direction d) { switch(d) { case nord: position_=Position(x(),y()+1); break; case nordouest: position_=Position(x()-1,y()+1); break; case ouest: position_=Position(x()-1,y()); break; case sudouest: position_=Position(x()-1,y()-1); break; case sud: position_=Position(x(),y()-1); break; case sudest: position_=Position(x()+1,y()-1); break; case est: position_=Position(x()+1,y()); break; case nordest: position_=Position(x()+1,y()+1); break; } } /* tout le reste */ private: Position position_; }; #endif // DEPLACE_H_INCLUDED
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 In file included from main3.cpp:1: main.h:6:21: error: windows.h: Aucun fichier ou dossier de ce type In file included from main3.cpp:1: main.h:17: error: SWrap was not declared in this scope main.h:17: error: template argument 1 is invalid main.h:17: error: template argument 2 is invalid main3.cpp: In function int main(): main3.cpp:9: error: ISO C++ forbids declaration of it with no type main3.cpp:9: error: cannot convert std::_Rb_tree_iterator<std::pair<const Position, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > to int in initialization main3.cpp:11: error: request for member second in it, which is of non-class type int main3.cpp: In function void loadMap(SMap&, const std::string&): main3.cpp:48: error: request for member clear in Map->SMap::wraps, which is of non-class type int main3.cpp:49: error: no matching function for call to std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) /usr/include/c++/4.4/fstream:454: note: candidates are: std::basic_ifstream<_CharT, _Traits>::basic_ifstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/c++/4.4/fstream:440: note: std::basic_ifstream<_CharT, _Traits>::basic_ifstream() [with _CharT = char, _Traits = std::char_traits<char>] /usr/include/c++/4.4/iosfwd:81: note: std::basic_ifstream<char, std::char_traits<char> >::basic_ifstream(const std::basic_ifstream<char, std::char_traits<char> >&) main3.cpp:70: error: request for member push_back in Map->SMap::wraps, which is of non-class type int
Les erreurs sont pourtant on ne peut plus claires..
Il ne trouve pas windows.h, tu es bien sur windows ? sous visual ?
Tu fais appel à SWrap avant sa déclaration
Tu compiles en C++11 ?
Et enfin tu appelles de nombreuses méthodes à priori inexistantes..
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Pour window.h ce n'est pas un problème c'est parce que la je suis sous linux étant pas cher moi.
pour SWrap je comprenais pas pourquoi merci de m'avoir faire remarquer.
je ne sais pas si il compile en c++11 là actuellement j'utilise g++ donc faut que je vois de ce coté la.
edit : pour compiler avec c++11 il faut fairepour ceux qu'il ne le saurait pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part g++ -std=c++0x
Alors, une fois tout ça corrigé, ça marche?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Non toujours pas il m'affiche cette erreur-là
apparemment il n'utilise pas forcement le bon type pour it d’après se que je comprend mais quand je remplace auto par
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 main3.cpp: In function int main(): main3.cpp:11: error: struct std::_Rb_tree_iterator<std::pair<const Position, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > has no member named second
il veut que j'initialise it donc impasse encore
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::map<Postion, std::string>::const_iterator
Un iterator est similaire à un pointeur.
Pour accéder aux membres il faut le déférencer. (*it).second.
it->second devrait aussi marcher.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
re bonjour
alors voila j'ai un probleme au a ce niveau lapour moi cette ligne lis bit a bit dans le fichier enfin d'aprés se que j'ai vue sur l'operateur >>
Code : Sélectionner tout - Visualiser dans une fenêtre à part ifs>>rows>>cols;
mais quand je fait un jeu de testil me renvoie 4329470 et 2686512 avant la ligne du dessus
Code : Sélectionner tout - Visualiser dans une fenêtre à part cout << rows << " " << cols <<endl;
puis aprés la ligne du dessus il me renvoie 0 et 2686512 donc aprés il ne peut rentrer dans la boucle etant deja a 0 .
donc ma question est la suivante est ce normal ? ai je mal interpreter la ligne ?
Bonsoir,
on en est déjà à 5 pages, et les questions sont pour la plupart somme toute assez basiques et totalement différentes (la règle du forum étant normalement 1 topic = 1 question).
Comme préconisé en première page, tu sembles un peu limite pour ce genre de projets, même si je suis le premier à dire qu'il s'agit du genre de chose idéale pour progresser.
Mais là, ça ressemble beaucoup à du "try(fail) & ask"... sans recherche personnelle.
Une simple recherche google sur ifstream::operator>> te retourne en premier résultat la doc correspondante.
Et la première phrase en gras indique noir sur blanc
Donc non il ne s'agit pas d'une lecture bit à bit mais d'une extraction de données formatées. Et c'est d'ailleurs la force de cet opérateur.Envoyé par la doc
Ce qui ressemble beaucoup à des variables non initialisées et donc inutilisables.il me renvoie 4329470 et 2686512 avant la ligne du dessus
Tout simplement parce que ton fichier contient un 0 puis un 2686512. rows et cols étant probablement des int.aprés la ligne du dessus il me renvoie 0 et 2686512
Donc oui le comportement est normal, et le sera toujours (sauf bug du compilateur ou dans la stl, ce qui me parait sufisament proche de l'impossible pour être écarté d'office).
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
le fait est que je ne voulais ouvrir plusieur topic pour un seul et meme theme donc voila pourquoi je rester sur le meme topic
alors pour info j'ai chercher je n'est compris d'ou ma question la preuve que j'ai chercher car ma lecture bit a bit etait le resultat du lien que j'avais trouvé, donc voila juste une question de recherche mal faite désoler.
aprés il est plus que sur que je ne le niveau pour réaliser un tel projet mais je suis motiver la preuve comme vous l'avez dis cela fait 5 page.
et pour l'initialisation je m'en douter un que cela pouvais provenir de la donc je vais faire en sorte de voir cela merci
Partager