谈udp fivechess

white chess

http://www.cnblogs.com/tornadomeet/archive/2012/06/28/2568634.html

#include "chessboard.h"
#include "pieces.h"
#include <QtGui>
#include <math.h>
 
chessboard::chessboard(QWidget *parent)
    : QWidget(parent)
{
    resize(640,480);
    setWindowTitle(tr("五子棋  白棋"));
    color=true;
    blackchessed = false;
    connect(this,SIGNAL(click()),this,SLOT(judge()));
 
    winbLabel=new QLabel(this);
    winwLabel=new QLabel(this);
    winbLabel->setGeometry(500,120,100,30);
    winwLabel->setGeometry(500,210,100,30);
 
    QLabel *blackLabel=new QLabel(this);
    QLabel *whiteLabel=new QLabel(this);
    whoseturnLabel=new QLabel(this);
    whoseturnLabel->setGeometry(460,50,111,28);
    blackLabel->setGeometry(460,120,28,28);
    whiteLabel->setGeometry(460,210,28,28);
    whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
    QPixmap pixb(":/img/black.png");
    QPixmap pixw(":/img/white.png");
    blackLabel->setPixmap(pixb);
    whiteLabel->setPixmap(pixw);
 
    QCommandLinkButton *regret = new QCommandLinkButton(this);
//    regret->setGeometry(480,250,80,48);
//    regret->setText(tr("悔棋"));
    regret->setGeometry(480,250,120,48);
    regret->setText(tr("重新开始"));
    regret->setDefault(true);
 
 
    QCommandLinkButton *regret1 = new QCommandLinkButton(this);
    regret1->setGeometry(480,300,80,48);
    // regret->setGeometry(480,250,120,48);
    regret1->setText(tr("悔棋"));
    regret1->setDefault(true);
 
 
    sender = new QUdpSocket(this);
    receiver = new QUdpSocket(this);
   // receiver->bind(45454,QUdpSocket::ShareAddress);  //白棋
        receiver->bind(45454,QUdpSocket::ShareAddress);  //白棋 黑棋给白棋发数据的时候必须用白棋这个端口才能找到这个应用
    connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
 
    connect(regret,SIGNAL(clicked()),this,SLOT(on_regret_clicked()));
        connect(regret1,SIGNAL(clicked()),this,SLOT(on_regret1_clicked())); //悔棋
}
 
chessboard::~chessboard(){}
 
