Excellente déduction, mister Watson ;)
Version imprimable
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ève :D merci a vous
Absolument pas...
si tu as une fonction moveTo(Position const & newPosition), quel besoin as tu de savoir que c'est un déplacement :question: c'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 ;))
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:
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:
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_; };
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).
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.
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:
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:
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:
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'erreurCode:
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:
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..
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 pasCode:g++ -std=c++0x
Alors, une fois tout ça corrigé, ça marche?
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 parCode:
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 encoreCode: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.
Merci cela marche déjà mieux.
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:ifs>>rows>>cols;
mais quand je fait un jeu de testil me renvoie 4329470 et 2686512 avant la ligne du dessusCode: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.Citation:
Envoyé par la doc
Ce qui ressemble beaucoup à des variables non initialisées et donc inutilisables.Citation:
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.Citation:
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).
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
Aaaarrrggghh comment ça marche n'est pas gage de qualité à ce niveau...
Oui >> est un opérateur sur les bits, quand utilisé sur un type de base. Il s'agit du décallage à droite, et pour un int ça revient à diviser par 2 par exemple.
Mais là tu as une ifstream... et l'opérateur est alors surchargé.
Btw, un tableau récapitulatif des opérateurs (C & C++)
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Et pour les sites référence, cppreference, cpp.com, ou tout simplement developpez qui possède une FAQ et des cours.
Merci pour ces différents liens cela permettra de réduire les questions basiques pour laisser place à des questions plus techniques
Non stackoverflow on peut faire traduire par google donc l'anglais tranquille :lol: