mainwindow.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include<QtDebug>
  4. MainWindow::MainWindow(QWidget *parent)
  5. : QMainWindow(parent)
  6. , ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. InitUI();
  10. }
  11. MainWindow::~MainWindow()
  12. {
  13. delete ui;
  14. }
  15. void MainWindow::InitUI()
  16. {
  17. //定义期盼的大小
  18. this->resize((::CHESS_C + 1) * ::MAX_X, (::CHESS_R + 1) * ::MAX_Y);
  19. //锁定边框大小
  20. this->setMaximumSize((::CHESS_C + 1) * ::MAX_X, (::CHESS_R + 1) * ::MAX_Y);
  21. this->setMinimumSize((::CHESS_C + 1) * ::MAX_X, (::CHESS_R + 1) * ::MAX_Y);
  22. this->setWindowTitle("五子棋小游戏-逝水无痕");
  23. b_black = false;
  24. }
  25. void MainWindow::paintEvent(QPaintEvent *event)
  26. {
  27. DraChessBoard();
  28. DrawHandChess();
  29. DrawChessItem();
  30. //强制更新界面
  31. update();
  32. }
  33. //画棋盘
  34. void MainWindow::DraChessBoard()
  35. {
  36. //绘图工具
  37. QPainter painter(this);
  38. //防止棋盘变形
  39. painter.setRenderHint(QPainter::Antialiasing,true);
  40. //给边框线颜色和大小
  41. painter.setPen(QPen(QColor(Qt::black),2));
  42. //给棋盘格子颜色
  43. painter.setBrush(Qt::yellow);
  44. //便利回执期盼的所有的格子
  45. for (int i=0;i<::CHESS_C; i++ ) {
  46. for (int j=0;j<::CHESS_R; j++ ) {
  47. //绘制矩形(棋盘的格子)
  48. painter.drawRect((i+0.5) * ::MAX_X,(j+0.5)* ::MAX_Y,::MAX_X,::MAX_Y);
  49. }
  50. }
  51. }
  52. //画鼠标上的棋子
  53. void MainWindow::DrawHandChess()
  54. {
  55. QPainter painter(this);
  56. //给棋子边框绘制透明
  57. painter.setPen(QPen(QColor(Qt::transparent)));
  58. if(b_black)
  59. {
  60. painter.setBrush(Qt::black);
  61. }else
  62. {
  63. painter.setBrush(Qt::white);
  64. }
  65. //绘制
  66. painter.drawEllipse(mapFromGlobal(QCursor::pos()),::MAX_X/2,MAX_Y/2);
  67. }
  68. //处理棋子位置
  69. void MainWindow::DrawChessAtPoint(QPainter &painter,QPoint &point)
  70. {
  71. //获取棋子的摆放位置
  72. QPoint ptCenter((point.x()+0.5)*::MAX_X,(point.y()+0.5)*::MAX_Y);
  73. painter.drawEllipse(ptCenter,::MAX_X/2,::MAX_Y/2);
  74. }
  75. //判断五子是否连接
  76. int MainWindow::CountNearItem(ChessItem item,QPoint pt)
  77. {
  78. int nCount = 0;
  79. item._pt+=pt;
  80. bool flag = true;
  81. while(flag)
  82. {
  83. int m = nCount;
  84. for (int i =0;i < p_ChessItem.size() ;i++ )
  85. {
  86. if(p_ChessItem[i] == item){
  87. nCount++;
  88. item._pt += pt;
  89. }
  90. }
  91. if(m == nCount){
  92. flag = false;
  93. }
  94. }
  95. return nCount;
  96. }
  97. //点击事件
  98. void MainWindow::mousePressEvent(QMouseEvent *event)
  99. {
  100. //获取鼠标点击的位置d
  101. qDebug()<<event->pos()<<"\n";
  102. //定义点位
  103. QPoint pt;
  104. pt.setX((event->pos().x())/::MAX_X);
  105. pt.setY((event->pos().y())/::MAX_Y);
  106. //判断棋子是否存在
  107. for (int i =0;i < p_ChessItem.size() ;i++ )
  108. {
  109. //获取当前棋子样式赋值
  110. ChessItem item = p_ChessItem[i];
  111. if(item._pt == pt){
  112. return;
  113. }
  114. }
  115. //不存在则绘制并判断五子是否连接
  116. ChessItem item(pt,b_black);
  117. p_ChessItem.append(item);
  118. //统计四个点位是否连接
  119. int nLeft = CountNearItem(item,QPoint(-1,0));
  120. int nLeftUp = CountNearItem(item,QPoint(-1,-1));
  121. int nLeftDown = CountNearItem(item,QPoint(-1,1));
  122. int nUp = CountNearItem(item,QPoint(0,-1));
  123. int nDown = CountNearItem(item,QPoint(0,1));
  124. int nRight = CountNearItem(item,QPoint(1,0));
  125. int nRightUp = CountNearItem(item,QPoint(1,-1));
  126. int nRightDown = CountNearItem(item,QPoint(1,1));
  127. if(nLeft+nRight >= 4 ||
  128. nLeftUp + nRightDown >= 4 ||
  129. nUp +nDown >= 4 ||
  130. nRightUp + nLeftDown >= 4)
  131. {
  132. QString str = b_black?"Black win":"Wihte win";
  133. QMessageBox::information(NULL,"GAME OVER",str,QMessageBox::Yes);
  134. p_ChessItem.clear();
  135. return;
  136. }
  137. //设置颜色取反
  138. b_black = !b_black;
  139. }
  140. void MainWindow::DrawChessItem()
  141. {
  142. QPainter painter(this);
  143. //给棋子边框绘制透明
  144. painter.setPen(QPen(QColor(Qt::transparent)));
  145. // painter.setBrush(Qt::black);
  146. // //绘制
  147. // painter.drawEllipse(65,65,::MAX_X,::MAX_Y);
  148. for (int i =0;i < p_ChessItem.size() ;i++ )
  149. {
  150. //获取当前棋子样式赋值
  151. ChessItem item = p_ChessItem[i];
  152. if(item._black)
  153. {
  154. painter.setBrush(Qt::black);
  155. }else
  156. {
  157. painter.setBrush(Qt::white);
  158. }
  159. DrawChessAtPoint(painter,item._pt);
  160. }
  161. }