- 1、本文档共88页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
QT 网络五子棋
创建连接对话框 大部分和主机界面都相似,唯一不同的是,这里要实现在可编辑文本框中输入数字,这就需要自己画一个软键盘,我们可以用多个按钮(0~9)来实现,每个按钮按下去之后,他实现的功能就是在文本框中显示出相应的数字 效果图 代码分析(一) 大部分和主机界面都相似,唯一不同的是,这里要实现在可编辑文本框中输入数字,这就需要自己画一个软键盘,我们可以用多个按钮(0~9)来实现,每个按钮按下去之后,他实现的功能就是在文本框中显示出相应的数字,下面以数字“0”为例: 代码分析(二) QPushButton *num0= new QPushButton(this); num0-setText(0); QSignalMapper* mapper = new QSignalMapper(this); connect(num0, SIGNAL(clicked()), mapper, SLOT(map())); mapper-setMapping(num0, 0); connect(mapper, SIGNAL(mapped(const QString)), this, SLOT(displayed(const QString))); 代码分析(三) 首先介绍一下QSignalMapper,QSignalMapper可以看做是信号的翻译和转换器,他可以把无参数的信号翻译成带int参数,QString参数,QObject参数或者QWidget*参数信号。这里我们把按钮信号(无参数)转换成带QString参数(按钮的名称)的信号,然后依靠QString类型的参数进行处理操作。 代码分析(三) 例子中 1、首先建立一个无参数的连接:connect(num0, SIGNAL(clicked()), mapper, SLOT(map())); 2、然后我们进行转换:mapper-setMapping(num0, 0);这里把信号转换为QString参数类型的信号,0就是要要传递的参数。 3、最后我们把信号转发到最终的处理函数displayed(信号槽) connect(mapper, SIGNAL(mapped(const QString)), this, SLOT(displayed(const QString))); displayed的参数就是由QSignalMapper转换过来的QString类型的0。 程序设计 网络五子棋的实现 基本界面已经实现,还剩下以下两个功能 1、传输棋子数据(Socket) 2、同步棋盘(Socket + 数据链表) 传输棋子数据 if(get_right_chess==1){ write(connfd,cur,sizeof(CHESS)); if(who==0){ t-setText(TURN: Client....); who =1; } else{ t-setText(TURN: HOST....); who=0; } update(); lock=0; } 代码分析 首先用变量get_right_chess来判断发刚刚下的棋子是否以前下过,如果没有,则调用write(connfd,cur,sizeof(CHESS))向对方发送棋子的数据结构,发送完之后根据who的值来判断下一个谁走棋子,并且修改相应的标签,更新棋盘,并且锁定当前棋盘(lock用来锁定或者解锁当前棋盘) get_right_chess、who、lock在程序开始时应该初始化 同步棋盘 while(read(connfd,acc_node,sizeof(CHESS))!=0) { CHESS *node; node = pre; if(pre==NULL) { cur =(CHESS*)malloc(sizeof(CHESS)); if(cur!=NULL){ cur-x = acc_node-x; cur-y = acc_node-y; cur-next = NULL; cur-last = NULL; cur-color = acc_node-color; pre = cur; WorB[cur-x][cur-y] = acc_node-color; } } else{ while(node!=NULL) { if(node-x==(acc_node-x) node-y==(acc_node-y)) j++; node = node-last; }// check if it exist if(j==0){ cur = (
文档评论(0)