#include "TileList.h" TileList::TileList() { tiles = new Tile[10]; cur_size = 10; } TileList::~TileList() { delete tiles; } void TileList::addTile(Tile tile) { if (amount_tiles == cur_size) { Tile *expanded_tiles = new Tile[cur_size + 10]; for (int i = 0; i < cur_size; i++) { expanded_tiles[i] = tiles[i]; } cur_size += 10; delete tiles; tiles = expanded_tiles; } tiles[amount_tiles++] = tile; } void TileList::drawAll(QGraphicsScene* scene) const { for (int i = 0; i < amount_tiles; i++) { (tiles + i)->draw(scene); } } int TileList::indexOfTopTile(int x, int y) const { 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 { int index = -1; for (int i = 0; i < amount_tiles; i++) { if ((tiles + i)->contains(x, y)) { index = i; } } return index; } void TileList::shiftRight(int start, int end) { // start is the free value, end is the lost value // e.g. when length=5, start=1, end=4: // 0 1 2 3 4 5 // 0 1 1 2 3 5 for (int i = end; i > start; i--) { tiles[i] = tiles[i - 1]; } } void TileList::shiftLeft(int start, int end) { // start is the free value, end is the lost value // e.g. when length=5, start=4, end=1: // 0 1 2 3 4 5 // 0 2 3 4 4 5 for (int i = start; i < end; i++) { tiles[i] = tiles[i + 1]; } } void TileList::raise(int x, int y) { // 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 - int index = indexOfTopTile(x, y); if (index == -1 || index == amount_tiles - 1) { return; } Tile tmpTile = tiles[index]; shiftLeft(index, amount_tiles - 1); tiles[amount_tiles - 1] = tmpTile; } void TileList::lower(int x, int y) { // 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 - int index = indexOfBottomTile(x, y); if (index == -1 || index == 0) { return; } Tile tmpTile = tiles[index]; shiftRight(0, index); tiles[0] = tmpTile; } void TileList::remove(int x, int y) { int index = indexOfBottomTile(x, y); if (index != -1) { shiftLeft(index, amount_tiles - 1); amount_tiles--; } } void TileList::removeAll(int x, int y) { int index = indexOfTopTile(x, y); while (index != -1) { shiftLeft(index, amount_tiles - 1); amount_tiles--; index = indexOfTopTile(x, y); } }