C++实战–QT实现五子棋
- 效果
更多效果
小破站
- 框架
在基类Board中实现单机的五子棋,在继承其的子类Tcp_Board中添加网络通信的部分。Board或者Tcp_Board作为MainWindow的一个子窗口。
- board.h
#ifndef BOARD_H
#define BOARD_H
#include <QWidget>
#include <vector>
class Board : public QWidget
{
Q_OBJECT
public:
explicit Board(QWidget *parent = nullptr);
//棋盘尺寸
int row;
int col;
int d;
//轮到谁
bool black_turn;
//有人胜出
bool b_win;
virtual void newgame();//开启新游戏
std::vector<std::vector<int>> _board;//0代表空格,1代表黑棋,2代表白棋
virtual void click(int row_stone,int col_stone);//点击事件需要的处理函数
bool hasWon(bool is_black,int row_stone,int col_stone);
private:
void paintEvent(QPaintEvent *) override;
void drawGrid(QPainter* painter);//画网格
virtual void mousePressEvent(QMouseEvent *event) override;
void drawStones(QPainter* painter);//刷新棋子布局
void drawStone(QPainter* painter,int row,int col,bool isblack);//画一个棋子,由drawStones()调用
signals:
void win(bool isblack);//有人胜出
public slots:
virtual void won(bool isblack);//有人胜出处理函数
};
#endif // BOARD_H
- tcp_board.h
#ifndef TCP_BOARD_H
#define TCP_BOARD_H
#include "board.h"
#include <QTcpServer>
#include <QTcpSocket>
class Tcp_Board : public Board//继承自Board
{
Q_OBJECT
public:
Tcp_Board();
void click(int row_stone,int col_stone) override;
void newgame() override;
bool is_server;//server 是黑方
bool is_winner;//是否胜方
private:
QTcpServer* server;
QTcpSocket* socket;
private slots:
void slot_NewConnection();
void slot_ReadyRead();
void won(bool isblack) override;
signals:
void turn_changed(bool black_turn);
};
#endif // TCP_BOARD_H
- mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "board.h"
#include "tcp_board.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked();
void change_turn(bool black_turn);//改变提示信息等
void won(bool is_black);//连接Board的win(bool)信号
private:
Ui::MainWindow *ui;
Board* board;
Tcp_Board* tcp_board;
};
#endif // MAINWINDOW_H
- 源码
源码