model divided into game => model and plateau
[quoridor:quoridor.git] / Model.cpp
1 /*
2  * Model.cpp
3  *
4  *  Created on: 22 sept. 2010
5  *      Author: mike
6  */
7
8 #include "Model.h"
9 #include <iostream>
10
11 using namespace std;
12
13 Model *Model::instance = 0;
14
15 Model *Model::getInstance(){
16         if (instance == 0){
17                 instance = new Model(NB_JOUEUR_DEFAULT, NB_LIGNE_DEFAULT);
18         }
19         return instance;
20 }
21
22 Model::Model(){
23         Model::Model(NB_JOUEUR_DEFAULT, NB_LIGNE_DEFAULT);
24 }
25
26 Model::Model(int nbJoueurs, int nbLignes){
27         this->nbJoueurs = nbJoueurs;
28         this->tour = 0;
29         if (((nbLignes % 2) == 1) ) {
30                 this->nbLignes = nbLignes;
31         }
32         else {
33                 this->nbLignes = NB_LIGNE_DEFAULT;
34         }
35         this->tabJoueurs = new Plateau::Coordonee[this->nbJoueurs];
36         placerJoueurs();
37         int b = (this->nbLignes + 1) * 2 / this->nbJoueurs ;
38         this->listeBarreRestante = new int[this->nbJoueurs];
39         for (int i=0; i<this->nbJoueurs; i++){
40                 this->listeBarreRestante[i] = b;
41         }
42         plateau = new Plateau(this->nbLignes);
43
44 }
45
46
47
48 int Model::getTour() {
49         return this->tour;
50 }
51
52 void Model::avancer(int numJoueur) {
53         Plateau::Coordonee posDepart = this->getPositionJoueur(numJoueur);
54
55         //Si le joueur se déplace verticalement sur le plateau.
56         Plateau::Coordonee posArrive;
57         posArrive.x = posDepart.x;
58         posArrive.y = posDepart.y + AVANT;
59
60         //cout << "y arrive" <<posArrive.y << endl;
61
62         //Si il n'y a pas de barriere.
63         if (plateau->deplacementVerticalPossible(posDepart,posArrive)){
64                 //Si le joueur est en face, on passe au dessus (si il n'y a pas de barriere).
65                 if (this->getPositionJoueur(autreJoueur(numJoueur)) == posArrive){
66                         Plateau::Coordonee posArrive2;
67                         posArrive2.y = posArrive.y + AVANT;
68                         posArrive2.x = posArrive.x;
69                         if (plateau->deplacementVerticalPossible(posArrive,posArrive2)){
70                                 posArrive = posArrive2;
71                         }
72                         else{
73                                 //TODO
74                         }
75                 }
76                 this->setPositionJoueur(numJoueur, posArrive);
77         } else {
78                 cout << "on ne peut pas avancer" << endl;
79         }
80
81         tourSuivant();
82 }
83
84 void Model::reculer(int numJoueur) {
85         Plateau::Coordonee posDepart = this->instance->getPositionJoueur(numJoueur);
86         //Si le joueur se déplace verticalement sur le plateau.
87         Plateau::Coordonee posArrive;
88         posArrive.x = posDepart.x;
89         posArrive.y = posDepart.y + ARRIERE;
90
91         if (plateau->deplacementVerticalPossible(posDepart,posArrive)){
92                 this->setPositionJoueur(numJoueur, posArrive);
93         } else {
94                 cout << "on ne peut pas reculer" << endl;
95         }
96
97         tourSuivant();
98 }
99
100 void Model::gauche(int numJoueur) {
101         Plateau::Coordonee posDepart = this->instance->getPositionJoueur(numJoueur);
102         //Si le joueur se déplace verticalement sur le plateau.
103         Plateau::Coordonee posArrive;
104
105         posArrive.y = posDepart.y;
106         posArrive.x = posDepart.x + GAUCHE;
107
108         if (plateau->deplacementHorizontalPossible(posDepart,posArrive)){
109                 this->setPositionJoueur(numJoueur, posArrive);
110         } else {
111                 cout << "on ne peut pas aller a gauche" << endl;
112         }
113
114         tourSuivant();
115 }
116
117 void Model::droite(int numJoueur) {
118         Plateau::Coordonee posDepart = this->instance->getPositionJoueur(numJoueur);
119         //Si le joueur se déplace verticalement sur le plateau.
120         Plateau::Coordonee posArrive;
121
122         posArrive.y = posDepart.y;
123         posArrive.x = posDepart.x + DROITE;
124
125         if (plateau->deplacementHorizontalPossible(posDepart,posArrive)){
126                 this->setPositionJoueur(numJoueur, posArrive);
127         } else {
128                 cout << "on ne peut pas aller a droite" << endl;
129         }
130
131         tourSuivant();
132 }
133
134
135
136
137 int Model::getNombreDeJoueurs(){
138         return this->nbJoueurs;
139 }
140
141 void Model::setPositionJoueur(int numJoueur, Plateau::Coordonee nvPosition) {
142         this->tabJoueurs[numJoueur] = nvPosition;
143 }
144
145 Plateau::Coordonee Model::getPositionJoueur(int numJoueur) {
146         return this->tabJoueurs[numJoueur];
147 }
148
149 int Model::getNombreBarrieresRestantes(int numJoueurs) {
150         return this->listeBarreRestante[numJoueurs];
151 }
152
153 int Model::getNbLignes(){
154         return this->nbLignes;
155         //return NB_LIGNE_DEFAULT;
156 }
157
158 void Model::placerJoueurs(){
159         int milieu = (this->nbLignes + 1) / 2 ;
160         //joueur un
161         Plateau::Coordonee pos;
162         pos.x = milieu;
163         pos.y = this->nbLignes;
164
165         this->tabJoueurs[0] = pos;
166
167         //joueur deux
168         Plateau::Coordonee pos2 = pos;
169         pos2.y = 1;
170
171         this->tabJoueurs[1] = pos2;
172
173 }
174
175 void Model::tourSuivant() {
176         this->tour = autreJoueur(this->tour);
177 }
178
179 int Model::autreJoueur(int numJoueur) {
180         return (this->tour+1) % this->nbJoueurs;
181 }