Mini projet LOO

Dependencies:   mbed APDS_9960 mbed-rtos

Dependents:   MoveYourTetris_OK

Home du projet

src/cJeu.cpp

Committer:
clementdoreau
Date:
2016-04-12
Revision:
18:45dbd9948c97
Parent:
17:e03163d4e367
Child:
19:9e3551d418d5

File content as of revision 18:45dbd9948c97:

#include "cJeu.h"

cJeu::cJeu()
{
    _mat = new cMatrice(8,8);
    //on initialise la générateur de nombres pseudo-aléatoires
    srand(time(NULL));

}

cMatrice* cJeu::get_matrice()
{
    return _mat;
}

unsigned char cJeu::get_score()
{
    return _score;
}

void cJeu::set_matrice(cMatrice *mat)
{
    _mat = mat;
}

void cJeu::set_score(unsigned char sc)
{
    _score = sc;
}

void cJeu::initialiser()
{
    _spi.initSPI(100000, 8, 3);
    _mat->clear();
    _spi.envoyerMatrice(*_mat); 
}

//  Description:
// Créé une nouvelle pièce et renvoi l'adresse de cette dernière
void cJeu::nouvellePiece()
{
    //on génère un nombre aléatoire entre 1 et 5 pour la pièce
    int nb = 1 + ((float)rand()/RAND_MAX) * 5;
    //on génère un deuxième nombre pour choisir la couleur de la pièce
    int couleur = 1 + ((float)rand()/RAND_MAX) * 8;
    //selon le nombre généré, on va créer une nouvelle pièce
    switch(nb) {
            //on crée une pièce "L"
        case 1: {
            _ptrForme = new cEl(3,0);
            break;
        }
        //on crée une pièce "ligne"
        case 2: {
            _ptrForme = new cLigne(3,0);
            break;
        }
        //on crée une pièce "Z"
        case 3: {
            _ptrForme = new cZed(3,0);
            break;
        }
        //on crée une pièce "T"
        case 4: {
            _ptrForme = new cTe(3,0);
            break;
        }
        //on crée une pièce "carré"
        case 5: {
            _ptrForme = new  cCarre(3,0);
            break;
        }
        default:
        {}
    }  
    //puis on affiche la nouvelle pièce
    _mat->afficherForme(_ptrForme, couleur);
    _spi.envoyerMatrice(*_mat);
}

cJeu::~cJeu()
{
    delete _ptrForme;
}

void cJeu::nouvelleManche()
{
    //cJeu::nouvelleLigne();
    //tant que l'on peut descendre
    //while(frfd)
    
    
    //puis on teste si une ligne est complete
    cJeu::ligneComplete();
    
}
unsigned char cJeu::ligneComplete()
{
    Serial pc(USBTX, USBRX);
    unsigned char total = 0, numLigne = 0;
    /*on parcourt chaque ligne de la matrice.
    Si une de ces lignes est complète (c-à-d pas de LED noire), alors
    on fait descendre toutes les pièces au-dessus de la ligne(autres que celle de la manche) d'un cran.
    */
    for( unsigned char i = 0; i < _mat->getLig(); i++) {
        total = 0;
        for( unsigned char j = 0; j < _mat->getCol(); j++) {
            if(_mat->getValTab(j, i) != LED_NOIR) {
                total ++;
            }
            if(total == 8) {
                numLigne = i;
                break;
            }
            else{
                return 0;   // PAS DE LIGNE COMPLETE
            }
        }
    }    
    pc.printf("numLigne: %d\n", numLigne);
    //////////////////////////////////////////////
    //On descend toutes les LEDs allumées au dessus de numLigne d'un cran
    if(numLigne != 0) {
        for( unsigned char i = 0; i < numLigne; i++) {
            total = 0;
            for( unsigned char j = 0; j < _mat->getCol(); j++) {
                _mat->setValTab(j, i, _mat->getValTab(j-1, i));
            }
        }
        //Et on augmente le score!
        _score+=10;
    }
    return 1;
}

int cJeu::partieEnCours(){
    
    Serial pc(USBTX, USBRX); // tx, rx
    _mat->setValTab(7, 0, LED_VERT);
    _mat->setValTab(7, 7, LED_VERT);
    _mat->setValTab(7, 6, LED_VERT);
    _mat->setValTab(0, 7, LED_VERT);
    cCollision col;
    
    ////////////////////////////////////////
    //  DEMANDE UTILISATEUR
    
    
    ////////////////////////////////////////
    //  CONTROLE COLLISION
    

       ////////////////////////////////////////
        //  MOUVEMENT

        while(col.pieceBas(*_ptrForme, *_mat) == false)
        {
            _ptrForme->deplacementBas();
            _mat->updateMatrice();
            _spi.envoyerMatrice(*_mat);
            wait(0.2);
        }
        
        while(col.pieceGauche(*_ptrForme, *_mat) == false)
        {
            _ptrForme->deplacementGauche();
            _mat->updateMatrice();
            _spi.envoyerMatrice(*_mat);
            wait(0.2);
        }
        
        while(col.pieceDroite(*_ptrForme, *_mat) == false)
        {
            _ptrForme->deplacementDroite();
            _mat->updateMatrice();
            _spi.envoyerMatrice(*_mat);
            wait(0.2);
        }
        pc.printf(" Collision !!!!\n");
        ////////////////////////////////////////
        //  CONTROLE LIGNE COMPLETE
        //fin();
       
        nouvellePiece();
    
        while(col.pieceBas(*_ptrForme, *_mat) == false)
        {
            _ptrForme->deplacementBas();
            _mat->updateMatrice();
            _spi.envoyerMatrice(*_mat);
            wait(0.2);
        }
        
        while(col.pieceGauche(*_ptrForme, *_mat) == false)
        {
            _ptrForme->deplacementGauche();
            _mat->updateMatrice();
            _spi.envoyerMatrice(*_mat);
            wait(0.2);
        }
        
        while(col.pieceDroite(*_ptrForme, *_mat) == false)
        {
            _ptrForme->deplacementDroite();
            _mat->updateMatrice();
            _spi.envoyerMatrice(*_mat);
            wait(0.2);
        }
        pc.printf(" Collision !!!!\n");
        
    fin();
    
    return 0;
}

void cJeu::fin()
{
    delete _ptrForme;
    delete _mat;
}