#include "netgame.h"
#include "ui_netgame.h"
#include <QDebug>
NetGame::NetGame(QWidget *parent) :
QWidget(parent),
ui(new Ui::NetGame)
{
ui->setupUi(this);
boundaryWidth=4; //设置触发resize的宽度
setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint); // 设置无边框
// 初始化 TCP 连接
clientSocket = new QTcpSocket(this);
}
NetGame::~NetGame()
{
delete ui;
}
void NetGame::InitWidget()
{
ui->msgRecord->append("服务器未连接");
// 设置黑白棋子lable可见性
ui->white_label->setVisible(false);
ui->black_label->setVisible(false);
connect(ui->netboard,&NetBoard::SetPieceToHost,this,&NetGame::SetPieceOnHost);
connect(ui->netboard,&NetBoard::SendGameOverToHost,this,&NetGame::SendGameOverOnHost);
connect(ui->netboard,&NetBoard::GameOver,this,&NetGame::GameOver);
connect(ui->undoBtn,&QPushButton::clicked,this,&NetGame::OnUndoBtnClick);
connect(ui->sendBtn,&QPushButton::clicked,this,&NetGame::OnSentBtnClick);
connect(ui->surrenderBtn,&QPushButton::clicked,this,&NetGame::OnSurrenderBtnClick);
connect(ui->tieBtn,&QPushButton::clicked,this,&NetGame::OnTieBtnClick);
connect(ui->closeBtn,&QPushButton::clicked,this,[=]()
{
emit(ReturnToMenu());
});
}
void NetGame::InitGame()
{
InitSocket();
InitWidget();
ui->netboard->StartNewGame();
}
void NetGame::InitSocket()
{
clientSocket->abort();
connect(clientSocket,&QTcpSocket::connected,this,&NetGame::doConnected);
connect(clientSocket,&QTcpSocket::disconnected,this,&NetGame::doDisconnected);
connect(clientSocket,&QTcpSocket::readyRead,this,&NetGame::ReceiveHandler);
clientSocket->connectToHost(HOST,PORT);
}
void NetGame::GameOver(int winner) // 游戏结束相关事件
{
if(winner != DRAW) // 若接收到非和棋信号
{
QString playerName = (winner == BLACK_PLAYER) ? "黑方" : "白方";
QMessageBox::information(this, "提示", tr("游戏结束,恭喜%1获胜!!").arg(playerName), QMessageBox::Ok);
emit(ReturnToMenu());
}
else
{
QMessageBox::information(this, "提示", "游戏结束,双方和棋!", QMessageBox::Ok);
emit(ReturnToMenu());
}
}
void NetGame::doConnected() // 服务器连接
{
data.dataType = CONNECT;
ui->msgRecord->clear();
ui->msgRecord->append("服务器已连接");
DataToString(dataPacket,data);
clientSocket->write(dataPacket.c_str());
}
void NetGame::doDisconnected() // 服务器断开
{
ui->msgRecord->append("服务器已断开");
}
void NetGame::ReceiveHandler() // 消息处理器
{
QByteArray buffer;
buffer = clientSocket->readAll();
BufferClear(dataPacket);
dataPacket = buffer.data(); // 将buffer中接收到的数据转换为String数据格式
if(!buffer.isEmpty())
{
StringToData(dataPacket,data); // 将String数据包转换为Data格式
switch(data.dataType)
{
case CONNECT_SUCCESS: // 连接成功
{
player = data.piece_color;
QString str = (player == BLACK_PLAYER) ? "黑方":"白方";
str += "已准备";
ui->msgRecord->append(str.toUtf8());
if(player == BLACK_PLAYER)
ui->black_label->setVisible(true);
else
ui->white_label->setVisible(true);
// 棋盘设置服务器分配的棋子
ui->netboard->player = player;
QSet<int> boardReceivePlayers;
boardReceivePlayers << player;
ui->netboard->SetBoardReceivePlayer(boardReceivePlayers);
ui->netboard->StartNewGame();
break;
}
case SETPIECE: // 落子
{
int x = data.piece_x;
int y = data.piece_y;
ui->netboard->dropedPieces.push(QPoint(x, y));
ui->netboard->board[x][y] = (data.piece_color == BLACK_PIECE) ? BLACK_PIECE : WHITE_PIECE;
ui->netboard->update();
ui->netboard->CheckWinner(); // 胜负判断
if (!ui->netboard->isGameOver)
{
ui->netboard->SwitchNextPlayer();
}
break;
}
case UNDO: // 悔棋
{
int command = std::stoi(data.temp); // 获取 UNDO 的分级指令
switch (command)
{
case UNDO_REQUEST:
{
int id = QMessageBox::information(NULL,"提示","对方请求悔棋!",QString("同意"),QString("拒绝"),0);
switch (id) {
case 0: // 同意:向服务端发送同意数据包
{
data.temp = std::to_string(UNDO_YES);
data.piece_color = player;
DataToString(dataPacket,data);
clientSocket->write(dataPacket.c_str());
break;
}
case 1: // 拒绝:向服务端发送拒绝数据包
{
data.temp = std::to_string(UNDO_NO);
data.piece_color = player;
DataToString(dataPacket,data);
clientSocket->write(dataPacket.c_str());
break;
}
default:
break;
}
break;
}
case UNDO_YES:
{
QString str = (data.piece_color == BLACK_PLAYER) ? "黑方":"白方";
str += "同意悔棋";
ui->msgRecord->append(str);
ui->netboard->Undo(HUMUN_MODE);
break;
}
case UNDO_NO:
{
QString str = (data.piece_color == BLACK_PLAYER) ? "黑方":"白方";
str += "拒绝悔棋";
ui->msgRecord->append(str);
break;
}
default:
break;
}
break;
}
case CONNECTIONS: // 显示当前连接人数
{
num = QString::fromStdString(data.temp);
ui->connections->setText(num);
break;
}
case MESSAGE: // 聊天数据包
{
int color = data.piece_color;
QString str = (color == BLACK_PLAYER) ? "黑方: ":"白方: ";
str += QString::fromStdString(data.temp);
ui->msgRecord->append(str.toUtf8()); // 显示在消息记录中
break;
}
case SURRENDER: // 投降数据包
{
QString playerName = (data.piece_color == BLACK_PLAYER) ? "黑方" : "白方";
QMessageBox::information(this, "游戏结束", tr("%1已认输!").arg(playerName), QMessageBox::Ok);
emit(ReturnToMenu());
break;
}
case TIE: // 求和数据包
{
int command = std::stoi(data.temp); // 获取 TIE(求和) 的分级指令
switch (command)
{
case TIE_REQUEST: // 对方请求和棋
{
int id = QMessageBox::information(NULL,"提示","对方请求和棋!",QString("同意"),QString("拒绝"),0);
switch (id) {
case 0: // 同意:向服务端发送同意数据包
{
data.temp = std::to_string(TIE_YES);
data.piece_color = player;
DataToString(dataPacket,data);
clientSocket->write(dataPacket.c_str());
break;
}
case 1: // 拒绝:向服务端发送拒绝数据包
{
没有合适的资源?快使用搜索试试~ 我知道了~
一个基于 QT 开发的联机五子棋.zip
共41个文件
png:12个
cpp:10个
h:10个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 192 浏览量
2024-04-26
17:03:08
上传
评论
收藏 554KB ZIP 举报
温馨提示
基于QT的系统
资源推荐
资源详情
资源评论
收起资源包目录
一个基于 QT 开发的联机五子棋.zip (41个子文件)
Gobang-main
GobangClient
netboard.cpp 10KB
netgame.h 3KB
command.h 1KB
netgame.cpp 14KB
netchessboard.cpp 70B
netboard.ui 800B
Gobang.pro 1KB
main.cpp 199B
picture.qrc 533B
netgame.ui 8KB
menu.h 1KB
img
cover.png 323KB
undo.png 14KB
surrender.png 15KB
aigame.png 31KB
name.png 42KB
min.png 2KB
close.png 3KB
white.png 3KB
tie.png 13KB
icon.ico 162KB
netgame.png 38KB
black.png 3KB
localgame.png 33KB
gameai.h 1KB
chessboard.ui 849B
gamecontrol.h 2KB
gamecontrol.cpp 7KB
gamecontrol.ui 7KB
menu.ui 5KB
netboard.h 4KB
chessboard.cpp 9KB
gameai.cpp 3KB
Gobang.pro.user 43KB
menu.cpp 3KB
chessboard.h 3KB
GobangServer
command.h 1KB
locker.h 1KB
main.cpp 129B
gobangserver.cpp 11KB
gobangserver.h 2KB
共 41 条
- 1
资源评论
我慢慢地也过来了
- 粉丝: 6702
- 资源: 4002
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功