void chessboard::processPendingDatagram() //处理等待的数据报
{
    while(receiver->hasPendingDatagrams())  //拥有等待的数据报
    {
        QByteArray datagram; //拥于存放接收的数据报
        datagram.resize(receiver->pendingDatagramSize()); //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
        receiver->readDatagram(datagram.data(),datagram.size()); //接收数据报,将其存放到datagram中
        qDebug()<<datagram;
        if(datagram == "button")
        {
            regret();
        }
        else if(datagram == "abc")
        {
            regretclean();
        }
        else if(datagram == "abc1")
        {
            regretclean1();
        }
        else if(datagram == "button1")
        {
            regret1();
        }
        else
        {
        //把QByteArray转换成qstring
        QString string;
        string = QString(datagram);
        //把qstring转换成int
        int data;
        data=string.toInt();
        //解压缩数据
        int i,j;
 
            i = data/100;
            j = data%100;
            p=new pieces(pieces::black,i,j);
 
            blackchessed = true;
            list.append(p);
            p->setParent(this);
            p->show();
            whoseturnLabel->setText(QObject::tr("<h1>请白棋下!</h1>"));
            blackchessed = true;
            emit click();
        }
    }
}
/*画棋盘 */
void chessboard::paintEvent(QPaintEvent *e){
    QPainter paint(this);
    QPixmap pixbg(":/img/123123.jpg");       //设置背景图片
    paint.drawPixmap(0,0,pixbg);
    paint.drawRect(30,30,420,420);        //画外框
    for(int i=0;i<13;i++)                 //画横线
        paint.drawLine(30,i*30+60,450,i*30+60);
    for(int i=0;i<13;i++)                  //换竖线
        paint.drawLine(i*30+60,30,i*30+60,450);
 
 
}
/*下棋*/
void chessboard::mousePressEvent(QMouseEvent *e){
    int count;
    for(int i=0;i<15;i++)
        for(int j=0;j<15;j++)
        {
            for(count=0;count<list.size();count++)
            {
                if(list.at(count)->getX()==i&&list.at(count)->getY()==j)
                {
                    m=i;
                    n=j;
                    c=count;
                    break;
                }
            }
            if(sqrt(pow(30+j*30-e->x(),2)+pow(30+i*30-e->y(),2))<=13&&count==list.size())
            {
                //画棋子之前先判断对方(黑棋)有没有下
                if(blackchessed)
                {
                //压缩需要发送的信息
 
                int temp;
                char compress[4];
                temp= j%10 + (j/10)*10 + (i%10)*100 +(i/10)*1000 ;//+col
                sprintf(compress,"%d",temp);
 
                //udp发送
                QByteArray datagram = QByteArray(compress);
                sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                        45450);
                     p=new pieces(pieces::white,i,j);
                    list.append(p);
                    p->setParent(this);
                    p->show();
                    whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
                    blackchessed = false;
                }
                else
                    return;
 
           }
        }
    emit click();
}
/*判断是否五子相连*/
void chessboard::judge(){
    for(int i=0;i<5;i++){      //判断左右
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getX()-i+j)==list.at(count)->getX()&&p->getY()==list.at(count)->getY()
                    &&p->getColor()==list.at(count)->getColor())
                    n++;
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
 
    for(int i=0;i<5;i++){        //判断上下
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getY()-i+j)==list.at(count)->getY()&&p->getX()==list.at(count)->getX()
                    &&p->getColor()==list.at(count)->getColor())
                    n++;
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
 
    for(int i=0;i<5;i++){   //判断左上右下
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()-i+j)==list.at(count)->getX()
                    &&p->getColor()==list.at(count)->getColor())
                    n++;
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
 
    for(int i=0;i<5;i++){   //判断右上左下
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()+i-j)==list.at(count)->getX()
                    &&p->getColor()==list.at(count)->getColor()){
                    n++;
                }
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
}
 
 
void chessboard::win(int c){
    if(c==pieces::black){
        winbLabel->setText(tr("<h1>黑棋赢了!</h1>"));
    }
    else
        winwLabel->setText(tr("<h1>白棋赢了!</h1>"));
}
/*重新开局 */
void chessboard::reset()
{ int a;
    if(p->getColor()==pieces::black){
        //int a=QMessageBox::information(this,tr("提示"),tr("是否再来一盘?"),QMessageBox::Ok);//,QMessageBox::Cancel
       a=QMessageBox::information(this,tr("提示"),tr("黑棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
    }
    else
          a=QMessageBox::information(this,tr("提示"),tr("白棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
 
//    int a=QMessageBox::information(this,tr("提示"),tr("是否再来一盘?"),QMessageBox::Ok);//,QMessageBox::Cancel
    if(a==QMessageBox::Ok)
    {
        for(int i=0;i<list.size();i++){
            list.at(i)->close();
        }
        list.clear();
        winbLabel->setText(tr(""));
        winwLabel->setText(tr(""));
        color=true;
    }
}
//悔棋
void chessboard::on_regret_clicked()
{
    char regretbutton[7]="button";
    //udp发送
    QByteArray datagram = QByteArray(regretbutton);
    sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                            45450); //白棋的端口都是
}
//悔棋的窗口
void chessboard::regret()
{
    int a=QMessageBox::information(this, tr("注意"),
                                   tr("对方选择重新开始,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
    if(a==QMessageBox::Ok)
    {
        char compress[4]="abc";
        //udp发送
        QByteArray datagram = QByteArray(compress);
        sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                45450);
 
        for(int i=0;i<list.size();i++)
        {
            list.at(i)->close();
        }
        list.clear();
        winbLabel->setText(tr(""));
        winwLabel->setText(tr(""));
        color=false;
    }
}
//悔棋后重开始
void chessboard::regretclean()
{
    for(int i=0;i<list.size();i++)
    {
        list.at(i)->close();
    }
    list.clear();
    winbLabel->setText(tr(""));
    winwLabel->setText(tr(""));
    color=false;
}
 
 
 
 
 
 
 
悔棋按钮
//  void chessboard::on_regret1_clicked()
//   {
//      char regretbutton[8]="button1";
//      //udp发送
//      QByteArray datagram = QByteArray(regretbutton);
//      sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
//                              45450);
 
//}
 
悔棋的窗口
//void chessboard::regret1()
//{
//    int a=QMessageBox::information(this, tr("注意"),
//                                   tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
//    if(a==QMessageBox::Ok)
//    {
//        //udp发送
//        char compress[4]="abc";
//        QByteArray datagram = QByteArray(compress); //数据包
//        sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
//                                45454);
 
 
 
            list.at(c+1)->close();
 
        list.clear();
 
//        list.at(c+1)->close();//删除刚才下的第c号棋子
//        list.clear();
 
//        winbLabel->setText(tr(""));
//        winwLabel->setText(tr(""));
//        color=true;
//    }
//}
对方点击ok,悔棋后重开始
//       void chessboard::regretclean1()
//     {
       list.at(c+1)->close();//删除刚才下的第c号棋子
 
    list.clear();
//    list.at(c+1)->close();//删除刚才下的第c号棋子
//    list.clear();
//    winbLabel->setText(tr(""));
//    winwLabel->setText(tr(""));
//    color=false;
//}
 
 
 
 
//悔棋按钮
  void chessboard::on_regret1_clicked()
   {
      char regretbutton[8]="button1";
      //udp发送
      QByteArray datagram = QByteArray(regretbutton);
      sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                              45450);
 
}
 
//悔棋的窗口
void chessboard::regret1()
{
    int a=QMessageBox::information(this, tr("注意"),
                                   tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
    if(a==QMessageBox::Ok)
    {
        //udp发送
        char compress[4]="abc";
        QByteArray datagram = QByteArray(compress); //数据包
        sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                45454);
 
 
 
//            list.at(c+1)->close();
 
//        list.clear();
 
        list.at(c+1)->close();//删除刚才下的第c号棋子
        list.clear();
 
        winbLabel->setText(tr(""));
        winwLabel->setText(tr(""));
        color=true;
    }
}
//对方点击ok,悔棋后重开始
       void chessboard::regretclean1()
     {
//       list.at(c+1)->close();//删除刚才下的第c号棋子
 
//    list.clear();
    list.at(c+1)->close();//删除刚才下的第c号棋子
    list.clear();
    winbLabel->setText(tr(""));
    winwLabel->setText(tr(""));
    color=false;
}
 
 
 
 
 
 
 
 
//  //悔棋按钮
//    void chessboard::on_regret1_clicked()
//     {
//       char regretbutton[8]="button1";// '/0'结束符占一位
//      //udp发送
//      QByteArray datagram = QByteArray(regretbutton);
//      sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
//                              45450);
 
//  }
 
//  //悔棋的窗口
//  void chessboard::regret1()
//  {
//      int a=QMessageBox::information(this, tr("注意"),
//                                     tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
//      if(a==QMessageBox::Ok)
//      {
          //udp发送
          char compress[4]="abc";
          QByteArray datagram = QByteArray(compress); //数据包
          sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
 
                                45450);
 
 
          list.at(c)->close();//删除刚才下的第c号棋子
      //list.at(c-1)->close();//删除刚才下的第c号棋子
       list.clear();
 
          winbLabel->setText(tr(""));
          winwLabel->setText(tr(""));
          color=true;
 
 
//          //udp发送
//          char compress1[5]="abc1";
//          QByteArray datagram1 = QByteArray(compress1); //数据包
//          sender->writeDatagram(datagram1.data(),datagram1.size(),QHostAddress::Broadcast,
//                                  45454);
 
 
          char compress1[4]="abc";
          QByteArray datagram1 = QByteArray(compress1); //数据包
          sender->writeDatagram(datagram1.data(),datagram1.size(),QHostAddress::Broadcast,
                                  45454);
 
 
 
//          list.at(c)->close();//删除刚才下的第c号棋子
//      //list.at(c-1)->close();//删除刚才下的第c号棋子
//       list.clear();
 
//          winbLabel->setText(tr(""));
//          winwLabel->setText(tr(""));
//          color=true;
//      }
 
 
 
//  }
 
//  //对方点击ok,悔棋后重开始
//         void chessboard::regretclean1()
//       {
         list.at(c+1)->close();//删除刚才下的第c号棋子
     //list.at(c-1)->close();//删除刚才下的第c号棋子
      list.clear();
//      list.at(c)->close();//删除刚才下的第c号棋子
//  //list.at(c-1)->close();//删除刚才下的第c号棋子
//   list.clear();
//      winbLabel->setText(tr(""));
//      winwLabel->setText(tr(""));
//      color=false;
 
//         }
 
 

black chess


//参考:http://www.cnblogs.com/tornadomeet/archive/2012/06/28/2568634.html
#include "chessboard.h"
#include "pieces.h"
#include <QtGui>
#include <math.h>
#include <QDebug>
//qt writedatagram 是udp协议
 
chessboard::chessboard(QWidget *parent)
 
    : QWidget(parent)
 
 {            //frame 对话框
                resize(640,480);
                setWindowTitle(tr("五子棋 黑棋"));
                color=true;
                whitechessed = true;
                connect(this,SIGNAL(click()),this,SLOT(judge()));
               //“谁赢了标签”
                winbLabel=new QLabel(this);
                winwLabel=new QLabel(this);
                winbLabel->setGeometry(500,120,100,30);
                winwLabel->setGeometry(500,210,100,30);
 
                QLabel *blackLabel=new QLabel(this);
                QLabel *whiteLabel=new QLabel(this);
                blackLabel->setGeometry(460,120,28,28);
                whiteLabel->setGeometry(460,210,28,28);
                QPixmap pixb(":/img/black.png");
                QPixmap pixw(":/img/white.png");
                blackLabel->setPixmap(pixb);   //加载图片
                whiteLabel->setPixmap(pixw);
 
                whoseturnLabel=new QLabel(this);
                whoseturnLabel->setGeometry(460,50,111,28); //请黑棋下的位置
               whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
 
 
                QCommandLinkButton *regret = new QCommandLinkButton(this);
               // regret->setGeometry(480,250,80,48);
                 regret->setGeometry(480,250,120,48);
                regret->setText(tr("重新开始"));
                regret->setDefault(true);
 
                QCommandLinkButton *regret1 = new QCommandLinkButton(this);
                regret1->setGeometry(480,300,80,48);
                // regret->setGeometry(480,250,120,48);
                regret1->setText(tr("悔棋"));
                regret1->setDefault(true);
 
 
                sender = new QUdpSocket(this); //联网关键
                receiver = new QUdpSocket(this);
                receiver->bind(45450,QUdpSocket::ShareAddress);//黑棋(本地方,自己方)的端口 黑棋是接听接受者  如果修改这个端口则白棋就喘不过来了
                connect(receiver,SIGNAL(readyRead()),this,SLOT(processPendingDatagram()));
 
                connect(regret,SIGNAL(clicked()),this,SLOT(on_regret_clicked()));
 
                connect(regret1,SIGNAL(clicked()),this,SLOT(on_regret1_clicked())); //悔棋
 }
 
chessboard::~chessboard(){}
/*画棋盘*/
void chessboard::paintEvent(QPaintEvent *e)
        {
                        QPainter paint(this);
                        QPixmap pixbg(":/img/321.png");       //设置背景图片
                        paint.drawPixmap(0,0,pixbg);
                        paint.drawRect(30,30,420,420);        //画外框
                        for(int i=0;i<13;i++)                 //画横线
                            paint.drawLine(30,i*30+60,450,i*30+60);
                        for(int i=0;i<13;i++)                  //换竖线
                            paint.drawLine(i*30+60,30,i*30+60,450);
 
 
          }
/**下棋**/
void chessboard::mousePressEvent(QMouseEvent *e)
      {
          int count;
          for(int i=0;i<15;i++)
                for(int j=0;j<15;j++)
                     {
                          for(count=0;count<list.size();count++)
                             {
                                     if(list.at(count)->getX()==i&&list.at(count)->getY()==j) //按下标的形式访问容器。得到刚下棋子的横纵坐标
                                        {
                                         c=count;
                                         m=i;
                                         n=j;
                                         break;
                                     }
                                }//每一个下过的棋子
                                if(sqrt(pow(30+j*30-e->x(),2)+pow(30+i*30-e->y(),2))<=13&&count==list.size())
                                      {
                                        //画棋子之前先判断对方(白棋)有没有下
                                         if(whitechessed)
                                                {
                                                     //压缩需要发送的信息
                                                          int temp;
                                                          char compress[4];
                                                          temp= j%10 + (j/10)*10 + (i%10)*100 +(i/10)*1000;// 个位 十位 。。
                                                          sprintf(compress,"%d",temp);//int 转换成 string
                                                      //udp发送
                                                           QByteArray datagram = QByteArray(compress);//字符串转为QByteArray
                                                           //一个udpSocket已经于一个端口bind在一起了,这里的data是out流中的data,最多可以传送8192个字节,但是建议不要超过
                                                              //512个字节,因为这样虽然可以传送成功,但是这些数据需要在ip层分组,QHostAddress::Broadcast是指发送数据的目的地址
                                                              //这里为本机所在地址的广播组内所有机器,即局域网广播发送
                                                           //发给白棋自己所下棋子的位置数据
                                                           sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                                                                    45454);//给45454白棋发送数据
                                                        //画黑棋子
                                                             {
                                                                   p=new pieces(pieces::black,i,j);
                                                              }
                                                                list.append(p);
                                                                p->setParent(this);
                                                                p->show();
                                                                whoseturnLabel->setText(QObject::tr("<h1>请白棋下!</h1>"));
                                                                whitechessed = false;
                                                 }
                                           else
                                           return;
                                         }
                               }
           emit click();//发射一个点击信号,判断输赢
          }
 
/*判断是否五子相连 */
  void chessboard::judge(){
         for(int i=0;i<5;i++){   //判断左右
             int n=0;
             for(int j=0;j<5;j++){
                 for(int count=0;count<list.size();count++)
                       if((p->getX()-i+j)==list.at(count)->getX()&&p->getY()==list.at(count)->getY()
                         &&p->getColor()==list.at(count)->getColor())
                         n++;
                        }
                           if(n==5){
                                       win(p->getColor());
                                      reset();
        }
    }
 
    for(int i=0;i<5;i++){   //判断上下
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getY()-i+j)==list.at(count)->getY()&&p->getX()==list.at(count)->getX()
                    &&p->getColor()==list.at(count)->getColor())
                    n++;
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
 
    for(int i=0;i<5;i++){   //判断左上右下
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()-i+j)==list.at(count)->getX()
                    &&p->getColor()==list.at(count)->getColor())
                    n++;
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
 
    for(int i=0;i<5;i++){   //判断右上左下
        int n=0;
        for(int j=0;j<5;j++){
            for(int count=0;count<list.size();count++)
                if((p->getY()-i+j)==list.at(count)->getY()&&(p->getX()+i-j)==list.at(count)->getX()
                    &&p->getColor()==list.at(count)->getColor()){
                    n++;
                }
        }
        if(n==5){
            win(p->getColor());
            reset();
        }
    }
}
 
