windows网络版象棋的实现

要构建网络版象棋,首先应该创建服务器与客户端,建立socket连接

1) 开局,你是什么颜色
2)选择棋子,
3)走棋
4)悔棋(悔棋悔两步)
5)认输

网络实现:
1)建立连接
a.主机,建立监听socket
b.accept
c.关闭监听socket

a.客户端,连接服务器

2)发送报文
1)服务器给客户端发送开局报文

2)选棋 发送选棋报文
3)走棋 发送走棋报文

4)悔棋
5)认输 重新开始

报文格式定义:

第一个字节表示命令字 0表示开具,1表示选其,2表示走棋,3表示悔棋,4表示认输

开局报文 [0][0或者1] 收到0表示走黑棋,收到1表示走红旗 [0][0] [0][1]
选棋报文 [1][0~31]
走棋报文 [2][0~31][x][y] x和y已经转换好的
悔棋 [3]
认输 [4][0或者1]

运行时设计
定义一个全局变量 char packet[4]用来保存报文
定义一个定时器,每秒去收socket

    #ifndef _Net_H__#define _Net_H__#ifdef WIN32#include <WinSock2.h>#else//linux and android#endif // WIN32class Net{public:static SOCKET _server;static SOCKET _connet;static int _isConnected;static int _isRecvComplete;static char* _recvData;static bool Listen(short port=9999);static bool isConnected();static bool Connect(const char*ip,short port=9999);static int Send(const char*buffer,int len);//接收数据的接口static bool RecvStart();static bool isRecvComplete();static char *RecvData(int &len);static DWORD WINAPI AcceptThreadFunc(void *arg);static DWORD WINAPI RecvThreadFunc(void *arg);};#endif

首先,服务器需要listen函数,一直监听,以得到与客户端的连接

    bool Net::Listen(short port){SOCKET sock=socket(AF_INET,SOCK_STREAM,0);if (sock==INVALID_SOCKET){return false;}struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.S_un.S_addr=INADDR_ANY;int ret=bind(sock,(struct sockaddr*)&addr,sizeof(addr));if (ret != 0){closesocket(sock);return false;}listen(sock,10);    //10 means listen count//create a therad to accept socket_server = sock;_isConnected = 0;HANDLE hThread = CreateThread(NULL, 0, AcceptThreadFunc, NULL, 0, NULL);CloseHandle(hThread);return true;}DWORD Net::AcceptThreadFunc(void *arg){_connet = accept(_server, NULL, NULL);_isConnected = 1;return 0;}

客户端则需要connect函数与服务器建立连接

    bool Net::Connect(const char*ip,short port){_connet=socket(AF_INET,SOCK_STREAM,0);if (_connet==INVALID_SOCKET){return false;}struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);addr.sin_addr.S_un.S_addr = inet_addr(ip);int ret = connect(_connet, (struct sockaddr*)&addr, sizeof(addr));if (ret != 0){closesocket(_connet);return false;}return true;}

