| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include "qtictactoegame.h"
- QTicTacToeGame::QTicTacToeGame(int size, int countToWin, QObject *parent) :
- QObject(parent)
- {
- board = new int*[size];
- for (int i=0; i<size; i++)
- board[i] = new int[size];
- this->size = size;
- this->countToWin = countToWin;
- clear();
- }
- void QTicTacToeGame::clear()
- {
- aviableCells = size*size;
- for (int i=0; i<size;i++)
- for (int j=0; j<size; j++)
- board[i][j] = 0;
- }
- bool QTicTacToeGame::put(int x, int y, int player)
- {
- if (x<0||y<0||x>=size||y>=size) return false;
- if (board[x][y]) return false;
- board[x][y] = player;
- emit itemPuted(x,y, player);
- if (checkFromPoint(x,y)) emit gameOver(player);
- aviableCells--;
- if (!aviableCells)
- emit gameOver(0);
- return true;
- }
- bool QTicTacToeGame::checkFromPoint(int x, int y)
- {
- int currPlayer = board[x][y];
- int cnt = 0;
- int minXBorder = qMax(x-countToWin,0);
- int maxXBorder = qMin(x+countToWin,size);
- int minYBorder = qMax(y-countToWin,0);
- int maxYBorder = qMin(y+countToWin,size);
- // check X axis
- for (int i=minXBorder; i<maxXBorder; i++)
- {
- if (board[i][y]==currPlayer) cnt++;
- else cnt=0;
- if (cnt==countToWin) return true;
- }
- // check Y axis
- cnt = 0;
- for (int i=minYBorder; i<maxYBorder; i++)
- {
- if (board[x][i]==currPlayer) cnt++;
- else cnt=0;
- if (cnt==countToWin) return true;
- }
- int vX = x;
- int vY = y;
- cnt = 0;
- // check TopLeft - BottomRight diag
- while (vX >= 0 && vX >= x-countToWin && vY >=0 && vY >= y-countToWin && board[vX][vY] == currPlayer)
- {
- cnt++; vX--; vY--;
- }
- vX = x; vY = y; cnt--;
- while (vX < size && vX < x+countToWin && vY < size && vY < y+countToWin && board[vX][vY] == currPlayer)
- {
- cnt++; vX++; vY++;
- }
- if (cnt>=countToWin) return true;
- // check BottomLeft - TopRight diag
- vX = x; vY = y; cnt = 0;
- while (vX >= 0 && vX >= x-countToWin && vY < size && vY < y+countToWin && board[vX][vY] == currPlayer)
- {
- cnt++; vX--; vY++;
- }
- vX = x; vY = y; cnt--;
- while (vX < size && vX < x+countToWin && vY >=0 && vY >= y-countToWin && board[vX][vY] == currPlayer)
- {
- cnt++; vX++; vY--;
- }
- if (cnt>=countToWin) return true;
- return false;
- }
- int QTicTacToeGame::getPlayer(int x, int y)
- {
- Q_ASSERT(x>=0&&y>=0&&x<size&&y<size);
- return board[x][y];
- }
- int QTicTacToeGame::getSize()
- {
- return size;
- }
|