X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/graphlib.git/blobdiff_plain/acf4714da7838afe963be32f33eca132ad9a1e00..ba95ae86a1edaa7af7e576bf30b39a3934693bd4:/chateaux/chateaux.cpp diff --git a/chateaux/chateaux.cpp b/chateaux/chateaux.cpp index b6c26e2..6ad81b7 100644 --- a/chateaux/chateaux.cpp +++ b/chateaux/chateaux.cpp @@ -6,8 +6,8 @@ #include #include -/* Note : les coordonnées réelles vont de -100 à +100 en abscisse, et - * de -10 à +140 en ordonnée +/* Note : les coordonnées réelles vont de -100 à +100 en abscisse, et + * de -10 à +140 en ordonnée */ const float PI = 4.0 * atan(1.0); @@ -22,6 +22,8 @@ const float hauteurMax = 130; const float largeurMin = 40; const float largeurMax = 150; +const float ventMax = 30; + const float largeurChateau = 8.5; const float hauteurChateau = 7; @@ -33,13 +35,15 @@ const float k = 0.005; const float dt = 0.05; int nbJoueurs = 2; +int score1 = 0; +int score2 = 0; float largeurMont; float hauteurMont; float wnd; -/* Retourne un nombre pseudo-aléatoire compris entre 0 et le paramètre - * 'max' (exclus) +/* Retourne un nombre pseudo-aléatoire compris entre le paramètre + * 'min' (inclus) et le paramètre 'max' (exclus) */ float frand(float min, float max) { @@ -56,26 +60,26 @@ float deg2rad(float deg) return deg * PI / 180.0; } -// conversion coordonnées réelles -> coordonnées fenêtre +// conversion coordonnées réelles -> coordonnées fenêtre int rtowX(const DrawingWindow& w, float rx) { - return (int )roundf(w.width * (rx - rXMin) / (rXMax - rXMin + 1.0)); + return (int )roundf((w.width - 1) * (rx - rXMin) / (rXMax - rXMin)); } int rtowY(const DrawingWindow& w, float ry) { - return (int )roundf(w.height * (rYMax - ry) / (rYMax - rYMin + 1.0)); + return (int )roundf((w.height - 1) * (rYMax - ry) / (rYMax - rYMin)); } -// conversion coordonnées réelles -> coordonnées fenêtre +// conversion coordonnées fenêtre -> coordonnées réelles float wtorX(const DrawingWindow& w, int wx) { - return (rXMax - rXMin + 1.0) * wx / w.width + rXMin; + return (rXMax - rXMin) * wx / (w.width - 1) + rXMin; } float wtorY(const DrawingWindow& w, int wy) { - return -(rYMax - rYMin + 1.0) * wy / w.height - rYMax; + return -(rYMax - rYMin) * wy / (w.height - 1) + rYMax; } float hauteurMontagne(float largeur, float hauteur, float x) @@ -171,7 +175,7 @@ void dessineExplosion(DrawingWindow& w, float rx, float ry) w.drawCircle(x, y, i); w.msleep(10); } - w.fillCircle(x, y, maxray - 1); + // w.fillCircle(x, y, maxray - 1); } void dessineFlammes(DrawingWindow& w, float x0, float y0) @@ -200,10 +204,11 @@ void initialise(DrawingWindow& w) { largeurMont = frand(largeurMin, largeurMax); hauteurMont = frand(hauteurMin, hauteurMax); - wnd = frand(-30, 30); + wnd = frand(-ventMax, ventMax); w.setBgColor("skyblue"); w.clearGraph(); dessineTerrain(w, largeurMont, hauteurMont); + dessineVent(w, wnd); dessineChateau(w, positionChateau1); dessineChateau(w, positionChateau2); w.setColor("wheat"); @@ -211,11 +216,14 @@ void initialise(DrawingWindow& w) Qt::AlignHCenter); w.drawText(rtowX(w, positionChateau2), rtowY(w, 0) + 8, "Joueur 2", Qt::AlignHCenter); - dessineVent(w, wnd); + std::stringstream s; + s << score1 << " / " << score2; + w.drawText(rtowX(w, 0), rtowY(w, 0) + 8, s.str(), + Qt::AlignHCenter); } -/* Retour : numéro du perdant, 0 sinon - x et y contiennent les coordonnées de la collision +/* Retour : numéro du perdant, 0 sinon + x et y contiennent les coordonnées de la collision */ int tir(DrawingWindow& w, float x0, float y0, float v0, float alpha, float& x, float &y) @@ -241,6 +249,7 @@ int tir(DrawingWindow& w, vy += ay * dt; w.msleep(10); +// w.sync(); w.setColor("skyblue"); w.fillCircle(wx, wy, 2); // w.setColor("black"); @@ -274,6 +283,7 @@ int jeu1(DrawingWindow& w) do { joueur = 3 - joueur; + w.sync(); std::cout << "-=| Joueur " << joueur << " |=-"; float alpha; @@ -286,41 +296,41 @@ int jeu1(DrawingWindow& w) } else { alpha = frand(10, 90); v0 = frand(10, 100); - std::cout << " [ " << alpha << " ; " << v0 << " ]\n"; + std::cout << " [ " << (int )alpha << "° ; " << (int )v0 << " ]" + << std::endl; } alpha = deg2rad(alpha); float x0; if (joueur == 1) { - x0 = positionChateau1 + 8; + x0 = positionChateau1 + 0.8 * largeurChateau; } else { - x0 = positionChateau2 - 8; + x0 = positionChateau2 - 0.8 * largeurChateau; alpha = PI - alpha; } - float y0 = 8; + float y0 = hauteurChateau + 1; perdant = tir(w, x0, y0, v0, alpha, x, y); dessineExplosion(w, x, y); dessineVent(w, wnd); } while (!perdant); dessineFlammes(w, x, y); std::stringstream msg; - msg << "Joueur " << perdant; + msg << " Joueur " << perdant; if (perdant == joueur) - msg << " s'est suicidé !"; + msg << " s'est suicidé ! "; else - msg << " a perdu !"; + msg << " a perdu ! "; w.setColor("darkred"); w.setBgColor("white"); - w.drawTextBg(w.width / 2, w.height / 3, msg.str().c_str(), + w.drawTextBg(w.width / 2, w.height / 3, msg.str(), Qt::AlignCenter); - std::cout << msg.str() << "\n"; + w.sync(); + std::cout << msg.str() << std::endl; return perdant; } void jeu(DrawingWindow& w) { - int score1 = 0; - int score2 = 0; bool rejouer = true; do { int perdant = jeu1(w); @@ -328,7 +338,8 @@ void jeu(DrawingWindow& w) score2++; else if (perdant == 2) score1++; - std::cout << "### SCORE : " << score1 << " / " << score2 << " ###\n"; + std::cout << "### SCORE : " << score1 << " / " << score2 << " ###" + << std::endl; if (nbJoueurs == 0) w.sleep(2); else {