当前位置:   article > 正文

Qt五子棋_qt五子棋代码

qt五子棋代码

功能演示:

整体思路:

!!!!!!(只讲大概实现,源码最后会给,代码段只是一些伪代码)

1.画棋盘

1.1确定画板大小

  1. #define ROW 15 //行
  2. #define COL 15 //列
  3. #define xsize 80
  4. #define ysize 80
  5. //handchess_color用于之后颜色变化
  6. void MainWindow::InitUI()
  7. {
  8. QFont font;
  9. this->resize((ROW+7)*xsize,(COL+1)*ysize);//绘制画板大小
  10. this->setFixedSize((ROW+7)*xsize,(COL+1)*ysize);//固定了画板大小
  11. this->setWindowTitle("Qtchess");
  12. handchess_color = false; // false -> 黑色 true -> 白色
  13. }

1.2在画板上画棋盘

格子x的边界距离为0.5个xsize,y的边界距离为0.5yszie

棋盘长为ROW * xsize

       宽为COL * ysize

  1. void MainWindow::drawchessboard()
  2. {
  3. QPainter painter(this);//创建画家对象
  4. painter.setPen(QPen(QColor(Qt::black),4));//给边框线颜色和大小
  5. painter.setBrush(Qt::gray);//给其他格子颜色
  6. for(int i = 0;i < COL;i++)
  7. for(int j = 0;j < ROW;j++)
  8. painter.drawRect((0.5+i)*xsize,(0.5+j)*ysize,xsize,ysize);//绘制棋盘
  9. }

