From: Colin L. <col...@us...> - 2002-06-26 08:11:04
|
Update of /cvsroot/dudusdl/dudusdl/src In directory usw-pr-cvs1:/tmp/cvs-serv31843 Modified Files: Makefile.am Added Files: board.c bubble.c cpu.c game.c loading.c player.c text.c utils.c Removed Files: dudusdl.c dudusdl_1.c dudusdl_2.c dudusdl_3.c dudusdl_4.c Log Message: Code refactoring --- NEW FILE: board.c --- /* DuduSDL * board.c * * Copyright (C) 2000 Nicolas Peninguy and Colin Leroy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "dudusdl.h" //initialise les tableaux de tableauJeu void initialiser_tableau () { int numeroJoueur; srand (time (NULL)); for (numeroJoueur = 0; numeroJoueur <= nombreJoueurs; numeroJoueur++) { for (bouleCourante[numeroJoueur] = 0; bouleCourante[numeroJoueur] < 48; bouleCourante[numeroJoueur]++) { bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur]] = (int)((6.0 * rand()) / (RAND_MAX)); // Entre 0 & 6 bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur]] = tableauJeu[numeroJoueur][2] + 8 + 16 * (bouleCourante[numeroJoueur] / 12); if ((bouleCourante[numeroJoueur] / 12) % 2 == 0) bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur]] = tableauJeu[numeroJoueur][0] + 8 + 16 * (bouleCourante[numeroJoueur] % 12); else bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur]] = tableauJeu[numeroJoueur][0] + 16 + 16 * (bouleCourante[numeroJoueur] % 12); bouleArrivee[numeroJoueur][bouleCourante[numeroJoueur]] = 1; bouleExiste[numeroJoueur][bouleCourante[numeroJoueur]] = bouleEtatExistence[numeroJoueur]; if (bouleCourante[numeroJoueur] / 12 == 0) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [0] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [1] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [2] = bouleCourante[numeroJoueur] + 1; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [3] = bouleCourante[numeroJoueur] + 12; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [4] = bouleCourante[numeroJoueur] + 11; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [5] = bouleCourante[numeroJoueur] - 1; } if (bouleCourante[numeroJoueur] / 12 == 1) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [0] = bouleCourante[numeroJoueur] - 12; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [1] = bouleCourante[numeroJoueur] - 11; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [2] = bouleCourante[numeroJoueur] + 1; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [3] = bouleCourante[numeroJoueur] + 13; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [4] = bouleCourante[numeroJoueur] + 12; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [5] = bouleCourante[numeroJoueur] - 1; } if (bouleCourante[numeroJoueur] / 12 == 2) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [0] = bouleCourante[numeroJoueur] - 13; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [1] = bouleCourante[numeroJoueur] - 12; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [2] = bouleCourante[numeroJoueur] + 1; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [3] = bouleCourante[numeroJoueur] + 12; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [4] = bouleCourante[numeroJoueur] + 11; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [5] = bouleCourante[numeroJoueur] - 1; } if (bouleCourante[numeroJoueur] / 12 == 3) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [0] = bouleCourante[numeroJoueur] - 12; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [1] = bouleCourante[numeroJoueur] - 11; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [2] = bouleCourante[numeroJoueur] + 1; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [3] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [4] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]] [5] = bouleCourante[numeroJoueur] - 1; } } boulePointAccrochage[numeroJoueur][0][0] = LIBRE; boulePointAccrochage[numeroJoueur][0][1] = LIBRE; boulePointAccrochage[numeroJoueur][0][2] = 1; boulePointAccrochage[numeroJoueur][0][3] = 12; boulePointAccrochage[numeroJoueur][0][4] = LIBRE; boulePointAccrochage[numeroJoueur][0][5] = LIBRE; boulePointAccrochage[numeroJoueur][11][0] = LIBRE; boulePointAccrochage[numeroJoueur][11][1] = LIBRE; boulePointAccrochage[numeroJoueur][11][2] = LIBRE; boulePointAccrochage[numeroJoueur][11][3] = 23; boulePointAccrochage[numeroJoueur][11][4] = 22; boulePointAccrochage[numeroJoueur][11][5] = 10; boulePointAccrochage[numeroJoueur][12][0] = 0; boulePointAccrochage[numeroJoueur][12][1] = 1; boulePointAccrochage[numeroJoueur][12][2] = 13; boulePointAccrochage[numeroJoueur][12][3] = 25; boulePointAccrochage[numeroJoueur][12][4] = 24; boulePointAccrochage[numeroJoueur][12][5] = LIBRE; boulePointAccrochage[numeroJoueur][23][0] = 11; boulePointAccrochage[numeroJoueur][23][1] = LIBRE; boulePointAccrochage[numeroJoueur][23][2] = LIBRE; boulePointAccrochage[numeroJoueur][23][3] = LIBRE; boulePointAccrochage[numeroJoueur][23][4] = 35; boulePointAccrochage[numeroJoueur][23][5] = 22; boulePointAccrochage[numeroJoueur][24][0] = LIBRE; boulePointAccrochage[numeroJoueur][24][1] = 12; boulePointAccrochage[numeroJoueur][24][2] = 25; boulePointAccrochage[numeroJoueur][24][3] = 36; boulePointAccrochage[numeroJoueur][24][4] = LIBRE; boulePointAccrochage[numeroJoueur][24][5] = LIBRE; boulePointAccrochage[numeroJoueur][35][0] = 22; boulePointAccrochage[numeroJoueur][35][1] = 23; boulePointAccrochage[numeroJoueur][35][2] = LIBRE; boulePointAccrochage[numeroJoueur][35][3] = 47; boulePointAccrochage[numeroJoueur][35][4] = 46; boulePointAccrochage[numeroJoueur][35][5] = 34; boulePointAccrochage[numeroJoueur][36][0] = 24; boulePointAccrochage[numeroJoueur][36][1] = 25; boulePointAccrochage[numeroJoueur][36][2] = 37; boulePointAccrochage[numeroJoueur][36][3] = LIBRE; boulePointAccrochage[numeroJoueur][36][4] = LIBRE; boulePointAccrochage[numeroJoueur][36][5] = LIBRE; boulePointAccrochage[numeroJoueur][47][0] = 35; boulePointAccrochage[numeroJoueur][47][1] = LIBRE; boulePointAccrochage[numeroJoueur][47][2] = LIBRE; boulePointAccrochage[numeroJoueur][47][3] = LIBRE; boulePointAccrochage[numeroJoueur][47][4] = LIBRE; boulePointAccrochage[numeroJoueur][47][5] = 46; bouleCourante[numeroJoueur] = 48; bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur]] = (int)((6.0 * rand()) / (RAND_MAX)); // Entre 0 & 5 // (rand () + 3000) / 6500; bouleExiste[numeroJoueur][bouleCourante[numeroJoueur]] = bouleEtatExistence[numeroJoueur]; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][0] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][1] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][2] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][3] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][4] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][5] = LIBRE; bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur] + 1] = (int)((6.0 * rand()) / (RAND_MAX)); // Entre 0 & 5 // (rand () + 3000) / 6500; bouleExiste[numeroJoueur][bouleCourante[numeroJoueur] + 1] = bouleEtatExistence[numeroJoueur]; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][0] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][1] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][2] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][3] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][4] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][5] = LIBRE; bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur]] = viseurCoordX[numeroJoueur]; bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur]] = viseurCoordY[numeroJoueur] + 1; dernierTemps_horl[numeroJoueur] = time (NULL); } } //affiche le viseur, qui est constitué d'un ensemble de lignes. void afficher_viseur (int numeroJoueur) { Line (viseurCoordX[numeroJoueur], viseurCoordY[numeroJoueur], viseurCoordX[numeroJoueur] + 35 * cos (a[numeroJoueur]), viseurCoordY[numeroJoueur] - 35 * sin (a[numeroJoueur]), 7); Line (viseurCoordX[numeroJoueur] + 35 * cos (a[numeroJoueur]), viseurCoordY[numeroJoueur] - 35 * sin (a[numeroJoueur]), viseurCoordX[numeroJoueur] + 30 * cos (a[numeroJoueur] + .1), viseurCoordY[numeroJoueur] - 30 * sin (a[numeroJoueur] + .1), 7); Line (viseurCoordX[numeroJoueur] + 35 * cos (a[numeroJoueur]), viseurCoordY[numeroJoueur] - 35 * sin (a[numeroJoueur]), viseurCoordX[numeroJoueur] + 30 * cos (a[numeroJoueur] - .1), viseurCoordY[numeroJoueur] - 30 * sin (a[numeroJoueur] - .1), 7); Line (viseurCoordX[numeroJoueur] + 30 * cos (a[numeroJoueur] + .1), viseurCoordY[numeroJoueur] - 30 * sin (a[numeroJoueur] + .1), viseurCoordX[numeroJoueur] + 30 * cos (a[numeroJoueur] - .1), viseurCoordY[numeroJoueur] - 30 * sin (a[numeroJoueur] - .1), 7); for (angle = a[numeroJoueur] + 3.1415 / 8; angle >= -9 * 3.1415 / 8 + a[numeroJoueur]; angle -= 3.1415 / 16) { Line (viseurCoordX[numeroJoueur] + 23 * cos (angle), viseurCoordY[numeroJoueur] - 23 * sin (angle), viseurCoordX[numeroJoueur] + 25 * cos (angle), viseurCoordY[numeroJoueur] - 25 * sin (angle), 7); Line (viseurCoordX[numeroJoueur] + 35.92 + 11 * cos (3.1415 - angle), viseurCoordY[numeroJoueur] + .38 - 11 * sin (3.1415 - angle), viseurCoordX[numeroJoueur] + 35.92 + 8 * cos (3.1415 - angle), viseurCoordY[numeroJoueur] + .38 - 8 * sin (3.1415 - angle), 7); } Line (viseurCoordX[numeroJoueur], viseurCoordY[numeroJoueur], viseurCoordX[numeroJoueur] + 25 * cos (a[numeroJoueur] + 3.1415), viseurCoordY[numeroJoueur] - 25 * sin (a[numeroJoueur] + 3.1415), 7); Line (viseurCoordX[numeroJoueur] + 35.92, viseurCoordY[numeroJoueur] + .38, viseurCoordX[numeroJoueur] + 35.92 + 8 * cos (-a[numeroJoueur]), viseurCoordY[numeroJoueur] + .38 - 8 * sin (-a[numeroJoueur]), 7); } //déplace le viseur du joueur qui le demande void bouger_viseur (int numeroJoueur) { if ((gauche[numeroJoueur]) && a[numeroJoueur] < 3.1415 - .1) { a[numeroJoueur] += .03; if (deg[numeroJoueur] > 0) deg[numeroJoueur]--; else deg[numeroJoueur] = 3; } else if ((droite[numeroJoueur]) && a[numeroJoueur] > 0 + .1) { a[numeroJoueur] -= .03; if (deg[numeroJoueur] < 3) deg[numeroJoueur]++; else deg[numeroJoueur] = 0; } if ((haut[numeroJoueur]) && a[numeroJoueur] < 3.1415 / 2) { a[numeroJoueur] += .03; if (deg[numeroJoueur] > 0) deg[numeroJoueur]--; else deg[numeroJoueur] = 3; } else if ((haut[numeroJoueur]) && a[numeroJoueur] > 3.1415 / 2) { a[numeroJoueur] -= .03; if (deg[numeroJoueur] < 3) deg[numeroJoueur]++; else deg[numeroJoueur] = 0; } } //prépare la Descente du plateau void descendrePlateau (int numeroJoueur) { nombreCoups[numeroJoueur] = 0; descendreBulles (numeroJoueur); tremblement[numeroJoueur] = 0; dbouge[numeroJoueur] = 1; } //decale toutes les bulles vers le bas //lorsque le plateau descend void descendreBulles (int numeroJoueur) { int k; degreDescente[numeroJoueur]++; for (k = 0; k < bouleCourante[numeroJoueur]; k++) bouleCoordY[numeroJoueur][k] += 16; } //affiche le reste du tableau de tableauJeu void afficher_elements (int numeroJoueur) { for (i = 0; i < bouleCourante[numeroJoueur]; i++) { //bulle normale if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur] || bouleVitesseChute[numeroJoueur][i]) PutPic (bouleCouleur[numeroJoueur][i], bouleCoordX[numeroJoueur][i] - 8 + tremblement[numeroJoueur], bouleCoordY[numeroJoueur][i] - 8); else if (bouleExiste[numeroJoueur][i] > bouleEtatExistence[numeroJoueur] / 2) { PutPic (EXPLOSION, bouleCoordX[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] - 8); bouleExiste[numeroJoueur][i]--; } else //fin d'explosion if (bouleExiste[numeroJoueur][i] > 0) { PutPic (FIN_EXPLOSION, bouleCoordX[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] - 8); bouleExiste[numeroJoueur][i]--; } } i = bouleCourante[numeroJoueur]; PutPic (bouleCouleur[numeroJoueur][i], bouleCoordX[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] - 8); PutPic (bouleCouleur[numeroJoueur][i + 1], viseurCoordX[numeroJoueur] - 60, viseurCoordY[numeroJoueur] - 6); //verin et plateau if (degreDescente[numeroJoueur] > 0) { PutPic (PLATEAU, tableauJeu[numeroJoueur][0], tableauJeu[numeroJoueur][2] + 16 * (degreDescente[numeroJoueur] - 1)); if (degreDescente[numeroJoueur] > 1) for (i = 0; i <= degreDescente[numeroJoueur] - 2; i++) PutPic (VERIN, tableauJeu[numeroJoueur][0], tableauJeu[numeroJoueur][2] + 16 * i); } //affichage des cadres des tableaux des joueurs if (nombreJoueurs > 1) { Line (tableauJeu[numeroJoueur][0], tableauJeu[numeroJoueur][2], tableauJeu[numeroJoueur][1], tableauJeu[numeroJoueur][2], 4); Line (tableauJeu[numeroJoueur][0], tableauJeu[numeroJoueur][2], tableauJeu[numeroJoueur][0], tableauJeu[numeroJoueur][3], 4); Line (tableauJeu[numeroJoueur][1], tableauJeu[numeroJoueur][2], tableauJeu[numeroJoueur][1], tableauJeu[numeroJoueur][3], 4); } Line (tableauJeu[numeroJoueur][0], tableauJeu[numeroJoueur][3] - 16, tableauJeu[numeroJoueur][1], tableauJeu[numeroJoueur][3] - 16, 100); prevenirBoulesMalus (numeroJoueur); //affichage du scoreJoueur scoreChaineCar[numeroJoueur][0] = (scoreJoueur[numeroJoueur]) / 10 + 48; scoreChaineCar[numeroJoueur][1] = (scoreJoueur[numeroJoueur]) % 10 + 48; scoreChaineCar[numeroJoueur][2] = 0; PutTXT (0, scoreChaineCar[numeroJoueur], 0, viseurCoordX[numeroJoueur] + 68, viseurCoordY[numeroJoueur] - 7); nombreBoules[numeroJoueur][0] = bouleCourante[numeroJoueur] / 100 + 48; nombreBoules[numeroJoueur][1] = (bouleCourante[numeroJoueur] % 100) / 10 + 48; nombreBoules[numeroJoueur][2] = (bouleCourante[numeroJoueur] % 100) % 10 + 48; nombreBoules[numeroJoueur][3] = 0; } --- NEW FILE: bubble.c --- /* DuduSDL * bubble.c * * Copyright (C) 2000 Nicolas Peninguy and Colin Leroy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "dudusdl.h" //deplace la bulle lancee et non-arrivee void deplacer_bulle (int numeroJoueur) { bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] += vitesseAxeY * cos (bouleCoefDir[numeroJoueur][bouleCourante[numeroJoueur] - 1]); bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] -= vitesseAxeY * sin (bouleCoefDir[numeroJoueur][bouleCourante[numeroJoueur] - 1]); } int bouleRebond_ou_Arrivee (int numeroJoueur) { int rebondArrivee = 0; int deltax, deltay, delta; if (bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] <= tableauJeu[numeroJoueur][2] + (degreDescente[numeroJoueur] * 16) + 8) rebondArrivee = 1; if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] < tableauJeu[numeroJoueur][0] + 8 || bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] > tableauJeu[numeroJoueur][1] - 8) bouleCoefDir[numeroJoueur][bouleCourante[numeroJoueur] - 1] = 3.1415 - bouleCoefDir[numeroJoueur][bouleCourante[numeroJoueur] - 1]; for (i = 0; i <= bouleCourante[numeroJoueur] - 2; i++) if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur]) { deltax = bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] - bouleCoordX[numeroJoueur][i]; deltay = bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] - bouleCoordY[numeroJoueur][i]; delta = deltax * deltax + deltay * deltay; if (delta < 250) rebondArrivee = 1; } for (i = 0; i < bouleCourante[numeroJoueur] - 1; i++) if (bouleExiste[numeroJoueur][i]) if (bouleCoordY[numeroJoueur][i] >= tableauJeu[numeroJoueur][3] - 8) joueurVivant[numeroJoueur] = 0; return (rebondArrivee); } //aligne la bulle arrivee sur une grille hexagonale void classerBoules (int numeroJoueur) { int rangee=0; int clas = 0; for (i = 0; i < 17; i++) { if (bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] < tableauJeu[numeroJoueur][2] + (degreDescente[numeroJoueur] + i + 1) * 16 && bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] >= tableauJeu[numeroJoueur][2] + (degreDescente[numeroJoueur] + i) * 16) { bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][2] + 8 + (degreDescente[numeroJoueur] + i) * 16; rangee = i; clas++; } } if (rangee % 2 == 0) { if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] > tableauJeu[numeroJoueur][0] + 12 * 16) bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][0] + 8 + 11 * 16; if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] <= tableauJeu[numeroJoueur][0]) bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][0] + 8; for (i = 0; i < 12; i++) { if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] < tableauJeu[numeroJoueur][0] + (i + 1) * 16 && bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] >= tableauJeu[numeroJoueur][0] + i * 16) { bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][0] + 8 + i * 16; clas++; } } } else { if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] > tableauJeu[numeroJoueur][0] + 8 + 12 * 16) bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][0] + 12 * 16; if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] <= tableauJeu[numeroJoueur][0] + 8) bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][0] + 16; for (i = 0; i < 12; i++) { if (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] < tableauJeu[numeroJoueur][0] + 8 + (i + 1) * 16 && bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] >= tableauJeu[numeroJoueur][0] + 8 + i * 16) { bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] = tableauJeu[numeroJoueur][0] + 16 + i * 16; clas++; } } } for (i = 0; i < bouleCourante[numeroJoueur] - 1; i++) if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur] && comparer (bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1], bouleCoordY[numeroJoueur][i] - 20, bouleCoordY[numeroJoueur][i] + 20) && comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1], bouleCoordX[numeroJoueur][i] - 20, bouleCoordX[numeroJoueur][i] + 20)) { if (comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] + 16, bouleCoordX[numeroJoueur][i] - 8, bouleCoordX[numeroJoueur][i] + 8) && comparer (bouleCoordY[numeroJoueur] [bouleCourante[numeroJoueur] - 1], bouleCoordY[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] + 8)) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] - 1][2] = i; boulePointAccrochage[numeroJoueur][i][5] = bouleCourante[numeroJoueur] - 1; } if (comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] - 16, bouleCoordX[numeroJoueur][i] - 8, bouleCoordX[numeroJoueur][i] + 8) && comparer (bouleCoordY[numeroJoueur] [bouleCourante[numeroJoueur] - 1], bouleCoordY[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] + 8)) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] - 1][5] = i; boulePointAccrochage[numeroJoueur][i][2] = bouleCourante[numeroJoueur] - 1; } if (comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] + 8, bouleCoordX[numeroJoueur][i] - 8, bouleCoordX[numeroJoueur][i] + 8) && comparer (bouleCoordY[numeroJoueur] [bouleCourante[numeroJoueur] - 1] + 16, bouleCoordY[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] + 8)) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] - 1][3] = i; boulePointAccrochage[numeroJoueur][i][0] = bouleCourante[numeroJoueur] - 1; } if (comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] + 8, bouleCoordX[numeroJoueur][i] - 8, bouleCoordX[numeroJoueur][i] + 8) && comparer (bouleCoordY[numeroJoueur] [bouleCourante[numeroJoueur] - 1] - 16, bouleCoordY[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] + 8)) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] - 1][1] = i; boulePointAccrochage[numeroJoueur][i][4] = bouleCourante[numeroJoueur] - 1; } if (comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] - 8, bouleCoordX[numeroJoueur][i] - 8, bouleCoordX[numeroJoueur][i] + 8) && comparer (bouleCoordY[numeroJoueur] [bouleCourante[numeroJoueur] - 1] + 16, bouleCoordY[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] + 8)) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] - 1][4] = i; boulePointAccrochage[numeroJoueur][i][1] = bouleCourante[numeroJoueur] - 1; } if (comparer (bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] - 8, bouleCoordX[numeroJoueur][i] - 8, bouleCoordX[numeroJoueur][i] + 8) && comparer (bouleCoordY[numeroJoueur] [bouleCourante[numeroJoueur] - 1] - 16, bouleCoordY[numeroJoueur][i] - 8, bouleCoordY[numeroJoueur][i] + 8)) { boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] - 1][0] = i; boulePointAccrochage[numeroJoueur][i][3] = bouleCourante[numeroJoueur] - 1; } } } int compterBoulesIdentiques(int numeroJoueur, int boule, char *deja) { int i; int result = 0; deja[boule] = 1; for(i=0; i<6; i++) if ((boulePointAccrochage[numeroJoueur][boule][i] != LIBRE) && (!deja[boulePointAccrochage[numeroJoueur][boule][i]]) && (bouleCouleur[numeroJoueur][boule] == bouleCouleur[numeroJoueur] [boulePointAccrochage[numeroJoueur][boule][i]])) result = result + 1 + compterBoulesIdentiques(numeroJoueur, boulePointAccrochage[numeroJoueur][boule][i], deja); return result; } //teste si 3 bulles de meme couleur sont collees //et les fait exploser si c'est le cas void testerCouleursIdentiques (int numeroJoueur) { int colle[127], c, i, j; int deltax, deltay, delta; char deja[800]; time_t heure1, heure2; struct tms tms1, tms2; int diff; for(i=0;i<800;i++) deja[i] = 0; colle[0] = bouleCourante[numeroJoueur] - 1; for (i = 1; i < 127; i++) colle[i] = LIBRE; p = 1; for (c = 0; c <= p; c++) { for (i = 0; i < bouleCourante[numeroJoueur] - 1; i++) if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur]) { deltax = bouleCoordX[numeroJoueur][colle[c]] - bouleCoordX[numeroJoueur][i]; deltay = bouleCoordY[numeroJoueur][colle[c]] - bouleCoordY[numeroJoueur][i]; delta = deltax * deltax + deltay * deltay; if (delta < 321 && i != colle[c] && deja[i] == 0 && bouleCouleur[numeroJoueur][i] == bouleCouleur[numeroJoueur][colle[c]]) { colle[p] = i; deja[i] = 1; p++; } } } if (p > 2) for (i = 0; i <= p; i++) { if (colle[i] != LIBRE) { bouleExiste[numeroJoueur][colle[i]] = bouleEtatExistence[numeroJoueur] - 1; for (j = 0; j <= bouleCourante[numeroJoueur] - 1; j++) { if (boulePointAccrochage[numeroJoueur][j][0] == colle[i]) boulePointAccrochage[numeroJoueur][j][0] = LIBRE; if (boulePointAccrochage[numeroJoueur][j][1] == colle[i]) boulePointAccrochage[numeroJoueur][j][1] = LIBRE; if (boulePointAccrochage[numeroJoueur][j][2] == colle[i]) boulePointAccrochage[numeroJoueur][j][2] = LIBRE; if (boulePointAccrochage[numeroJoueur][j][3] == colle[i]) boulePointAccrochage[numeroJoueur][j][3] = LIBRE; if (boulePointAccrochage[numeroJoueur][j][4] == colle[i]) boulePointAccrochage[numeroJoueur][j][4] = LIBRE; if (boulePointAccrochage[numeroJoueur][j][5] == colle[i]) boulePointAccrochage[numeroJoueur][j][5] = LIBRE; } boulePointAccrochage[numeroJoueur][colle[i]][0] = LIBRE; boulePointAccrochage[numeroJoueur][colle[i]][1] = LIBRE; boulePointAccrochage[numeroJoueur][colle[i]][2] = LIBRE; boulePointAccrochage[numeroJoueur][colle[i]][3] = LIBRE; boulePointAccrochage[numeroJoueur][colle[i]][4] = LIBRE; boulePointAccrochage[numeroJoueur][colle[i]][5] = LIBRE; } } for (i = 0; i <= bouleCourante[numeroJoueur] - 1; i++) deja[i] = 0; } //teste si des bulles ne sont plus accrochees a aucune //autre (apres une explosion) et les met à même de tomber void detecterBoulesLibres (int numeroJoueur) { int j, cpt; // cpt2; for (i = 0; i < bouleCourante[numeroJoueur] - 1; i++) bouleGravite[numeroJoueur][i] = 0; for (j = 0; j < 4; j++) { for (i = 0; i < bouleCourante[numeroJoueur] - 1; i++) { if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur]) { if (bouleCoordY[numeroJoueur][i] <= tableauJeu[numeroJoueur][2] + (degreDescente[numeroJoueur] * 16) + 8) bouleGravite[numeroJoueur][i] = 1; if (bouleExiste[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][0]] != bouleEtatExistence[numeroJoueur]) bouleGravite[numeroJoueur][boulePointAccrochage[numeroJoueur] [i][0]] = 0; if (bouleExiste[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][1]] != bouleEtatExistence[numeroJoueur]) bouleGravite[numeroJoueur][boulePointAccrochage[numeroJoueur] [i][1]] = 0; if (bouleExiste[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][2]] != bouleEtatExistence[numeroJoueur]) bouleGravite[numeroJoueur][boulePointAccrochage[numeroJoueur] [i][2]] = 0; if (bouleExiste[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][3]] != bouleEtatExistence[numeroJoueur]) bouleGravite[numeroJoueur][boulePointAccrochage[numeroJoueur] [i][3]] = 0; if (bouleExiste[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][4]] != bouleEtatExistence[numeroJoueur]) bouleGravite[numeroJoueur][boulePointAccrochage[numeroJoueur] [i][4]] = 0; if (bouleExiste[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][5]] != bouleEtatExistence[numeroJoueur]) bouleGravite[numeroJoueur][boulePointAccrochage[numeroJoueur] [i][5]] = 0; if (bouleGravite[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][0]]) bouleGravite[numeroJoueur][i] = 1; if (bouleGravite[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][1]]) bouleGravite[numeroJoueur][i] = 1; if (bouleGravite[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][2]]) bouleGravite[numeroJoueur][i] = 1; if (bouleGravite[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][3]]) bouleGravite[numeroJoueur][i] = 1; if (bouleGravite[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][4]]) bouleGravite[numeroJoueur][i] = 1; if (bouleGravite[numeroJoueur] [boulePointAccrochage[numeroJoueur][i][5]]) bouleGravite[numeroJoueur][i] = 1; } } } cpt = -1; for (i = 0; i < bouleCourante[numeroJoueur] - 1; i++) { if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur] && !bouleGravite[numeroJoueur][i]) { p++; bouleExiste[numeroJoueur][i] = 0; do { bouleVitesseChute[numeroJoueur][i] = (int)(-(3.0 * rand()) / (RAND_MAX)); // Entre 0 et -3 // -(rand () + 5500) / 11000; } while (!bouleVitesseChute[numeroJoueur][i]); boulePointAccrochage[numeroJoueur][i][0] = boulePointAccrochage[numeroJoueur][i][1] = boulePointAccrochage[numeroJoueur][i][2] = boulePointAccrochage[numeroJoueur][i][3] = boulePointAccrochage[numeroJoueur][i][4] = boulePointAccrochage[numeroJoueur][i][5] = LIBRE; } } p -= 3; if (p < 0) p = 0; boulesEnvoyees[numeroJoueur] += p; if (maxBoulesEnvoyees < p) { maxBoulesEnvoyees = p; meilleurJoueur = numeroJoueur; } if (p >= 10 && nombreJoueurs < 2) { temp = (int)((11.0 * rand()) / (RAND_MAX)); // Entre 0 & 11 // = rand () / 2800; comment_delay = 100; } if (modeViolent) for (i = 0; i <= nombreJoueurs; i++) if (i != numeroJoueur && joueurVivant[i]) nbBoulesMalusRecuees[i] += p; if (!modeViolent) for (i = 0; i <= nombreJoueurs; i++) if (i != numeroJoueur && joueurVivant[i] && nombreJoueursVivants > 1) nbBoulesMalusRecuees[i] += p / (nombreJoueursVivants - 1); } //envoi aux autres joueurs des bulles malus void recevoirBoulesMalus (int numeroJoueur) { int coul1, coul2, j; //n coul1 = bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur]]; coul2 = bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur] + 1]; for (j = 0; j < 8 && nbBoulesMalusRecuees[numeroJoueur] > 0; j++) { nbBoulesMalusRecuees[numeroJoueur]--; boulesRecues[numeroJoueur]++; son += 4; bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur]] = (int)((6.0 * rand()) / (RAND_MAX)); // Entre 0 & 5 // (rand () + 3000) / 6500; bouleExiste[numeroJoueur][bouleCourante[numeroJoueur]] = bouleEtatExistence[numeroJoueur]; bouleArrivee[numeroJoueur][bouleCourante[numeroJoueur]] = 0; bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur]] = tableauJeu[numeroJoueur][0] + 10 + (int)((180.0 * rand()) / (RAND_MAX)); // Entre 0 & 180 // rand () / 182; bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur]] = tableauJeu[numeroJoueur][3] + 24; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][0] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][1] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][2] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][3] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][4] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][5] = LIBRE; bouleCourante[numeroJoueur]++; while (!bouleRebond_ou_Arrivee (numeroJoueur)) { bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] -= 4; PutPic (bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur] - 1], bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur] - 1] - 8 + tremblement[numeroJoueur], bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur] - 1] - 8); } bouleArrivee[numeroJoueur][bouleCourante[numeroJoueur] - 1] = 1; classerBoules (numeroJoueur); } bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur]] = coul1; bouleCouleur[numeroJoueur][bouleCourante[numeroJoueur] + 1] = coul2; bouleExiste[numeroJoueur][bouleCourante[numeroJoueur] + 1] = bouleEtatExistence[numeroJoueur]; bouleExiste[numeroJoueur][bouleCourante[numeroJoueur]] = bouleEtatExistence[numeroJoueur]; bouleArrivee[numeroJoueur][bouleCourante[numeroJoueur] + 1] = 0; bouleArrivee[numeroJoueur][bouleCourante[numeroJoueur]] = 0; bouleCoordX[numeroJoueur][bouleCourante[numeroJoueur]] = viseurCoordX[numeroJoueur]; bouleCoordY[numeroJoueur][bouleCourante[numeroJoueur]] = viseurCoordY[numeroJoueur] + 1; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][0] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][1] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][2] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][3] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][4] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur]][5] = LIBRE; boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][0] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][1] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][2] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][3] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][4] = boulePointAccrochage[numeroJoueur][bouleCourante[numeroJoueur] + 1][5] = LIBRE; } //retourne le nombre de bulles presentes //sur l'ecran de tableauJeu d'un joueur int compterBoules (int numeroJoueur) { int cpt = 0; for (i = 0; i < bouleCourante[numeroJoueur]; i++) if (bouleExiste[numeroJoueur][i] == bouleEtatExistence[numeroJoueur]) cpt++; return (cpt); } //affichage des bulles malus que les joueurs //vont recuperer au prochain tir void prevenirBoulesMalus (int numeroJoueur) { int g = 0, k = 0; if (numeroJoueur == 1 || numeroJoueur == 3) { for (g = 1; g <= nbBoulesMalusRecuees[numeroJoueur] / 8; g++) PutPic (MALUS_ROUGE, tableauJeu[numeroJoueur][1] + 10, tableauJeu[numeroJoueur][3] - 8 * g); k = g - 1; for (g = 1 + k; g <= nbBoulesMalusRecuees[numeroJoueur] % 8 + k; g++) PutPic (MALUS_JAUNE, tableauJeu[numeroJoueur][1] + 10, tableauJeu[numeroJoueur][3] - 8 * g); } else { for (g = 1; g <= nbBoulesMalusRecuees[numeroJoueur] / 8; g++) PutPic (MALUS_ROUGE, tableauJeu[numeroJoueur][0] - 25, tableauJeu[numeroJoueur][3] - 8 * g); k = g - 1; for (g = 1 + k; g <= nbBoulesMalusRecuees[numeroJoueur] % 8 + k; g++) PutPic (MALUS_JAUNE, tableauJeu[numeroJoueur][0] - 25, tableauJeu[numeroJoueur][3] - 8 * g); } } --- NEW FILE: cpu.c --- /* DuduSDL * cpu.c * * Copyright (C) 2000 Nicolas Peninguy and Colin Leroy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "dudusdl.h" int CPUx, CPUy,bCPUx,bCPUy; //demande et stocke les paramètres // nombre de joueurs, rapidité... int arrivee (int x, int y) { int rebondArrivee = 0, i, deltax, deltay, delta; if (y <= tableauJeu[1][2] + (degreDescente[1] * 16) + 8) rebondArrivee = 1; if (x < tableauJeu[1][0] + 8 || x > tableauJeu[1][1] - 8) CPU_coef_dir = 3.1415 - CPU_coef_dir; for (i = 0; i <= bouleCourante[1] - 1; i++) if (bouleExiste[1][i] == bouleEtatExistence[1]) { deltax = x - bouleCoordX[1][i]; deltay = y - bouleCoordY[1][i]; delta = deltax * deltax + deltay * deltay; if (delta < 250) rebondArrivee = 1; } if(rebondArrivee) { int rangee=0; int clas = 0; for (i = 0; i < 17; i++) { if (y < tableauJeu[1][2] + (degreDescente[1] + i + 1) * 16 && y >= tableauJeu[1][2] + (degreDescente[1] + i) * 16) { y = tableauJeu[1][2] + 8 + (degreDescente[1] + i) * 16; rangee = i; clas++; } } if (rangee % 2 == 0) { if (x > tableauJeu[1][0] + 12 * 16) x = tableauJeu[1][0] + 8 + 11 * 16; if (x <= tableauJeu[1][0]) x = tableauJeu[1][0] + 8; for (i = 0; i < 12; i++) { if (x < tableauJeu[1][0] + (i + 1) * 16 && x >= tableauJeu[1][0] + i * 16) { x = tableauJeu[1][0] + 8 + i * 16; clas++; } } } else { if (x > tableauJeu[1][0] + 8 + 12 * 16) x = tableauJeu[1][0] + 12 * 16; if (x <= tableauJeu[1][0] + 8) x = tableauJeu[1][0] + 16; for (i = 0; i < 12; i++) { if (x < tableauJeu[1][0] + 8 + (i + 1) * 16 && x >= tableauJeu[1][0] + 8 + i * 16) { x = tableauJeu[1][0] + 16 + i * 16; clas++; } } } CPUx=x; CPUy=y; } return (rebondArrivee); } int countAll (int x, int y) { int colle[127], c, i, j; int deltax, deltay, delta; char deja[800]; time_t heure1, heure2; struct tms tms1, tms2; int diff; for(i=0;i<800;i++) deja[i] = 0; colle[0] = -1; for (i = 1; i < 127; i++) colle[i] = LIBRE; p = 1; for (c = 0; c <= p; c++) { for (i = 0; i < bouleCourante[1] - 1; i++) if (bouleExiste[1][i] == bouleEtatExistence[1]) { if(colle[c] != -1) { deltax = bouleCoordX[1][colle[c]] - bouleCoordX[1][i]; deltay = bouleCoordY[1][colle[c]] - bouleCoordY[1][i]; } else { deltax = x - bouleCoordX[1][i]; deltay = y - bouleCoordY[1][i]; } delta = deltax * deltax + deltay * deltay; if ((delta < 321 && colle[c] > -1 && i != colle[c] && deja[i] == 0 && bouleCouleur[1][i] == bouleCouleur[1][colle[c]]) || (colle[c] == -1 && delta < 321 && bouleCouleur[1][i] == bouleCouleur[1][bouleCourante[1]])) { colle[p] = i; deja[i] = 1; p++; } } } for (i = 0; i <= bouleCourante[1] - 1; i++) deja[i] = 0; return p; } int CPUtry (void) { int x,y; x = viseurCoordX[1]; y = viseurCoordY[1] + 1; CPU_coef_dir = angleCPU; while (!arrivee(x,y)) { x += vitesseAxeY * cos (CPU_coef_dir); y -= vitesseAxeY * sin (CPU_coef_dir); } return countAll(CPUx,CPUy); } void cpu_prepare () { if (CPUtire || (bouleArrivee[1][bouleCourante[1] - 1] == 0 && bouleCourante[1]>48)) return; if(!best_angleCPU_found) { if(angleCPU < 2.8 && CPU_direction > 0) angleCPU += CPU_direction*0.03; else if(CPU_direction > 0) CPU_direction = -1; else if (angleCPU > 0.3) angleCPU += CPU_direction*0.03; else { best_angleCPU_found = 1; CPU_direction =1; } a[1] = angleCPU; if (best_CPU_shot < CPUtry()) { best_CPU_shot = CPUtry(); best_angleCPU = angleCPU; bCPUx=CPUx;bCPUy=CPUy; return; } if(best_angleCPU_found && !best_CPU_shot) { best_angleCPU=1.0; } } else { if(angleCPU > best_angleCPU) angleCPU -= 0.03; else if (angleCPU < best_angleCPU) angleCPU += 0.03; a[1] = angleCPU; if(a[1] != best_angleCPU && angleCPU + 0.03 > best_angleCPU && angleCPU -0.03 < best_angleCPU) { angleCPU=best_angleCPU; a[1] = angleCPU; } else if (a[1]==best_angleCPU) { CPUtire = 1; best_CPU_shot = 0; best_angleCPU_found = 0; } } } --- NEW FILE: game.c --- /* DuduSDL * game.c * * Copyright (C) 2000 Nicolas Peninguy and Colin Leroy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "dudusdl.h" #include <sys/time.h> int jeu(void); SDL_Surface * images[NB_IMAGES]; SDL_Surface * screen; SDL_Surface * clean_p1; SDL_Surface * clean_p2; SDL_Surface * clean_p3; SDL_Surface * clean_p4; SDL_Rect * dest; SDL_Rect * trect; SDL_Event event; long double lasttime = 0; long count=0; int updateAll=1; int laisse_moi=0; int tour=0; int sens=1; int depsens=1; int boulecours=0; int maxAccr=0; int dbouge[4]={1,1,1,1}; int CPUtire=0; int deg[4]={0,0,0,0}; int PLATEAU=100,VERIN=101; int PERDU=50,GAGNE=51; int REBOURS=84; int MALUS_ROUGE=12,MALUS_JAUNE=13; char EXPLOSION=6; char FIN_EXPLOSION=7; int ENGR=240; int maxBoulesEnvoyees=0; int meilleurJoueur=0; int scoreJoueur[4]={0,0,0,0}; char nombreCoups[4]={0,0,0,0}; float mindist=1000; int toucheTir[4]={SDLK_SPACE,SDLK_LCTRL,SDLK_KP0,SDLK_TAB}; int toucheGauche[4]={SDLK_LEFT,SDLK_z,SDLK_KP7,SDLK_q}; int toucheDroite[4]={SDLK_RIGHT,SDLK_c,SDLK_KP9,SDLK_e}; int toucheHaut[4]={SDLK_UP,SDLK_d,SDLK_KP_DIVIDE,SDLK_w}; int toucheMessage[4]={SDLK_DELETE,SDLK_x,SDLK_KP_MULTIPLY,SDLK_AMPERSAND}; int comment_delay = 0; char message[12][21]= { "Abruti !", "Salopard !", "Petit merdeux !", "Eh ducon !", "Zoophile !", "Moule a gaufres !", "Sucker !", "Loser !", "Tu vas perdre", "Cornichon diplome", "Casse toi", "tu vas prendre..." }; char comment[12][30]= { "Ca tue...", "ouh. encore un coup du ciel", "De mieux en mieux...", "Attention, il est en forme", "mefiez vous de la suite...", "ca fait du bien...", "Robin des Bulles...", "Il se donne a fond.", "Et ca commence a peine", "Ca va durer longtemps ?", "May the force be with you", "la chance ne dure jamais." }; int LIBRE=747; int gravite=0; int vitesseAxeY=4; int viseurCoordX[4]={534,98,534,98},viseurCoordY[4]={227,227,467,467}; int tableauJeu[4][4]={{438,638,11 ,235}, {2 ,202,11 ,235}, {438,638,251,475}, {2, 202,251,475}}; char bouleEtatExistence[4]={6,6,6,6}; int tremblement[4]={0,0,0,0}; int continuer=1; char joueurVivant[4]={1,1,1,1}; int nbBoulesMalusRecuees[4]={0,0,0,0}; float angle=0; float a[4]={3.1415/2,3.1415/2,3.1415/2,3.1415/2}; char degreDescente[4]={0,0,0,0}; int maxHauteur = 600; int gauche[4] = {0,0,0,0}; int droite[4] = {0,0,0,0}; int haut[4] = {0,0,0,0}; int tire[4] = {0,0,0,0}; int mess[4] = {0,0,0,0}; int escape = 0; int main( int argc, char *argv[] ) { int i; int numeroJoueur; videoflags = SDL_SWSURFACE; while ( argc > 1 ) { --argc; if ( strcmp(argv[argc], "-hw") == 0 ) videoflags ^= SDL_HWSURFACE; else if ( strcmp(argv[argc], "-flip") == 0 ) videoflags ^= SDL_DOUBLEBUF; else if ( strcmp(argv[argc], "-fullscreen") == 0 ) videoflags ^= SDL_FULLSCREEN; else { fprintf(stderr, "Usage: %s [-hw] [-flip] [-fullscreen]\n", argv[0]); exit(1); } } trect = malloc(sizeof(SDL_Rect)); demander_parametres(); charger_donnes(); dest = malloc(sizeof(SDL_Rect)); dest->x = 0; dest->y = 0; dest->w =images[11]->w; dest->h =images[11]->h; if (nombreJoueurs == 0) { tableauJeu[0][0] = 220; tableauJeu[0][1] = 420; tableauJeu[0][2] = 128; tableauJeu[0][3] = 352; viseurCoordX[0] = 320; viseurCoordY[0] = 344; } if (nombreJoueurs == 1) { tableauJeu[0][0] = 420; tableauJeu[0][1] = 620; tableauJeu[0][2] = 128; tableauJeu[0][3] = 352; tableauJeu[1][0] = 20; tableauJeu[1][1] = 220; tableauJeu[1][2] = 128; tableauJeu[1][3] = 352; viseurCoordX[0] = 520; viseurCoordY[0] = 344; viseurCoordX[1] = 120; viseurCoordY[1] = 344; } /* setcolor (screen, 0, 0, 0, 0); SDL_SetColorKey(screen, 0, 0); SDL_SetColorKey(images[11], 0, 0); */ tempsTotal = time (NULL); lastangle = 3.14; //boucle principale de Jeu while (continuer) { nombreJoueursVivants = nombreJoueurs + 1; temps = time (NULL); // ClearBuffer (0); initialiser_tableau (); numeroJoueur = 0; premierTick = time (NULL); continuer = jeu(); } return 0; } int jeu( void ) { SDL_Event event; int continuer = 1; int joueur = 0; SDLKey key; struct timeval tv; SDL_EnableKeyRepeat(0, 0); SDL_ShowCursor(0); reset_screen (); while (continuer) { SDL_BlitSurface(images[11], NULL, screen, dest); while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: escape = 1; break; default: key = event.key.keysym.sym; do { if (toucheGauche[joueur]==key) gauche[joueur] = 1; else if (toucheDroite[joueur]==key) droite[joueur] = 1; else if (toucheHaut[joueur]==key) haut[joueur] = 1; else if (toucheTir[joueur]==key) tire[joueur] = 1; else if (toucheMessage[joueur]==key) mess[joueur] = 1; } while((joueur = changer_joueur(joueur)) != 0); break; } break; case SDL_KEYUP: do { key = event.key.keysym.sym; if (toucheGauche[joueur]==key) gauche[joueur] = 0; else if (toucheDroite[joueur]==key) droite[joueur] = 0; else if (toucheHaut[joueur]==key) haut[joueur] = 0; else if (toucheTir[joueur]==key) tire[joueur] = 0; else if (toucheMessage[joueur]==key) mess[joueur] = 0; } while((joueur = changer_joueur(joueur)) != 0); break; default: break; } } // Fin du traitement des événements. if(CPU && !CPUtire) { cpu_prepare(); } do { bouger_viseur(joueur); afficher_viseur(joueur); test_temps(joueur); test_tir_bulle(joueur); if (bouleCourante[joueur] > 0 && bouleArrivee[joueur][bouleCourante[joueur] - 1] == 0) { deplacer_bulle (joueur); if (bouleRebond_ou_Arrivee (joueur)) { bouleArrivee[joueur][bouleCourante[joueur] - 1] = 1; classerBoules (joueur); testerCouleursIdentiques (joueur); detecterBoulesLibres (joueur); if (nombreCoups[joueur] == 20 - gravite * 10) descendrePlateau (joueur); if (nbBoulesMalusRecuees[joueur] > 0) recevoirBoulesMalus (joueur); if (compterBoules (joueur) == 0) { if (nombreJoueursVivants > 1) { for (i = 0; i <= nombreJoueurs; i++) if (i != joueur) //mort des joueurs qui n'ont pas fini joueurVivant[i] = 0; } else { for (i = 0; i <= nombreJoueurs; i++) joueurVivant[i] = 0; } } } } if(comment_delay) { comment_delay--; if(comment_delay > 1) PutTXTC(0,comment[temp],100,50); else { PutTXTC(0," ",100,50); SDL_BlitSurface(images[11], NULL, screen, dest); SDL_UpdateRect (screen, 100, 50, 440, 20); } if (comment_delay==0) temp = -1; } for (i = 0; i < bouleCourante[joueur] - 1; i++) //detecterBoulesLibres bulles tombées if (bouleVitesseChute[joueur][i]) { bouleCoordY[joueur][i] += (bouleVitesseChute[joueur][i]++); if (!bouleVitesseChute[joueur][i]) bouleVitesseChute[joueur][i]++; if (bouleCoordY[joueur][i] > tableauJeu[joueur][3] + 8) bouleVitesseChute[joueur][i] = 0; } //preparation Descente du plateau if (nombreCoups[joueur] == 20 - gravite * 10 || nombreCoups[joueur] == 19 - gravite * 10 || nombreCoups[joueur] == 18 - gravite * 10) { tremblement[joueur] += dbouge[joueur]; if (tremblement[joueur] >= 2) { dbouge[joueur] = -1; tremblement[joueur] = 2; } if (tremblement[joueur] <= -2) { dbouge[joueur] = 1; tremblement[joueur] = -2; } } else tremblement[joueur] = 0; afficher_elements (joueur); //verification nombre de joueurs restants nombreJoueursVivants = 0; for (i = 0; i <= nombreJoueurs; i++) nombreJoueursVivants += joueurVivant[i]; if (nombreJoueursVivants == 1 && nombreJoueurs > 0) for (i = 0; i <= nombreJoueurs; i++) if (nombreJoueursVivants == 1 && nombreJoueurs > 0 && joueurVivant[i]) scoreJoueur[i]++; if (nombreJoueursVivants == 1 && nombreJoueurs > 0) { quitter (i + 1); break; } if (!compterBoules (0) && nombreJoueurs == 0) { joueurVivant[0] = 1; scoreJoueur[0]++; quitter (6); break; } if (nombreJoueursVivants == 0 && nombreJoueurs == 0) { quitter (6); break; } if (escape) quitter (0); } while((joueur = changer_joueur(joueur)) != 0); switch (nombreJoueurs) { case 0: SDL_UpdateRect (screen, tableauJeu[0][0], tableauJeu[0][2], tableauJeu[0][1]-tableauJeu[0][0], tableauJeu[0][3]-tableauJeu[0][2]); break; case 1: if(count%2 || updateAll) SDL_UpdateRect (screen, tableauJeu[1][0], tableauJeu[1][2], tableauJeu[1][1]-tableauJeu[1][0]+30, tableauJeu[1][3]-tableauJeu[1][2]); else if( !(count%2) || updateAll) SDL_UpdateRect (screen, tableauJeu[0][0]-30, tableauJeu[0][2], tableauJeu[0][1]-tableauJeu[0][0]+30, tableauJeu[0][3]-tableauJeu[0][2]); count++; break; case 2: case 3: default: SDL_UpdateRect (screen, 0, 0, 0, 0); } if(temp >= 0) SDL_UpdateRect(screen,100,50,440,20); gettimeofday(&tv,0); //printf("time = %ld\n",tv.tv_usec); if(tv.tv_usec - lasttime < 15000 && tv.tv_usec - lasttime > 0 && lasttime != 0) { usleep (15000- (tv.tv_usec - lasttime)); //printf("sleeping %ld\n",15000- (tv.tv_usec - lasttime)); updateAll = 1; } else //slow graphics updateAll = 0; lasttime = tv.tv_usec; } // while(continuer) return 0; } // jeu void quitter (int numeroJoueur) { int a, b, i;// j; int stop = 0; int on = 0; SDL_Event event; SDL_SetColorKey(screen, 0, SDL_MapRGB(screen->format,0,0,0)); if (escape) { ClearBuffer (10); i = 460; do { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_RETURN: case SDLK_SPACE: stop = 1; break; default: break; } default: break; } } PutPic (40, 0, i); /* WaitVR (); DisplayBuffer (0, 0);*/ if (SDL_Flip(screen) == -1) printf("Error\n"); i--; } while (i > -960 && !stop); // FreeMem (); // SetTXT (); // CloseKeyScan (); printf ("Stats :\n"); for (numeroJoueur = 0; numeroJoueur <= nombreJoueurs; numeroJoueur++) printf ("Joueur %d : gagnées %d ; bulles : envoyées %d, reçues %d.\n", numeroJoueur + 1, scoreJoueur[numeroJoueur], boulesEnvoyees[numeroJoueur], boulesRecues[numeroJoueur]); printf ("Le meilleur coup : Joueur %d, a envoyé %d bulles !\n", meilleurJoueur + 1, maxBoulesEnvoyees); tempsTotal = (time (NULL) - tempsTotal); tpst[0] = tempsTotal / 3600; tempsTotal -= tpst[0] * 3600; tpst[1] = tempsTotal / 60; tempsTotal -= tpst[1] * 60; tpst[2] = tempsTotal; printf ("Nombres de parties : %d\n", nombreParties); printf ("Temps de Jeu : %2d:%2d:%2d\n", tpst[0], tpst[1], tpst[2]); if (tpst[0] > 0) printf ("Ca fait beaucoup, hein ?\n"); exit (0); } if (SDL_Flip(screen) == -1) printf("Error\n"); for (i = 0; i <= nombreJoueurs; i++) if (!joueurVivant[i]) PutPic (PERDU, tableauJeu[i][0] + 25, tableauJeu[i][2] + 87); else PutPic (GAGNE, tableauJeu[i][0] + 25, tableauJeu[i][2] + 87); PutPic (20, 220, 376); temps3 = (time (NULL) - temps); t[0] = temps3 / 100 + 48; t[1] = (temps3 % 100) / 10 + 48; t[2] = (temps3 % 100) % 10 + 48; t[3] = 0; // Infos fausses à cause de // PutTXTC (0, "Temps", 0, 300); // PutTXTC (0, t, 0, 317); // PutTXTC (0, "secondes", 0, 334); temps2 = time (NULL); if (SDL_Flip(screen) == -1) printf("Error\n"); while (!on) { SDL_WaitEvent(&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_o: on = 1; break; case SDLK_n: on = 2; break; default: break; } default: break; } } // DisplayBuffer (0, 0); if (SDL_Flip(screen) == -1) printf("Error\n"); temps2 = time (NULL) - temps2; tempsTotal -= temps2; if (on==2) { ClearBuffer (10); nombreParties++; i = 481; do { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_RETURN: case SDLK_SPACE: stop = 1; break; default: break; } default: break; } } PutPic (40, 0, i); /* WaitVR (); DisplayBuffer (0, 0);*/ if (SDL_Flip(screen) == -1) printf("Error\n"); i--; } while (i > -960 && !stop); // FreeMem (); // SetTXT (); // CloseKeyScan (); temps2 = time (NULL) - temps2; tempsTotal -= temps2; printf ("Stats :\n"); for (numeroJoueur = 0; numeroJoueur <= nombreJoueurs; numeroJoueur++) printf ("Joueur %d : gagnées %d ; bulles : envoyées %d, reçues %d.\n", numeroJoueur + 1, scoreJoueur[numeroJoueur], boulesEnvoyees[numeroJoueur], boulesRecues[numeroJoueur]); printf ("Le meilleur coup : Joueur %d, a envoyé %d bulles !\n", meilleurJoueur + 1, maxBoulesEnvoyees); tempsTotal = (time (NULL) - tempsTotal); tpst[0] = tempsTotal / 3600; tempsTotal -= tpst[0] * 3600; tpst[1] = tempsTotal / 60; tempsTotal -= tpst[1] * 60; tpst[2] = tempsTotal; printf ("Nombres de parties : %d\n", nombreParties); printf ("Temps de Jeu : %2d:%2d:%2d\n", tpst[0], tpst[1], tpst[2]); if (tpst[0] > 0) printf ("Ca fait beaucoup, hein ?\n"); exit (0); } else if (on==1) { nombreParties++; for (a = 0; a <= nombreJoueurs; a++) for (b = 0; b < 800; b++) { bouleArrivee[a][b] = 0; bouleExiste[a][b] = 0; bouleCouleur[a][b] = 0; degreDescente[a] = 0; nombreCoups[a] = 0; tremblement[a] = 0; joueurVivant[a] = 1; nombreJoueursVivants = nombreJoueurs + 1; numeroJoueur = 0; if (!modeViolent) nbBoulesMalusRecuees[a] = 0; bouleCoordX[a][b] = 0; bouleCoordY[a][b] = 0; bouleCoefDir[a][b] = 0; bouleVitesseChute[a][b] = 0; bouleGravite[a][b] = 0; boulePointAccrochage[a][b][0] = boulePointAccrochage[a][b][1] = boulePointAccrochage[a][b][2] = boulePointAccrochage[a][b][3] = boulePointAccrochage[a][b][4] = boulePointAccrochage[a][b][5] = LIBRE; tempsRestant[a][0] = tempsRestant[a][1] = 0; bouleCourante[a] = 0; } nombreJoueursVivants = nombreJoueurs + 1; temps = time (NULL); ClearBuffer (0); initialiser_tableau (); numeroJoueur = 0; premierTick = time (NULL); // 30/12/2000 -- Remettre les touches à 0 ! tire[0] = 0; tire[1] = 0; tire[2] = 0; tire[3] = 0; haut[0] = 0; haut[1] = 0; haut[2] = 0; haut[3] = 0; droite[0] = 0; droite[1] = 0; droite[2] = 0; droite[3] = 0; gauche[0] = 0; gauche[1] = 0; gauche[2] = 0; gauche[3] = 0; mess[0] = 0; mess[1] = 0; mess[2] = 0; mess[3] = 0; escape = 0; reset_screen (); } } --- NEW FILE: loading.c --- /* DuduSDL * loading.c * * Copyright (C) 2000 Nicolas Peninguy and Colin Leroy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "dudusdl.h" void demander_parametres(void) { int option = 1; int done = 0; int enable_cpu = 0; best_angleCPU_found = 0; angleCPU= 3.14/2; CPU_direction = 1; Init_all(640, 480, 8, videoflags); //SDL_SWSURFACE | SDL_FULLSCREEN); // printf(DATADIR"doto.pcx\n"); /* InitKeyScan (); if (SetSVGA ()) Quit ("Votre carte video n'est pas supportee, c'est dommage."); InitGameLib (640, 960); */ if (LoadPic (DATADIR"/options.pcx", 205)) Quit ("Erreur PCX. Verifiez le fichier options.pcx"); if (LoadPic (DATADIR"/oui.pcx", 286)) Quit ("Erreur PCX. Verifiez le fichier oui.pcx"); if (LoadPic (DATADIR"/non.pcx", 285)) Quit ("Erreur PCX. Verifiez le fichier non.pcx"); if (LoadPic (DATADIR"/j1.pcx", 296)) Quit ("Erreur PCX. Verifiez le fichier j1.pcx"); if (LoadPic (DATADIR"/j2.pcx", 297)) Quit ("Erreur PCX. Verifiez le fichier j2.pcx"); if (LoadPic (DATADIR"/j3.pcx", 298)) Quit ("Erreur PCX. Verifiez le fichier j3.pcx"); if (LoadPic (DATADIR"/j4.pcx", 299)) Quit ("Erreur PCX. Verifiez le fichier j4.pcx"); if (LoadPic (DATADIR"/point.pcx", 280)) Quit ("Erreur PCX. Verifiez le fichier point.pcx"); if (LoadPic (DATADIR"/clear.pcx", 281)) Quit ("Erreur PCX. Verifiez le fichier clear.pcx"); // SetColour (0, 255, 255, 255); // SDL_SetColorKey(screen, SDL_SRCCOLORKEY, // SDL_MapRGB(screen->format,255,255,255)); if ( images[205]->format->palette ) { SDL_SetColors(screen, images[205]->format->palette->colors, 0, images[205]->format->palette->ncolors); // printf("ncolors = %d\n", images[205]->format->palette->ncolors); } SDL_SetColorKey(screen, SDL_SRCCOLORKEY, SDL_MapRGB(screen->format,255,255,255)); // ClearBuffer (0); PutPicM (205, 0, 0); PutPic (280, 50, 140); PutPic (296, 350, 140); PutPic (285, 350, 215); PutPic (285, 350, 285); nombreJoueurs = 1; for (i = 0; i <= 3; i++) joueurVivant[i] = 0; vitesseAxeY = 5; modeViolent = 0; gravite = 0; DisplayBuffer (0, 0); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); do { //savoir quelle option on rgle ... [truncated message content] |