qtictactoegame.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "qtictactoegame.h"
  2. QTicTacToeGame::QTicTacToeGame(int size, int countToWin, QObject *parent) :
  3. QObject(parent)
  4. {
  5. board = new int*[size];
  6. for (int i=0; i<size; i++)
  7. board[i] = new int[size];
  8. this->size = size;
  9. this->countToWin = countToWin;
  10. clear();
  11. }
  12. void QTicTacToeGame::clear()
  13. {
  14. aviableCells = size*size;
  15. for (int i=0; i<size;i++)
  16. for (int j=0; j<size; j++)
  17. board[i][j] = 0;
  18. }
  19. bool QTicTacToeGame::put(int x, int y, int player)
  20. {
  21. if (x<0||y<0||x>=size||y>=size) return false;
  22. if (board[x][y]) return false;
  23. board[x][y] = player;
  24. emit itemPuted(x,y, player);
  25. if (checkFromPoint(x,y)) emit gameOver(player);
  26. aviableCells--;
  27. if (!aviableCells)
  28. emit gameOver(0);
  29. return true;
  30. }
  31. bool QTicTacToeGame::checkFromPoint(int x, int y)
  32. {
  33. int currPlayer = board[x][y];
  34. int cnt = 0;
  35. int minXBorder = qMax(x-countToWin,0);
  36. int maxXBorder = qMin(x+countToWin,size);
  37. int minYBorder = qMax(y-countToWin,0);
  38. int maxYBorder = qMin(y+countToWin,size);
  39. // check X axis
  40. for (int i=minXBorder; i<maxXBorder; i++)
  41. {
  42. if (board[i][y]==currPlayer) cnt++;
  43. else cnt=0;
  44. if (cnt==countToWin) return true;
  45. }
  46. // check Y axis
  47. cnt = 0;
  48. for (int i=minYBorder; i<maxYBorder; i++)
  49. {
  50. if (board[x][i]==currPlayer) cnt++;
  51. else cnt=0;
  52. if (cnt==countToWin) return true;
  53. }
  54. int vX = x;
  55. int vY = y;
  56. cnt = 0;
  57. // check TopLeft - BottomRight diag
  58. while (vX >= 0 && vX >= x-countToWin && vY >=0 && vY >= y-countToWin && board[vX][vY] == currPlayer)
  59. {
  60. cnt++; vX--; vY--;
  61. }
  62. vX = x; vY = y; cnt--;
  63. while (vX < size && vX < x+countToWin && vY < size && vY < y+countToWin && board[vX][vY] == currPlayer)
  64. {
  65. cnt++; vX++; vY++;
  66. }
  67. if (cnt>=countToWin) return true;
  68. // check BottomLeft - TopRight diag
  69. vX = x; vY = y; cnt = 0;
  70. while (vX >= 0 && vX >= x-countToWin && vY < size && vY < y+countToWin && board[vX][vY] == currPlayer)
  71. {
  72. cnt++; vX--; vY++;
  73. }
  74. vX = x; vY = y; cnt--;
  75. while (vX < size && vX < x+countToWin && vY >=0 && vY >= y-countToWin && board[vX][vY] == currPlayer)
  76. {
  77. cnt++; vX++; vY--;
  78. }
  79. if (cnt>=countToWin) return true;
  80. return false;
  81. }
  82. int QTicTacToeGame::getPlayer(int x, int y)
  83. {
  84. Q_ASSERT(x>=0&&y>=0&&x<size&&y<size);
  85. return board[x][y];
  86. }
  87. int QTicTacToeGame::getSize()
  88. {
  89. return size;
  90. }