如果建立连接成功,则可以互相传递数据了,此时服务器可以关闭连接监听

    void SceneGame::startServer(CCObject*){_bredSide=true;Net::Listen();schedule(schedule_selector(SceneGame::CheckListen));}void SceneGame::CheckListen(float){if (Net::isConnected()){unschedule(schedule_selector(SceneGame::CheckListen));//game start and do some initiate gameCCLog("server start game\n");}}

服务器与客户端互相发送数据,需要send函数

    int Net::Send(const char*buffer,int len){return send(_connet,buffer,len,0);}

接收数据需要receve函数保持监听

    bool Net::RecvStart(){_isRecvComplete=0;HANDLE hThread=CreateThread(NULL,0,RecvThreadFunc,NULL,0,NULL);CloseHandle(hThread);return true;}bool Net::isRecvComplete(){return _isRecvComplete;}char *Net::RecvData(int &len){len=0;_isRecvComplete=0;return _recvData;}DWORD Net::RecvThreadFunc(void *arg){static char buf[16];recv(_connet,buf,1,0);if (buf[0]==1){recv(_connet,&buf[1],1,0);}else if(buf[0]==2){for (int i=1;i<=3;i++){recv(_connet,&buf[i],1,0);}}//stop receve_recvData=buf;_isRecvComplete=1;return 0;}

在象棋中调用发送数据,发送完毕之后轮到对方走了,此时要打开接收数据监听

    //send stepStep* step = *_steps.rbegin();char buf[4];buf[0] = 2;buf[1] = step->moveid;buf[2] = step->rowTo;buf[3] = step->colTo;Net::Send(buf, 4);//receive messageNet::RecvStart();schedule(schedule_selector(SceneGame::CheckRecv));

接收到数据之后要关闭接收监听,然后开始发送数据,象棋根据传递的报文判断对方的信息,分别以1,2,3开头,表示选择,走棋,其中1与3还需要继续接收数据,2可以关闭数据接收。

    void SceneGame::CheckRecv(float){if (Net::isRecvComplete()){unschedule(schedule_selector(SceneGame::CheckRecv));int len;char *data=Net::RecvData(len);//accord to the data protocoal do some workif (data[0]==1){//selected _selectid=data[1];_selectSprite->setPosition(_s[_selectid]->fromPlate());_selectSprite->setVisible(true);//continue receiveNet::RecvStart();schedule(schedule_selector(SceneGame::CheckRecv));}else if(data[0]==2){//move stoneStone* s = _s[data[1]];int row = 9 - data[2];int col = 8 - data[3];int killid = getStoneFromRowCol(row, col);recordStep(_selectid, killid, _s[_selectid]->_row, _s[_selectid]->_col, row, col);// 移动棋子s->_row = row;s->_col = col;s->setPosition(s->fromPlate());if (killid != -1){Stone* ks = _s[killid];ks->_dead = true;ks->setVisible(false);}_selectid = -1;_selectSprite->setVisible(false);_bRedTurn = !_bRedTurn;}else if(data[0]==3){doRegret2();//continue receiveNet::RecvStart();schedule(schedule_selector(SceneGame::CheckRecv));}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494536.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google发布“多巴胺”开源强化学习框架,三大特性全满足

&#xfeff;&#xfeff;编译整理 | Just编辑 | 阿司匹林来源&#xff1a;AI科技大本营强化学习是一种非常重要 AI 技术&#xff0c;它能使用奖励&#xff08;或惩罚&#xff09;来驱动智能体&#xff08;agents&#xff09;朝着特定目标前进&#xff0c;比如它训练的 AI 系统…

周鸿祎VS马化腾 360VS腾讯工资待遇盘点

周鸿祎VS马化腾 360VS腾讯工资待遇盘点 内容简介&#xff1a;这是一篇关于腾讯工资待遇,360 待遇,a的文章。像腾讯这样的公司有上百家&#xff0c;马化腾和张志东最大的期望&#xff0c;只要公司能生存下来就是胜利。 腾讯公司员工待遇 这是腾讯某员工在2007年春节后离开后写的…

5万成员丨CSDN 大数据领域网红社区!

一、社区愿景 社区地址&#xff1a;https://bbs.csdn.net/forums/ITID 我的梦想很大&#xff0c;大到致力于打造大数据领域第一社区&#xff0c;赋能中国技术社区蓬勃发展。 我的“格局”很小&#xff0c;小到每一篇优质文章&#xff0c;都会不吝啬加精&#xff0c;置顶。 …

坦克大战实现

先将常用的函数与头文件&#xff0c;宏定义等写到一个公共类中 #ifndef __Common_H__#define __Common_H__#include "cocos2d.h"#include "SimpleAudioEngine.h"#include "cocos-ext.h"USING_NS_CC;USING_NS_CC_EXT;#define winSize CCDirector:…

汽车传感器:自动驾驶“第一步”,新兴领域中国有望突围

来源&#xff1a;&#xff08;中金公司&#xff1a;黄乐平 &#xff09;摘要&#xff1a;从L3级量产车奥迪A8&#xff0c;到L4级量产巴士百度阿波龙&#xff0c;L3级自动驾驶已逐渐开始落地量产。位处产业链上游的汽车传感器行业最先感受到春意&#xff0c;各种技术路线争鸣&am…

3本实体书、10个csdn定制笔记本丨20211101期开奖

【社区福利-本周开奖】 社区地址&#xff1a;https://bbs.csdn.net/forums/ITID 「发帖、点赞、评论」可以赚取积分和奖品&#xff0c;希望大家多多捧场&#xff0c;把社区搞起来&#xff01; 一、根据「近7日」社区积分排名&#xff0c;送10个csdn定制笔记本。&#xff08;私…

怎么改变asp.net中.sln文件的默认生成路径

转自&#xff1a;http://zhidao.baidu.com/question/149657564.html 你新建解决方案就可以改 转载于:https://www.cnblogs.com/hellolong/articles/2801731.html

HttpClient实现客户端与服务器的通信

本篇主要讲解了利用HttpClient实现 windows主机与linux服务器的通信与传递数据 HttpClient代码&#xff0c;服务器端配置 系统和安装软件 1&#xff09;ubuntu 14.04 64位系统 2&#xff09;sudo apt-get install apache2 sqlite3 libsqlite3-dev 配置apache 支持cgi 配置…

腾讯阿里是否开始走向没落,用新互联网大脑模型分析

前言&#xff1a;虽然腾讯面临头条、抖音、陌陌、钉钉等新兴社交平台挑战&#xff0c;阿里面临海尔COSMOPlat&#xff0c;三一重工树根互联、美国GE Predix、德国西门子Mindsphere等工业互联网平台的挑战&#xff0c;但其核心优势依然存在&#xff0c;积累势能继续提高&#xf…

这5个超级经典SQL都不会,回去等通知吧

&#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、信息技术智库公号作者✌ 简历模板、PPT模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 一、每门课程问题 用一条 SQL 语句…

12.4scrum report

转载于:https://www.cnblogs.com/76er/archive/2012/12/04/2802336.html

markdown下编辑latex数学公式

在利用为知笔记编写笔记的时候&#xff0c;有时需要用的markdown&#xff0c;只要把文件名加上后缀.md,就可以使用markdown语法&#xff0c;以下介绍在markdown下编辑latex数学公式. 使用LaTeX写公式的基本语法 LaTeX 公式有两种&#xff0c;一种是用在正文中的&#xff0c;一…

从《2018年全球创新指数报告》看中国创新力!

作者&#xff1a;杨柯巍 张原编辑&#xff1a;煜 佳来源&#xff1a;中国电子信息产业发展研究院摘要&#xff1a;2018 年7 月10 日&#xff0c;世界知识产权组织&#xff08;WIPO&#xff09;、美国康奈尔大学和欧洲工商管理学院&#xff08;INSEAD&#xff09;共同发布《2018…

【每日SQL打卡】DAY 1丨部门工资最高的员工【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 活动流程&#xff1a; 1…

如何从操作系统安装文件提取驱动文件/ How to extract driver files from setup files (win 7)...

在部署 OS 过程中遇到一个问题&#xff0c;需要找到操作系统对于的驱动文件。由于OS都是直接从微软服务器上面copy下来的&#xff0c;所以&#xff0c;要找到对应的 Device Drivers很困难。好不容易找到一个Drivers的文件夹&#xff0c;发现各种驱动啊&#xff0c;估计也只有当…

【每日SQL打卡】​​​​​​​​​​​DAY 2 丨组合两个表【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

业界 |「多巴胺」来袭!谷歌推出新型强化学习框架Dopamine

作者&#xff1a;Pablo Samuel Castro、Marc G. Bellemare 来源&#xff1a;Google AI Blog,机器之心摘要&#xff1a;在过去几年里&#xff0c;强化学习研究取得了多方面的显著进展。在过去几年里&#xff0c;强化学习研究取得了多方面的显著进展。这些进展使得智能体能够以超…

Android客户端与服务器之间传递json数据

在服务器与客户端之间通信&#xff0c;json数据是一种常用格式&#xff0c;本文主要在服务器端构建数据&#xff0c;在客户端接收显示&#xff0c;并且在listview上显示出来 服务器端的构建 简单的javabean与返回结果函数与插入函数略过 public void doGet(HttpServletReque…

高通全系列手机处理器深度解析 (升级选手机必备)附参数对比表

关于高通处理器和ARM之间的关系 正式介绍高通处理器之前&#xff0c;笔者认为还是先来大致了解下高通和ARM公司之间的关系。在之前的文章中我们也介绍过ARM公司以及相应的ARM架构&#xff0c;实际上&#xff0c;包括高通在内所有终端手机芯片厂商的手机处理器产品的底层都是基…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…