home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Freelog 17
/
Freelog017.iso
/
BeOS
/
ababelone
/
Sources
/
PlateauDeJeuInterne.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2000-11-05
|
12KB
|
314 lines
/*
Copyright (C) 2000 by Hervé PHILIPPE <rv@bemail.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "PlateauDeJeuInterne.h"
////////////////////////////////////////////
// CONSTANTE "m_kTableauDirectionInterne" //
////////////////////////////////////////////-------------------------------------------------
// Constante membre en "static" pour définir les 6 déplacements possibles (en Coordonnees) --
//-------------------------------------------------------------------------------------------
const Coordonnees PlateauDeJeuInterne::m_kTableauDirectionInterne[6]={
Coordonnees(-1,0),
Coordonnees(0,-1),
Coordonnees(1,-1),
Coordonnees(1,0),
Coordonnees(0,1),
Coordonnees(-1,1)
};
///////////////////////////////////////////
// CONSTRUCTEUR de "PlateauDeJeuInterne" //
///////////////////////////////////////////----------------
// Construit les tableaux dynamiques en les initialisant --
//---------------------------------------------------------
PlateauDeJeuInterne::PlateauDeJeuInterne(uint8 nombre_boules, uint8 nombre_joueurs)
// 2 PARAMETRES : ENTREE ENTREE
: PlateauDeJeu(0, nombre_joueurs) // 0 pour pouvoir utiliser "ChangerNombreBoules" !
{
int i;
m_TableauBoulesCoord = NULL;
ChangerNombreBoules(nombre_boules);
m_TableauBoulesEjectees = new uint8[NOMBRE_JOUEURS_MAXI];
InitialiserBoulesEjectees();
m_Tableau = new (int8*)[TAILLE_TABLEAU_INTERNE];
for (i = 0; i < TAILLE_TABLEAU_INTERNE; i++)
m_Tableau[i] = new int8[TAILLE_TABLEAU_INTERNE];
}
//////////////////////////////////////////
// DESTRUCTEUR de "PlateauDeJeuInterne" //
//////////////////////////////////////////
// Détruit les tableaux dynamiques --
//-----------------------------------
PlateauDeJeuInterne::~PlateauDeJeuInterne()
// AUCUN PARAMETRE
{
int i;
for (i = 0; i < TAILLE_TABLEAU_INTERNE; i++)
delete m_Tableau[i];
delete[] m_Tableau;
delete[] m_TableauBoulesCoord;
delete[] m_TableauBoulesEjectees;
}
//////////////////////////
// FONCTION "operator=" //
//////////////////////////--------------
// Affectation (égalité de 2 objets) --
//--------------------------------------
PlateauDeJeuInterne& // VALEUR DE RETOUR
PlateauDeJeuInterne::operator=(const PlateauDeJeuInterne& ancien_plateau_interne)
// 1 PARAMETRE : ENTREE (@)
{
int i, j;
ChangerNombreBoules(ancien_plateau_interne.m_NombreBoules);
for (i = 0; i < TAILLE_TABLEAU_INTERNE; i++)
for (j = 0; j < TAILLE_TABLEAU_INTERNE; j++)
m_Tableau[i][j] = ancien_plateau_interne.m_Tableau[i][j];
for (i = 0; i < m_NombreBoules; i++)
m_TableauBoulesCoord[i] = ancien_plateau_interne.m_TableauBoulesCoord[i];
for (i = 0; i < NOMBRE_JOUEURS_MAXI; i++)
m_TableauBoulesEjectees[i] = ancien_plateau_interne.m_TableauBoulesEjectees[i];
return *this;
}
///////////////////////////////////
// FONCTION "ValeurCaseSuivante" //
///////////////////////////////////--------
// Renvoie la valeur de la case suivante --
//-----------------------------------------
int8 // VALEUR DE RETOUR
PlateauDeJeuInterne::ValeurCaseSuivante(int8 numero_boule, int8 direction)
// 2 PARAMETRES : ENTREE ENTREE
{
Coordonnees coordonnees_case = CoordonneesBoule(numero_boule);
coordonnees_case += m_kTableauDirectionInterne[direction];
return ValeurCase(coordonnees_case);
}
/////////////////////////////////////
// FONCTION "ValeurCasePrecedente" //
/////////////////////////////////////--------
// Renvoie la valeur de la case précédente --
//-------------------------------------------
int8 // VALEUR DE RETOUR
PlateauDeJeuInterne::ValeurCasePrecedente(int8 numero_boule, int8 direction)
// 2 PARAMETRES : ENTREE ENTREE
{
Coordonnees coordonnees_case = CoordonneesBoule(numero_boule);
coordonnees_case -= m_kTableauDirectionInterne[direction];
return ValeurCase(coordonnees_case);
}
//////////////////////////////////
// FONCTION "DeplacerBoule" n┬░1 //
//////////////////////////////////-----------------------------------------------------
// Déplace une boule en fonction de son numéro et de la direction de son déplacement --
// REMARQUE : traitement de l'éjection s'il y a lieu --
//-------------------------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
PlateauDeJeuInterne::DeplacerBoule(int8 numero_boule, int8 direction)
// 2 PARAMETRES : ENTREE ENTREE
{
Coordonnees coordonnees_case = m_TableauBoulesCoord[numero_boule-1];
Coordonnees coordonnees_case_suivante = coordonnees_case;
coordonnees_case_suivante += m_kTableauDirectionInterne[direction];
if (ValeurCase(coordonnees_case_suivante) != -1)
SetCase(coordonnees_case_suivante, numero_boule);
else {
m_TableauBoulesCoord[numero_boule-1] = COORD_NULL;
// (m_TableauBoulesEjectees[CouleurBoule(numero_boule)])++;
}
SetCase(coordonnees_case, 0);
}
//////////////////////////////////
// FONCTION "DeplacerBoule" n┬░2 //
//////////////////////////////////-------------------------------------------------------------------
// Déplace une boule en fonction des coordonnées (anciennes) et de la direction de son déplacement --
// REMARQUE : traitement de l'éjection s'il y a lieu --
//---------------------------------------------------------------------------------------------------
Coordonnees // VALEUR DE RETOUR
PlateauDeJeuInterne::DeplacerBoule(Coordonnees coordonnees_case, int8 direction)
// 2 PARAMETRES : ENTREE ENTREE
{
Coordonnees coordonnees_case_suivante = coordonnees_case;
int8 numero_boule = m_Tableau[coordonnees_case.x][coordonnees_case.y];
coordonnees_case_suivante += m_kTableauDirectionInterne[direction];
if (ValeurCase(coordonnees_case_suivante) != -1)
SetCase(coordonnees_case_suivante, numero_boule);
else {
m_TableauBoulesCoord[numero_boule-1] = COORD_NULL;
// (m_TableauBoulesEjectees[CouleurBoule(numero_boule)])++;
}
SetCase(coordonnees_case, 0);
return coordonnees_case_suivante;
}
/////////////////////////////////
// FONCTION "CoordonneesBoule" //
/////////////////////////////////---------
// Renvoie les coordonnées d'une boule --
//----------------------------------------
Coordonnees // VALEUR DE RETOUR
PlateauDeJeuInterne::CoordonneesBoule(int8 numero_boule)
// 1 PARAMETRE : ENTREE
{
return m_TableauBoulesCoord[numero_boule-1];
}
/////////////////////////////////////
// FONCTION "CoordonneesSuivantes" //
/////////////////////////////////////-----------------------------------------
// Renvoie les coordonnées de la case suivante, en fonction de la direction --
//----------------------------------------------------------------------------
Coordonnees // VALEUR DE RETOUR
PlateauDeJeuInterne::CoordonneesSuivantes(Coordonnees coordonnees_case, int8 direction)
// 2 PARAMETRES : ENTREE ENTREE
{
return coordonnees_case + m_kTableauDirectionInterne[direction];
}
///////////////////////////
// FONCTION "ValeurCase" //
///////////////////////////---------------------------------------------
// Renvoie la valeur d'une case (ou -100 si la case n'est pas valide) --
//----------------------------------------------------------------------
int8 // VALEUR DE RETOUR
PlateauDeJeuInterne::ValeurCase(Coordonnees coordonnees_case)
// 1 PARAMETRE : ENTREE
{
TYPE_COORD x = coordonnees_case.x,
y = coordonnees_case.y;
if (x > -1 && y > -1 && x < TAILLE_TABLEAU_INTERNE && y < TAILLE_TABLEAU_INTERNE)
return m_Tableau[x][y];
else
return -100;
}
////////////////////////
// FONCTION "SetCase" //
////////////////////////---------------------------------------------------------------------------
// Ecrit une donnée dans une case du tableau interne (modification aussi du tableau qui contient --
// les coordonnées de boules) --
//-------------------------------------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
PlateauDeJeuInterne::SetCase(Coordonnees coordonnees_case, int8 donnee)
// 2 PARAMETRES : ENTREE ENTREE
{
TYPE_COORD x = coordonnees_case.x,
y = coordonnees_case.y;
if (x > -1 && y > -1 && x < TAILLE_TABLEAU_INTERNE && y < TAILLE_TABLEAU_INTERNE)
m_Tableau[x][y] = donnee;
if (x > 0)
m_TableauBoulesCoord[donnee-1] = coordonnees_case;
}
//////////////////////////////////////////
// FONCTION "InitialiserBoulesEjectees" //
//////////////////////////////////////////-----------------------------
// Initialise le nombre des boules éjectées pour toutes les couleurs --
//---------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
PlateauDeJeuInterne::InitialiserBoulesEjectees()
// AUCUN PARAMETRE
{
int i;
for (i = 0; i < NOMBRE_JOUEURS_MAXI; i++)
m_TableauBoulesEjectees[i] = 0;
}
///////////////////////////////
// FONCTION "BoulesEjectees" //
///////////////////////////////---------------------------
// Retourne le nombre des boules éjectées d'une couleur --
//--------------------------------------------------------
uint8 // VALEUR DE RETOUR
PlateauDeJeuInterne::BoulesEjectees(int8 couleur)
// 1 PARAMETRE : ENTREE
{
return m_TableauBoulesEjectees[couleur];
}
//////////////////////////////////////////
// FONCTION "IncrementerBoulesEjectees" //
//////////////////////////////////////////------------------
// Incrémente le nombre des boules éjectées d'une couleur --
//----------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
PlateauDeJeuInterne::IncrementerBoulesEjectees(int8 couleur)
// 1 PARAMETRE : ENTREE
{
(m_TableauBoulesEjectees[couleur])++;
}
//////////////////////////////////////////
// FONCTION "DecrementerBoulesEjectees" //
//////////////////////////////////////////------------------
// Décrémente le nombre des boules éjectées d'une couleur --
//----------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
PlateauDeJeuInterne::DecrementerBoulesEjectees(int8 couleur)
// 1 PARAMETRE : ENTREE
{
(m_TableauBoulesEjectees[couleur])--;
}
////////////////////////////////////
// FONCTION "ChangerNombreBoules" //
////////////////////////////////////----------------------------------
// Change le nombre total de boules et change le tableau de boules --
//--------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
PlateauDeJeuInterne::ChangerNombreBoules(uint8 nombre_boules)
// 1 PARAMETRE : ENTREE
{
if (nombre_boules != m_NombreBoules) {
PlateauDeJeu::ChangerNombreBoules(nombre_boules);
if (m_TableauBoulesCoord != NULL) {
delete[] m_TableauBoulesCoord;
m_TableauBoulesCoord = NULL; // Pas nécessaire
}
m_TableauBoulesCoord = new Coordonnees[m_NombreBoules](COORD_NULL);
}
}
//////////////////////////////////////
// FONCTION "TableauBoulesEjectees" //
//////////////////////////////////////------------------------------------------
// Renvoie le tableau des boules éjectéees (pour le plateau de jeu graphique) --
//------------------------------------------------------------------------------
uint8* // VALEUR DE RETOUR
PlateauDeJeuInterne::TableauBoulesEjectees()
// AUCUN PARAMETRE
{
return m_TableauBoulesEjectees;
}