14
ASSERT(size > 0 && size <= 36);
19
Matrix::Matrix(const Matrix &m)
22
ASSERT(size > 0 && size <= 36);
26
for (int i=0; i<size; i++)
27
for (int j=0; j<size; j++)
28
matrix[i][j] = m.at(i, j);
33
ASSERT(size > 0 && size <= 36);
35
for (int i=0; i<size; i++)
44
matrix = new short*[size];
47
for (int i=0; i<size; i++)
49
matrix[i] = new short[size];
52
for (int j=0; j<size; j++)
53
matrix[i][j] = stoneNone;
59
void Matrix::initMarkTexts()
61
markTexts = new QStringList();
67
ASSERT(size > 0 && size <= 36);
69
for (int i=0; i<size; i++)
70
for (int j=0; j<size; j++)
71
matrix[i][j] = stoneNone;
75
void Matrix::debug() const
77
ASSERT(size > 0 && size <= 36);
82
for (i=0; i<size; i++)
83
cout << (i+1)%10 << " ";
86
for (i=0; i<size; i++)
88
cout << (i+1)%10 << " ";
89
for (j=0; j<size; j++)
92
switch (abs(matrix[j][i]))
95
case stoneErase: cout << ". "; break;
96
case stoneBlack: cout << "B "; break;
97
case stoneWhite: cout << "W "; break;
98
case markSquare*10: cout << "[ "; break;
99
case markCircle*10: cout << "O "; break;
100
case markTriangle*10: cout << "T "; break;
101
case markCross*10: cout << "X "; break;
102
case markText*10: cout << "A "; break;
103
case markNumber*10: cout << "1 "; break;
104
case markSquare*10+stoneBlack: cout << "S "; break;
105
case markCircle*10+stoneBlack: cout << "C "; break;
106
case markTriangle*10+stoneBlack: cout << "D "; break;
107
case markCross*10+stoneBlack: cout << "R "; break;
108
case markText*10+stoneBlack: cout << "A "; break;
109
case markNumber*10+stoneBlack: cout << "N "; break;
110
case markSquare*10+stoneWhite: cout << "s "; break;
111
case markCircle*10+stoneWhite: cout << "c "; break;
112
case markTriangle*10+stoneWhite: cout << "d "; break;
113
case markCross*10+stoneWhite: cout << "r "; break;
114
case markText*10+stoneWhite: cout << "a "; break;
115
case markNumber*10+stoneWhite: cout << "n "; break;
116
default: cout << "? ";
119
cout << matrix[j][i] << " ";
122
cout << (i+1)%10 << endl;
126
for (i=0; i<size; i++)
127
cout << (i+1)%10 << " ";
130
if (markTexts != NULL && !markTexts->isEmpty())
132
cout << markTexts->count() << " mark texts in the storage.\n";
133
for (QStringList::Iterator it=markTexts->begin(); it != markTexts->end(); ++it)
134
cout << (QString)(*it) << endl;
139
void Matrix::insertStone(int x, int y, StoneColor c, GameMode mode)
141
ASSERT(x > 0 && x <= size &&
144
matrix[x-1][y-1] = abs(matrix[x-1][y-1] / 10 * 10) + c;
145
if (mode == modeEdit)
146
matrix[x-1][y-1] *= -1;
149
void Matrix::removeStone(int x, int y)
151
ASSERT(x > 0 && x <= size &&
154
matrix[x-1][y-1] = abs(matrix[x-1][y-1] / 10 * 10);
157
void Matrix::eraseStone(int x, int y)
159
ASSERT(x > 0 && x <= size &&
162
matrix[x-1][y-1] = (abs(matrix[x-1][y-1] / 10 * 10) + stoneErase) * -1;
165
short Matrix::at(int x, int y) const
167
ASSERT(x >= 0 && x < size &&
173
void Matrix::set(int x, int y, int n)
175
ASSERT(x >= 0 && x < size &&
181
void Matrix::insertMark(int x, int y, MarkType t)
183
//ASSERT(x > 0 && x <= size && y > 0 && y <= size);
184
if (!(x > 0 && x <= size && y > 0 && y <= size))
187
matrix[x-1][y-1] = (abs(matrix[x-1][y-1]) + 10*t) * (matrix[x-1][y-1] < 0 ? -1 : 1);
190
void Matrix::removeMark(int x, int y)
192
ASSERT(x > 0 && x <= size &&
195
matrix[x-1][y-1] %= 10;
197
if (markTexts != NULL && !markTexts->isEmpty())
199
QStringList::Iterator it = getMarkTextIterator(x, y);
201
markTexts->remove(it);
205
void Matrix::clearAllMarks()
207
ASSERT(size > 0 && size <= 36);
209
for (int i=0; i<size; i++)
210
for (int j=0; j<size; j++)
213
if (markTexts != NULL)
220
void Matrix::clearTerritoryMarks()
222
ASSERT(size > 0 && size <= 36);
226
for (int i=0; i<size; i++)
227
for (int j=0; j<size; j++)
228
if ((data = abs(matrix[i][j] / 10)) == markTerrBlack ||
229
data == markTerrWhite)
233
void Matrix::absMatrix()
235
ASSERT(size > 0 && size <= 36);
237
for (int i=0; i<size; i++)
239
for (int j=0; j<size; j++)
241
matrix[i][j] = abs(matrix[i][j]);
242
if (matrix[i][j] == stoneErase)
243
matrix[i][j] = stoneNone;
244
if (matrix[i][j] % 10 == stoneErase)
245
matrix[i][j] = matrix[i][j] / 10 * 10;
250
void Matrix::setMarkText(int x, int y, const QString &txt)
252
ASSERT(x > 0 && x <= size &&
255
// We only create the markTexts list if we really need it.
256
if (markTexts == NULL)
259
QStringList::Iterator it = getMarkTextIterator(x, y);
260
if (it != NULL) // Mark already exists at this position, remove old text.
261
markTexts->remove(it);
263
QString tmp = QString::number(coordsToKey(x, y)) + "#" + txt;
264
markTexts->append(tmp);
267
QStringList::Iterator Matrix::getMarkTextIterator(int x, int y)
269
if (markTexts == NULL)
273
int pos, tmpX, tmpY, counter=0;
276
QStringList::Iterator it;
278
for (it=markTexts->begin(); it != markTexts->end(); ++it)
282
// Get the splitting '#', everything left of it is our key.
284
if (pos == -1) // Whoops
286
qWarning(" *** Corrupt text marks in matrix! ***");
290
// Transform key to coordinates
292
key = tmp.toLong(&check);
295
qWarning(" *** Corrupt text marks in matrix! ***");
298
keyToCoords(key, tmpX, tmpY);
301
if (tmpX == x && tmpY == y)
310
const QString Matrix::getMarkText(int x, int y)
312
// We didn't store any texts in this matrix.
313
if (markTexts == NULL || markTexts->isEmpty())
316
QStringList::Iterator it = getMarkTextIterator(x, y);
317
if (it == NULL) // Nope, this entry does not exist.
320
QString s = (QString)(*it);
321
s = s.right(s.length() - s.find('#') - 1);
326
const QString Matrix::saveMarks()
328
ASSERT(size > 0 && size <= 36);
330
QString txt, sSQ = "", sCR = "", sTR = "", sMA = "", sLB = "", sTB = "", sTW = "";
331
int i, j, colw = 0, colb = 0;
333
for (i=0; i<size; i++)
335
for (j=0; j<size; j++)
337
switch (abs(matrix[i][j] / 10))
342
sSQ += "[" + coordsToString(i, j) + "]";
347
sCR += "[" + coordsToString(i, j) + "]";
352
sTR += "[" + coordsToString(i, j) + "]";
357
sMA += "[" + coordsToString(i, j) + "]";
363
sLB += "[" + coordsToString(i, j);
365
txt = getMarkText(i+1, j+1);
366
if (txt.isNull() || txt.isEmpty())
367
sLB += "?"; // Whoops
378
sTB += "[" + coordsToString(i, j) + "]";
379
if (++colb % 15 == 0)
388
sTW += "[" + coordsToString(i, j) + "]";
389
if (++colw % 15 == 0)
397
return sSQ + sCR + sTR + sMA + sLB + sTB + sTW;
400
const QString Matrix::saveEditedMoves(Matrix *parent)
402
ASSERT(size > 0 && size <= 36);
404
QString sAB="", sAW="", sAE="";
407
for (i=0; i<size; i++)
409
for (j=0; j<size; j++)
411
switch (matrix[i][j] % 10)
413
case stoneBlack * -1:
414
if (parent != NULL &&
415
parent->at(i, j) == stoneBlack)
419
sAB += "[" + coordsToString(i, j) + "]";
422
case stoneWhite * -1:
423
if (parent != NULL &&
424
parent->at(i, j) == stoneWhite)
428
sAW += "[" + coordsToString(i, j) + "]";
431
case stoneErase * -1:
432
if (parent != NULL &&
433
(parent->at(i, j) == stoneNone ||
434
parent->at(i, j) == stoneErase))
438
sAE += "[" + coordsToString(i, j) + "]";
444
return sAB + sAW + sAE;
447
const QString Matrix::printMe(ASCII_Import *charset)
449
ASSERT(size > 0 && size <= 36);
452
qDebug("BLACK STONE CHAR %c\n"
453
"WHITE STONE CHAR %c\n"
454
"STAR POINT CHAR %c\n"
455
"EMPTY POINT CHAR %c\n",
459
charset->emptyPoint);
466
for (i=0; i<size; i++)
467
str += QString(QChar(static_cast<const char>('A' + (i<8?i:i+1)))) + " ";
469
for (i=0; i<size-1; i++)
473
for (i=0; i<size; i++)
475
if (size-i < 10) str += " ";
476
str += QString::number(size-i) + " |";
477
for (j=0; j<size; j++)
479
switch (abs(matrix[j][i] % 10))
481
case stoneBlack: str += QChar(charset->blackStone); str += " "; break;
482
case stoneWhite: str += QChar(charset->whiteStone); str += " "; break;
484
// Check for starpoints
485
if (size > 9) // 10x10 or larger
487
if ((i == 3 && j == 3) ||
488
(i == size-4 && j == 3) ||
489
(i == 3 && j == size-4) ||
490
(i == size-4 && j == size-4) ||
491
(i == (size+1)/2 - 1 && j == 3) ||
492
(i == (size+1)/2 - 1 && j == size-4) ||
493
(i == 3 && j == (size+1)/2 - 1) ||
494
(i == size-4 && j == (size+1)/2 - 1) ||
495
(i == (size+1)/2 - 1 && j == (size+1)/2 - 1))
497
str += QChar(charset->starPoint);
502
else // 9x9 or smaller
504
if ((i == 2 && j == 2) ||
505
(i == 2 && j == size-3) ||
506
(i == size-3 && j == 2) ||
507
(i == size-3 && j == size-3))
509
str += QChar(charset->starPoint);
515
str += QChar(charset->emptyPoint);
520
str = str.left(str.length()-1);
522
if (size-i < 10) str += " ";
523
str += QString::number(size-i) + "\n";
527
for (i=0; i<size-1; i++)
530
for (i=0; i<size; i++)
531
str += QString(QChar(static_cast<const char>('A' + (i<8?i:i+1)))) + " ";