Skip to content
Snippets Groups Projects
Commit c6257771 authored by Le Tiec Aymeric's avatar Le Tiec Aymeric
Browse files

Merge branch 'quentin' of https://gitlab.ec-lyon.fr/aletiec/projet-interface-graphique into quentin

parents 821766b2 13baad55
No related branches found
No related tags found
No related merge requests found
......@@ -35,53 +35,185 @@ QVector<int> Game2048::board() const {
}
void Game2048::spawnTile() {
QVector<QPair<int,int>> emptyTiles;
for (int row = 0; row < 4; row++) {
for (int col = 0; col < 4; col++) {
if (m_board[row][col] == 0)
flatBoard.append(row * 4 + col);
}
}
if (!flatBoard.isEmpty()) {
int randIndex = QRandomGenerator::global()->bounded(flatBoard.size());
int index = flatBoard[randIndex];
int row = index / 4;
int col = index % 4;
m_board[row][col] = (QRandomGenerator::global()->bounded(10) == 0) ? 4 : 2;
QVector<QPair<int,int>> emptyPositions;
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
if(m_board[i][j] == 0)
emptyPositions.append(qMakePair(i,j));
if(!emptyPositions.isEmpty()) {
int randIndex = QRandomGenerator::global()->bounded(emptyPositions.size());
auto pos = emptyPositions[randIndex];
m_board[pos.first][pos.second] = (QRandomGenerator::global()->bounded(10)==0) ? 4 : 2;
}
}
bool Game2048::moveLeft() {
bool moved = false;
// Implémentation à venir
for(int i=0; i<4; i++) { // Pour chaque ligne, on compresse, fusionne et re compresse
// Compression à gauche
for(int k=0; k<3; k++)
for(int j=0; j<3; j++)
if(m_board[i][j]==0 && m_board[i][j+1]!=0) {
m_board[i][j]=m_board[i][j+1];
m_board[i][j+1]=0;
moved=true;
}
// Fusion
for(int j=0; j<3; j++)
if(m_board[i][j]!=0 && m_board[i][j]==m_board[i][j+1]) {
m_board[i][j]*=2;
m_score+=m_board[i][j];
m_board[i][j+1]=0;
moved=true;
}
// Recompression après fusion
for(int k=0; k<3; k++)
for(int j=0; j<3; j++)
if(m_board[i][j]==0 && m_board[i][j+1]!=0) {
m_board[i][j]=m_board[i][j+1];
m_board[i][j+1]=0;
}
}
if(moved) {
spawnTile();
updateGameState();
emit boardChanged();
emit scoreChanged();
}
return moved;
}
bool Game2048::moveRight() {
bool moved = false;
// Implémentation à venir
for(int i=0; i<4; i++) { // Pour chaque ligne, on compresse, fusionne et re compresse
// Compression à droite
for(int k=0; k<3; k++)
for(int j=3; j>0; j--)
if(m_board[i][j]==0 && m_board[i][j-1]!=0) {
m_board[i][j]=m_board[i][j-1];
m_board[i][j-1]=0;
moved=true;
}
// Fusion
for(int j=3; j>0; j--)
if(m_board[i][j]!=0 && m_board[i][j]==m_board[i][j-1]) {
m_board[i][j]*=2;
m_score+=m_board[i][j];
m_board[i][j-1]=0;
moved=true;
}
// Recompression après fusion
for(int k=0; k<3; k++)
for(int j=3; j>0; j--)
if(m_board[i][j]==0 && m_board[i][j-1]!=0) {
m_board[i][j]=m_board[i][j-1];
m_board[i][j-1]=0;
}
}
if(moved) {
spawnTile();
updateGameState();
emit boardChanged();
emit scoreChanged();
}
return moved;
}
bool Game2048::moveUp() {
bool moved = false;
// Implémentation à venir
for(int j=0; j<4; j++) { // Pour chaque colonne, on compresse, fusionne et re compresse
// Compression à droite
for(int k=0; k<3; k++)
for(int i=0; i<3; i++)
if(m_board[i][j]==0 && m_board[i+1][j]!=0) {
m_board[i][j]=m_board[i+1][j];
m_board[i+1][j]=0;
moved=true;
}
// Fusion
for(int i=0; i<3; i++)
if(m_board[i][j]!=0 && m_board[i][j]==m_board[i+1][j]) {
m_board[i][j]*=2;
m_score+=m_board[i][j];
m_board[i+1][j]=0;
moved=true;
}
// Recompression après fusion
for(int k=0; k<3; k++)
for(int i=0; i<3; i++)
if(m_board[i][j]==0 && m_board[i+1][j]!=0) {
m_board[i][j]=m_board[i+1][j];
m_board[i+1][j]=0;
}
}
if(moved) {
spawnTile();
updateGameState();
emit boardChanged();
emit scoreChanged();
}
return moved;
}
bool Game2048::moveDown() {
bool moved = false;
// Implémentation à venir
for(int j=0; j<4; j++) { // Pour chaque colonne, on compresse, fusionne et re compresse
// Compression à droite
for(int k=0; k<3; k++)
for(int i=3; i>0; i--)
if(m_board[i][j]==0 && m_board[i-1][j]!=0) {
m_board[i][j]=m_board[i-1][j];
m_board[i-1][j]=0;
moved=true;
}
// Fusion
for(int i=3; i>0; i--)
if(m_board[i][j]!=0 && m_board[i][j]==m_board[i-1][j]) {
m_board[i][j]*=2;
m_score+=m_board[i][j];
m_board[i-1][j]=0;
moved=true;
}
// Recompression après fusion
for(int k=0; k<3; k++)
for(int i=3; i>0; i--)
if(m_board[i][j]==0 && m_board[i-1][j]!=0) {
m_board[i][j]=m_board[i-1][j];
m_board[i-1][j]=0;
}
}
if(moved) {
spawnTile();
updateGameState();
emit boardChanged();
emit scoreChanged();
}
return moved;
}
bool Game2048::canMove() const {
for (int i=0; i<4; i++){
for (int j=0; j<4; j++){
if (m_board[i][j]==0){
return true;
}
if (i<3 && m_board[i][j]==m_board[i+1][j]){
return true;
}
if (j<3 && m_board[i][j]==m_board[i][j+1]){
return true;
}
}
}
return true;
}
void Game2048::updateGameState() {
if (!canMove()) {
emit gameOver();
}
}
bool Game2048::canMove() const {
// Implémentation basique à compléter
return true;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment