/* * matrix.cpp */ #include "matrix.h" #include #ifndef NO_DEBUG #include #endif Matrix::Matrix(int s) : size(s) { ASSERT(size > 0 && size <= 36); init(); } Matrix::Matrix(const Matrix &m) { size = m.getSize(); ASSERT(size > 0 && size <= 36); init(); for (int i=0; i 0 && size <= 36); for (int i=0; i 0 && size <= 36); for (int i=0; i 0 && size <= 36); int i, j; cout << "\n "; for (i=0; iisEmpty()) { cout << markTexts->count() << " mark texts in the storage.\n"; for (QStringList::Iterator it=markTexts->begin(); it != markTexts->end(); ++it) cout << (QString)(*it) << endl; } } #endif void Matrix::insertStone(int x, int y, StoneColor c, GameMode mode) { ASSERT(x > 0 && x <= size && y > 0 && y <= size); matrix[x-1][y-1] = abs(matrix[x-1][y-1] / 10 * 10) + c; if (mode == modeEdit) matrix[x-1][y-1] *= -1; } void Matrix::removeStone(int x, int y) { ASSERT(x > 0 && x <= size && y > 0 && y <= size); matrix[x-1][y-1] = abs(matrix[x-1][y-1] / 10 * 10); } void Matrix::eraseStone(int x, int y) { ASSERT(x > 0 && x <= size && y > 0 && y <= size); matrix[x-1][y-1] = (abs(matrix[x-1][y-1] / 10 * 10) + stoneErase) * -1; } short Matrix::at(int x, int y) const { ASSERT(x >= 0 && x < size && y >= 0 && y < size); return matrix[x][y]; } void Matrix::set(int x, int y, int n) { ASSERT(x >= 0 && x < size && y >= 0 && y < size); matrix[x][y] = n; } void Matrix::insertMark(int x, int y, MarkType t) { //ASSERT(x > 0 && x <= size && y > 0 && y <= size); if (!(x > 0 && x <= size && y > 0 && y <= size)) return; matrix[x-1][y-1] = (abs(matrix[x-1][y-1]) + 10*t) * (matrix[x-1][y-1] < 0 ? -1 : 1); } void Matrix::removeMark(int x, int y) { ASSERT(x > 0 && x <= size && y > 0 && y <= size); matrix[x-1][y-1] %= 10; if (markTexts != NULL && !markTexts->isEmpty()) { QStringList::Iterator it = getMarkTextIterator(x, y); if (it != NULL) markTexts->remove(it); } } void Matrix::clearAllMarks() { ASSERT(size > 0 && size <= 36); for (int i=0; i 0 && size <= 36); int data; for (int i=0; i 0 && size <= 36); for (int i=0; i 0 && x <= size && y > 0 && y <= size); // We only create the markTexts list if we really need it. if (markTexts == NULL) initMarkTexts(); QStringList::Iterator it = getMarkTextIterator(x, y); if (it != NULL) // Mark already exists at this position, remove old text. markTexts->remove(it); QString tmp = QString::number(coordsToKey(x, y)) + "#" + txt; markTexts->append(tmp); } QStringList::Iterator Matrix::getMarkTextIterator(int x, int y) { if (markTexts == NULL) return NULL; QString s, tmp; int pos, tmpX, tmpY, counter=0; bool check = false; long key; QStringList::Iterator it; for (it=markTexts->begin(); it != markTexts->end(); ++it) { s = (QString)(*it); // Get the splitting '#', everything left of it is our key. pos = s.find('#'); if (pos == -1) // Whoops { qWarning(" *** Corrupt text marks in matrix! ***"); continue; } // Transform key to coordinates tmp = s.left(pos); key = tmp.toLong(&check); if (!check) { qWarning(" *** Corrupt text marks in matrix! ***"); continue; } keyToCoords(key, tmpX, tmpY); // This is our hit? if (tmpX == x && tmpY == y) return it; // Nope, wasn't counter++; } return NULL; } const QString Matrix::getMarkText(int x, int y) { // We didn't store any texts in this matrix. if (markTexts == NULL || markTexts->isEmpty()) return NULL; QStringList::Iterator it = getMarkTextIterator(x, y); if (it == NULL) // Nope, this entry does not exist. return NULL; QString s = (QString)(*it); s = s.right(s.length() - s.find('#') - 1); return s; } const QString Matrix::saveMarks() { ASSERT(size > 0 && size <= 36); QString txt, sSQ = "", sCR = "", sTR = "", sMA = "", sLB = "", sTB = "", sTW = ""; int i, j, colw = 0, colb = 0; for (i=0; i 0 && size <= 36); QString sAB="", sAW="", sAE=""; int i, j; for (i=0; iat(i, j) == stoneBlack) break; if (sAB.isEmpty()) sAB += "AB"; sAB += "[" + coordsToString(i, j) + "]"; break; case stoneWhite * -1: if (parent != NULL && parent->at(i, j) == stoneWhite) break; if (sAW.isEmpty()) sAW += "AW"; sAW += "[" + coordsToString(i, j) + "]"; break; case stoneErase * -1: if (parent != NULL && (parent->at(i, j) == stoneNone || parent->at(i, j) == stoneErase)) break; if (sAE.isEmpty()) sAE += "AE"; sAE += "[" + coordsToString(i, j) + "]"; break; } } } return sAB + sAW + sAE; } const QString Matrix::printMe(ASCII_Import *charset) { ASSERT(size > 0 && size <= 36); #if 0 qDebug("BLACK STONE CHAR %c\n" "WHITE STONE CHAR %c\n" "STAR POINT CHAR %c\n" "EMPTY POINT CHAR %c\n", charset->blackStone, charset->whiteStone, charset->starPoint, charset->emptyPoint); #endif int i, j; QString str; str = "\n "; for (i=0; i('A' + (i<8?i:i+1)))) + " "; str += "\n +"; for (i=0; iblackStone); str += " "; break; case stoneWhite: str += QChar(charset->whiteStone); str += " "; break; default: // Check for starpoints if (size > 9) // 10x10 or larger { if ((i == 3 && j == 3) || (i == size-4 && j == 3) || (i == 3 && j == size-4) || (i == size-4 && j == size-4) || (i == (size+1)/2 - 1 && j == 3) || (i == (size+1)/2 - 1 && j == size-4) || (i == 3 && j == (size+1)/2 - 1) || (i == size-4 && j == (size+1)/2 - 1) || (i == (size+1)/2 - 1 && j == (size+1)/2 - 1)) { str += QChar(charset->starPoint); str += " "; break; } } else // 9x9 or smaller { if ((i == 2 && j == 2) || (i == 2 && j == size-3) || (i == size-3 && j == 2) || (i == size-3 && j == size-3)) { str += QChar(charset->starPoint); str += " "; break; } } str += QChar(charset->emptyPoint); str += " "; break; } } str = str.left(str.length()-1); str += "| "; if (size-i < 10) str += " "; str += QString::number(size-i) + "\n"; } str += " +"; for (i=0; i('A' + (i<8?i:i+1)))) + " "; str += "\n"; return str; }