void chessboard::win(int c){
    if(c==pieces::black){
        winbLabel->setText(tr("<h1>黑棋赢了!</h1>"));
    }
    else
        winwLabel->setText(tr("<h1>白棋赢了!</h1>"));
}
/*重新开局*/
void chessboard::reset(){
    int a;
    if(p->getColor()==pieces::black){
        //int a=QMessageBox::information(this,tr("提示"),tr("是否再来一盘?"),QMessageBox::Ok);//,QMessageBox::Cancel
       a=QMessageBox::information(this,tr("提示"),tr("黑棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
    }
    else
           a=QMessageBox::information(this,tr("提示"),tr("白棋赢!"),QMessageBox::Ok);//,QMessageBox::Cancel
 
 
    if(a==QMessageBox::Ok){
        for(int i=0;i<list.size();i++){
            list.at(i)->close();
        }//关闭列表
        list.clear();
        winbLabel->setText(tr(""));
        winwLabel->setText(tr(""));
        color=true;
    }
}
 
       //当对面出棋后这边画出来
void chessboard::processPendingDatagram()                               //处理等待的数据报
{
    while(receiver->hasPendingDatagrams())                                  //拥有等待的数据报
    {
        QByteArray datagram;                                                          //拥于存放接收的数据报
        datagram.resize(receiver->pendingDatagramSize());             //让datagram的大小为等待处理的数据报的大小,这样才能接收到完整的数据
        receiver->readDatagram(datagram.data(),datagram.size());   //接收数据报,将其存放到datagram中
 
        qDebug()<<datagram;
 
        if(datagram == "button")
        {
            regret();
        }
        else if(datagram == "abc")
        {
            regretclean();
        }
        else if(datagram == "abc1")
        {
            regretclean1();
        }
        else if  (datagram == "button1")//悔棋
        {
            regret1();
        }
        else
        {
        //把QByteArray转换成qstring  数据报是QByteArray形式
        QString string;
        string = QString(datagram);
        //把qstring转换成int
        int data;
        data=string.toInt();
 
         //解压缩数据
             int i,j;
             i = data/100;//得到前两位 也就是砍掉后两位
             j = data%100;//得到后两位
             p=new pieces(pieces::white,i,j);
              list.append(p);
              p->setParent(this);
              p->show();
              whoseturnLabel->setText(QObject::tr("<h1>请黑棋下!</h1>"));
              whitechessed = true;
              emit click();
        }
    }
}
//悔棋按钮
  void chessboard::on_regret_clicked()
   {
     char regretbutton[7]="button";// '/0'结束符占一位
    //udp发送
    QByteArray datagram = QByteArray(regretbutton);
    sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                            45454);
 
}
//重新开始的窗口
void chessboard::regret()
{
    int a=QMessageBox::information(this, tr("注意"),
                                   tr("对方选择重新开始,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
    if(a==QMessageBox::Ok)
    {
        //udp发送
        char compress[4]="abc";
        QByteArray datagram = QByteArray(compress);
        sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                45454);
 
        for(int i=0;i<list.size();i++)
        {
            list.at(i)->close();
        }
        list.clear();
        winbLabel->setText(tr(""));
        winwLabel->setText(tr(""));
        color=true;
    }
}
 
//对方点击ok,悔棋后重开始
       void chessboard::regretclean()
     {
        for(int i=0;i<list.size();i++)
         {
           list.at(i)->close();
         }
    list.clear();
    winbLabel->setText(tr(""));
    winwLabel->setText(tr(""));
    color=false;
}
 
 
 
 
 
 
//悔棋功能都没实现
       //悔棋按钮
         void chessboard::on_regret1_clicked()
          {
            char regretbutton[8]="button1";// '/0'结束符占一位
           //udp发送
           QByteArray datagram = QByteArray(regretbutton);
           sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                   45454);//以广播的形式发送到45454端口
 
       }
 
 
 
 
 
       //悔棋的窗口
       void chessboard::regret1()
       {
           int a=QMessageBox::information(this, tr("注意"),
                                          tr("对方选择悔棋,是否同意?"),QMessageBox::Ok,QMessageBox::Cancel);
           if(a==QMessageBox::Ok)
           {
//               //udp发送
//               char compress[5]="abc1";
//               QByteArray datagram = QByteArray(compress); //数据包
//               sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
//                                       45454);
 
               //udp发送
               char compress[4]="abc";
               QByteArray datagram = QByteArray(compress); //数据包
               sender->writeDatagram(datagram.data(),datagram.size(),QHostAddress::Broadcast,
                                       45454);
 
                   list.at(c)->close();
                 // list.at(c-1)->close();//删除刚才下的第c号棋子
               list.clear();
               winbLabel->setText(tr(""));
               winwLabel->setText(tr(""));
               color=true;
           }
       }
 
       //对方点击ok,悔棋后重开始
              void chessboard::regretclean1()
            {
              list.at(c)->close();//删除刚才下的第c号棋子
 
          //list.at(c-1)->close();//删除刚才下的第c号棋子
           list.clear();
           winbLabel->setText(tr(""));
           winwLabel->setText(tr(""));
           color=false;
       }
 
 

广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机(由IP地址确定)内的两进程(由端口号确定)间存在一条连接。http://www.cnpaf.net/Class/TCPANDIP/200408/316.html

udp可以通过广播的形式传给多人,广播只可以在局域网传播。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值