2.画跟随在鼠标棋子

  1. void MainWindow::drawhandchess()
  2. {
  3. QPainter painter(this);
  4. painter.setPen(QPen(QColor(Qt::transparent)));//给棋子边框设置透明
  5. if(handchess_color == true)
  6. painter.setBrush(Qt::white);
  7. else
  8. painter.setBrush(Qt::black);
  9. //获得鼠标单击点的全局位置,长度,宽度
  10. painter.drawEllipse(mapFromGlobal(QCursor::pos()),xsize/2,ysize/2);

3.显示上面的棋盘与跟随在鼠标上的棋子

利用绘画事件painterEvent与update()

  1. void MainWindow::paintEvent(QPaintEvent *)
  2. {
  3. drawchessboard();
  4. drawhandchess();
  5. drawchessitem();
  6. update();//会触发paintEvent事件
  7. }

4.画棋盘上的棋子

4.1定义一个棋子的类

chessitem.h与chessitem.c

需要给定棋子颜色与位置

  1. //chessitem.h
  2. #ifndef CHESSITEM_H
  3. #define CHESSITEM_H
  4. #include <QPoint>
  5. class ChessItem
  6. {
  7. public:
  8. ChessItem();
  9. ChessItem(QPoint point,bool iscolor);//构造函数 -- 完成对象的初始化
  10. //重载运算符 用于比较 位置,颜色
  11. bool operator==(const ChessItem &t1)const
  12. {
  13. return ((_pt == t1._pt) && (_color == t1._color));
  14. }
  15. QPoint _pt;//棋子位置
  16. bool _color;//棋子颜色
  17. };
  18. #endif // CHESSITEM_H
  19. //chessitem.c
  20. #include "chessitem.h"
  21. ChessItem::ChessItem()
  22. {
  23. }
  24. ChessItem::ChessItem(QPoint point,bool iscolor)
  25. {
  26. _pt = point;
  27. _color = iscolor;
  28. }

4.2利用鼠事件记录棋子数据

如果按下位置有棋子 return; 否则用Qvector记录下来

  1. //QVector<ChessItem> p_chessItem;定义棋子集合
  2. void MainWindow::mousePressEvent(QMouseEvent *event)
  3. {
  4. QPoint pt;
  5. if(event->pos().x()/xsize >= 16)
  6. return;
  7. pt.setX(event->pos().x()/xsize);
  8. pt.setY(event->pos().y()/ysize);
  9. qDebug()<<"x:"<<event->pos().x()/xsize<<"y:"<<event->pos().y()/ysize<<' ';
  10. for(int i = 0;i <p_chessItem.size();i++)
  11. {
  12. ChessItem item = p_chessItem[i];
  13. if(item._pt == pt)
  14. return;
  15. }
  16. ChessItem item(pt,handchess_color);
  17. p_chessItem.append(item);//添加元素
  18. }

4.3按下棋子实现函数

  1. //在棋盘上形成棋子
  2. void MainWindow::drawchessitem()
  3. {
  4. QPainter painter(this);
  5. painter.setPen(QPen(QColor(Qt::transparent)));
  6. for(int i = 0;i < p_chessItem.size();i++)
  7. {
  8. ChessItem item = p_chessItem[i];
  9. if(item._color == true)
  10. {
  11. painter.setBrush(Qt::white);
  12. }
  13. else
  14. {
  15. painter.setBrush(Qt::black);
  16. }
  17. drawchessplace(painter,item._pt);
  18. }
  19. }
  20. void MainWindow::drawchessplace(QPainter &painter, QPoint &point)
  21. {
  22. QPoint ptCenter((point.x() + 0.5) * xsize,(point.y() + 0.5) * ysize);
  23. painter.drawEllipse(ptCenter,xsize/2,ysize/2);
  24. }

4.4检查是否五子连线

  1. int left = checkchess(item,QPoint(-1,0));
  2. int right = checkchess(item,QPoint(1,0));
  3. int leftup = checkchess(item,QPoint(-1,-1));
  4. int rightup = checkchess(item,QPoint(1,-1));
  5. int leftdown = checkchess(item,QPoint(-1,1));
  6. int rightdown = checkchess(item,QPoint(1,1));
  7. int up = checkchess(item,QPoint(0,-1));
  8. int down = checkchess(item,QPoint(0,1));
  9. if((left + right)>= 4 || (up + down)>=4 ||(leftup+rightdown)>=4 || (leftdown+rightup)>=4)
  10. {
  11. QString str = handchess_color ?"White victory!" : "Black victory";
  12. QMessageBox::information(NULL,"Game Over",str,QMessageBox::Yes);
  13. p_chessItem.clear();
  14. }
  15. handchess_color = !handchess_color;
  1. int MainWindow::checkchess(ChessItem item,QPoint pt)
  2. {
  3. int count = 0;
  4. item._pt += pt;
  5. //contains() -> This function requires the value type to have an implementation of operator==().
  6. while(p_chessItem.contains(item))
  7. {
  8. count++;
  9. item._pt+=pt;
  10. }
  11. return count;
  12. }

5.悔棋功能

利用一个Button去实现

  1. font.setPointSize(20);
  2. button = new QPushButton("悔棋",this);
  3. button->setFont(font);
  4. button->move((ROW+1)*xsize,13.5*ysize);
  5. button->resize(5.5*xsize,2.0*ysize);
  6. connect(button,SIGNAL(clicked(void)),this,SLOT(chessback()));
  7. //悔棋功能:
  8. void MainWindow::chessback()
  9. {
  10. if(!p_chessItem.empty())
  11. {
  12. QPainter painter(this);
  13. ChessItem item = p_chessItem[p_chessItem.size()-1];
  14. qDebug() << item._pt << ' ';
  15. p_chessItem.pop_back();
  16. }
  17. else
  18. qDebug()<<"empty";
  19. }

 6.总结

1.棋子棋盘显示都是通过paintEvent()去显示,鼠标按下容器记录下数据再paintEvent()中drawchessitem()去显示。

2.不懂函数可以通过F1打开Qt assitant查看或上网搜搜。个人不展开说,主要体会思路

7.源码

链接:https://pan.baidu.com/s/1N69Ic5mA6Q9kSRayIMBQ9Q?pwd=y259 
提取码:y259

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号