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 { ...@@ -35,53 +35,185 @@ QVector<int> Game2048::board() const {
} }
void Game2048::spawnTile() { void Game2048::spawnTile() {
QVector<QPair<int,int>> emptyTiles; QVector<QPair<int,int>> emptyPositions;
for (int row = 0; row < 4; row++) { for(int i=0; i<4; i++)
for (int col = 0; col < 4; col++) { for(int j=0; j<4; j++)
if (m_board[row][col] == 0) if(m_board[i][j] == 0)
flatBoard.append(row * 4 + col); emptyPositions.append(qMakePair(i,j));
}
} if(!emptyPositions.isEmpty()) {
if (!flatBoard.isEmpty()) { int randIndex = QRandomGenerator::global()->bounded(emptyPositions.size());
int randIndex = QRandomGenerator::global()->bounded(flatBoard.size()); auto pos = emptyPositions[randIndex];
int index = flatBoard[randIndex]; m_board[pos.first][pos.second] = (QRandomGenerator::global()->bounded(10)==0) ? 4 : 2;
int row = index / 4;
int col = index % 4;
m_board[row][col] = (QRandomGenerator::global()->bounded(10) == 0) ? 4 : 2;
} }
} }
bool Game2048::moveLeft() { bool Game2048::moveLeft() {
bool moved = false; 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; return moved;
} }
bool Game2048::moveRight() { bool Game2048::moveRight() {
bool moved = false; 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; return moved;
} }
bool Game2048::moveUp() { bool Game2048::moveUp() {
bool moved = false; 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; return moved;
} }
bool Game2048::moveDown() { bool Game2048::moveDown() {
bool moved = false; 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; 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() { void Game2048::updateGameState() {
if (!canMove()) { if (!canMove()) {
emit gameOver(); 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