diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-19 09:52:04 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-19 09:52:04 +0100 |
| commit | 9578de486aa49d4f89548155ab462732e42267cd (patch) | |
| tree | bbc7cab41a21a4d5619389860b753846e4ec2090 /src | |
| parent | cae4150779c587edcc40b75f04624ab3971bbed6 (diff) | |
| download | 2048-9578de486aa49d4f89548155ab462732e42267cd.tar.gz 2048-9578de486aa49d4f89548155ab462732e42267cd.tar.bz2 2048-9578de486aa49d4f89548155ab462732e42267cd.zip | |
dirty game logic
Diffstat (limited to 'src')
| -rw-r--r-- | src/game.cpp | 155 | ||||
| -rw-r--r-- | src/graphics.cpp | 3 |
2 files changed, 121 insertions, 37 deletions
diff --git a/src/game.cpp b/src/game.cpp index 5bd3763..2ef3c15 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -7,13 +7,13 @@ Game::Game(int s) grid = new int*[size]; for (int i = 0; i < size; i++) grid[i] = new int[size]; + spawn(); + spawn(); } Game::~Game() { - for (int i = 0; i < size; i++) - delete []grid[i]; - delete []grid; + gridDestroy(grid); } int Game::getSize() @@ -28,56 +28,77 @@ int Game::at(int x, int y) void Game::move(Direction direction) { + std::vector<int> row; + int **saved = gridCopy(); + switch (direction) { case DIRECTION_LEFT: + for (int i = 0; i < size; i++) + { + row.clear(); + for (int j = 0; j < size; j++) + row.push_back(grid[i][j]); + mergeRow(row); + for (int j = 0; j < size; j++) + grid[i][j] = row[j]; + } break; case DIRECTION_RIGHT: - // for (int i = 0; i < size; i++) - // for (int j = size - 2; j >= 0; j--) - // { - // if (grid[i][j + 1] == grid[i][j]) - // { - // grid[i][j + 1] *= 2; - // for (int k = j; k >= 0; k--) - // grid[i][k] = grid[i][k - 1]; - // grid[i][shifts] = 0; - // shifts++; - // } - // } + for (int i = 0; i < size; i++) + { + row.clear(); + for (int j = size - 1; j >= 0; j--) + row.push_back(grid[i][j]); + mergeRow(row); + for (int j = size - 1; j >= 0; j--) + grid[i][j] = row[size - j - 1]; + } break; case DIRECTION_DOWN: + for (int j = 0; j < size; j++) + { + row.clear(); + for (int i = size - 1; i >= 0; i--) + row.push_back(grid[i][j]); + mergeRow(row); + for (int i = size - 1; i >= 0; i--) + grid[i][j] = row[size - i - 1]; + } break; case DIRECTION_UP: - // for (int i = size - 2; i >= 0; i--) - // for (int j = 0; j < size; j++) - // { - // if (grid[i + 1][j] == grid[i][j]) - // { - // grid[i + 1][j 1] *= 2; - // for (int k = j; k >= 0; k--) - // grid[i][k] = grid[i][k - 1]; - // grid[i][shifts] = 0; - // shifts++; - // } - // } + for (int j = 0; j < size; j++) + { + row.clear(); + for (int i = 0; i < size; i++) + row.push_back(grid[i][j]); + mergeRow(row); + for (int i = 0; i < size; i++) + grid[i][j] = row[i]; + } break; } - spawn(); + if (!gridEqual(saved)) + spawn(); + gridDestroy(saved); } void Game::spawn() { - int i; - int j; + std::vector< std::pair<int, int> > possible; - do - { - i = rand() % size; - j = rand() % size; - } - while (grid[i][j] != 0); - grid[i][j] = 2; + if (lost()) + return; + for (int i = 0; i < size; i++) + for (int j = 0; j < size; j++) + { + if (grid[i][j] == 0) + possible.push_back(std::make_pair(i, j)); + } + if (possible.size() < 1) + return; + std::pair<int, int> pos = possible[rand() % possible.size()]; + grid[pos.first][pos.second] = rand() % 2 == 0 ? 2 : 4; } bool Game::lost() @@ -98,3 +119,63 @@ bool Game::lost() } return true; } + +void Game::mergeRow(std::vector<int> &row) +{ + if (row.size() < 2) + return; + int pivot = 0; + for (size_t curr = 0; curr < row.size() - 1; curr++) + { + if (row[pivot] != 0) + { + pivot++; + continue; + } + for (size_t i = pivot; i < row.size() - 1; i++) + { + row[i] = row[i + 1]; + row[i + 1] = 0; + } + } + for (size_t curr = 0; curr < row.size() - 1; curr++) + { + if (row[curr] == 0) + break; + if (row[curr + 1] == row[curr]) + { + row[curr] *= 2; + row[curr + 1] = 0; + for (size_t i = curr + 1; i < row.size() - 1; i++) + row[i] = row[i + 1]; + } + } +} + +int **Game::gridCopy() +{ + int **copy = new int*[size]; + for (int i = 0; i < size; i++) + { + copy[i] = new int[size]; + for (int j = 0; j < size; j++) + copy[i][j] = grid[i][j]; + } + return copy; +} + +bool Game::gridEqual(int **other) +{ + for (int i = 0; i < size; i++) + for (int j = 0; j < size; j++) + if (grid[i][j] != other[i][j]) + return false; + return true; +} + +void Game::gridDestroy(int **g) +{ + for (int i = 0; i < size; i++) + delete []g[i]; + delete []g; +} diff --git a/src/graphics.cpp b/src/graphics.cpp index 12a2607..13d05b4 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -1,5 +1,8 @@ #include "graphics.hpp" +#define CELL_GAP 5 +#define GRID_BORDER 10 + Graphics::Graphics(Game *g, std::string t, int w, int h) { running = true; |
