diff options
Diffstat (limited to 'labb3/tiles')
| -rw-r--r-- | labb3/tiles/TileList.cpp | 117 | ||||
| -rw-r--r-- | labb3/tiles/TileList.h | 50 |
2 files changed, 135 insertions, 32 deletions
diff --git a/labb3/tiles/TileList.cpp b/labb3/tiles/TileList.cpp index 29a309b..88bdc21 100644 --- a/labb3/tiles/TileList.cpp +++ b/labb3/tiles/TileList.cpp @@ -1,52 +1,133 @@ -// This is the .cpp file you will edit and turn in. -// We have provided a skeleton for you, -// but you must finish it as described in the spec. -// Also remove these comments here and add your own. -// TODO: remove this comment header - #include "TileList.h" TileList::TileList() { - // TODO: write this member + tiles = new Tile[INITIAL_SIZE]; + cur_size = INITIAL_SIZE; } TileList::~TileList() -{ - // TODO: write this member +{delete tiles; } void TileList::addTile(Tile tile) { - // TODO: write this member + // O(1) amortized + if (amount_tiles == cur_size) { + // reached size limit, so allocate new array and move the old tiles + Tile *expanded_tiles = new Tile[cur_size + INCREASE_SIZE]; + for (int i = 0; i < cur_size; i++) { + expanded_tiles[i] = tiles[i]; + } + cur_size += INCREASE_SIZE; + delete tiles; + tiles = expanded_tiles; + } + tiles[amount_tiles++] = tile; +} + +void TileList::drawAll(QGraphicsScene *scene) const +{ + // O(n) + for (int i = 0; i < amount_tiles; i++) { + (tiles + i)->draw(scene); + } +} + +int TileList::indexOfTopTile(int x, int y) const +{ + // O(n) + for (int i = 0; i < amount_tiles; i++) { + if ((tiles + i)->contains(x, y)) { + return i; + } + } + return -1; +} + +int TileList::indexOfBottomTile(int x, int y) const +{ + // O(n) + for (int i = amount_tiles - 1; i >= 0; i--) { + if ((tiles + i)->contains(x, y)) { + return i; + } + } + return -1; } -void TileList::drawAll(QGraphicsScene* scene) +void TileList::shiftRight(int start, int end) { - // TODO: write this member + // e.g. length=5, start=1, end=4: + // 0 1 2 3 4 5 + // 0 1 1 2 3 5 + // O(n) + for (int i = end; i > start; i--) { + tiles[i] = tiles[i - 1]; + } } -int TileList::indexOfTopTile(int x, int y) +void TileList::shiftLeft(int start, int end) { - // TODO: write this member + // e.g. length=5, start=4, end=1: + // 0 1 2 3 4 5 + // 0 2 3 4 4 5 + // O(n) + for (int i = start; i < end; i++) { + tiles[i] = tiles[i + 1]; + } } void TileList::raise(int x, int y) { - // TODO: write this member + // 0 1 2 3 4 5 - + // 0 1 2 3 4 5 3 + // 0 1 2 4 5 5 3 + // 0 1 2 4 5 3 - + // O(n) + int index = indexOfTopTile(x, y); + if (index == -1 || index == amount_tiles - 1) { + // no tile found, or tile is already at top + return; + } + Tile tmpTile = tiles[index]; + shiftLeft(index, amount_tiles - 1); + tiles[amount_tiles - 1] = tmpTile; } void TileList::lower(int x, int y) { - // TODO: write this member + // 0 1 2 3 4 5 - + // 0 1 2 3 4 5 3 + // 0 0 1 2 4 5 3 + // 3 0 1 2 4 5 - + // O(n) + int index = indexOfBottomTile(x, y); + if (index == -1 || index == 0) { + // no tile found, or tile is already at bottom + return; + } + Tile tmpTile = tiles[index]; + shiftRight(0, index); + tiles[0] = tmpTile; } void TileList::remove(int x, int y) { - // TODO: write this member + // O(n) + int index; + if ((index = indexOfBottomTile(x, y)) != -1) { + shiftLeft(index, amount_tiles - 1); + amount_tiles--; + } } void TileList::removeAll(int x, int y) { - // TODO: write this member + // O(n^2) + int index; + while ((index = indexOfTopTile(x, y)) != -1) { + shiftLeft(index, amount_tiles - 1); + amount_tiles--; + } } diff --git a/labb3/tiles/TileList.h b/labb3/tiles/TileList.h index a4b6ce6..865823f 100644 --- a/labb3/tiles/TileList.h +++ b/labb3/tiles/TileList.h @@ -1,8 +1,8 @@ -// This is the .h file you will edit and turn in. -// We have provided a skeleton for you, -// but you must finish it as described in the spec. -// Also remove these comments here and add your own, as well as on the members. -// TODO: remove this comment header +/* + * TDDD86 Lab 3a - gusso230 (group 11) + * This file contains the tile list structure. + * You can add, draw, lower, raise and remove tiles. + */ #ifndef TILELIST_H #define TILELIST_H @@ -12,18 +12,40 @@ class TileList { public: - TileList(); - ~TileList(); - void addTile(Tile tile); - void drawAll(QGraphicsScene* scene); - int indexOfTopTile(int x, int y); - void lower(int x, int y); - void raise(int x, int y); - void remove(int x, int y); - void removeAll(int x, int y); + TileList(); // allocate an empty tile list + ~TileList(); // deallocate the tile list + void addTile(Tile tile); // add a tile to the tile list, possibly reallocating + void drawAll(QGraphicsScene *scene) const; // draw all tiles to `scene` + int indexOfTopTile(int x, int y) const; + void lower(int x, int y); // move the top tile at (x, y) to the bottom + void raise(int x, int y); // move the bottom tile at (x, y) to the top + void remove(int x, int y); // remove the top tile at (x, y) + void removeAll(int x, int y); // remove all tiles at (x, y) private: + static const int INITIAL_SIZE = 10; // the initial size + static const int INCREASE_SIZE = 10; // how much the size is increased when + // it's needed + int cur_size = 0; // current size of array + int amount_tiles; // number of active tiles in array + Tile *tiles; // the array + int indexOfBottomTile(int x, int y) const; + + /* + * shiftRight and shiftLeft move a group of tiles either right or left + * in the internal array. + * shiftRight(1, 4): + * 0 1 2 3 4 5 + * 0 1 1 2 3 5 + * shiftLeft(4, 1): + * 0 1 2 3 4 5 + * 0 2 3 4 4 5 + * Effectively, `start` is duplicated either to the right for shiftRight + * or to the left for shiftLeft, and `end` is lost. + */ + void shiftRight(int start, int end); + void shiftLeft(int start, int end); }; #endif // TILELIST_H |
