




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
辽 宁 科 技 大 学课程设计说明书设计题目: 局域网五子棋设计 学院、系: 计算机科学与工程学院 专业班级: 计试点2005 学生姓名: 王 红 辉 指导教师: 周 传 胜 成 绩: 2009 年 3 月 5 日目录一 题目1二 设计的任务、目的和作用1三 课程设计的内容1四 开发环境及实现所用语言1五 实现要点1A 数据通信指令(协议)及各指令的处理内容1B 套接字使用方法51.服务器端套接字的实现 52.客户端套接字的实现 6 C棋盘及棋子画法6 D棋盘存储结构及胜负判定算法8 E程序实现中定义的其他重要数据及意义、定义的函数或过程首部及意义 12六 设计体会13一、题目 计算机网络课程设计局域网五子棋的实现二、设计的任务、目的和作用计算机网络课程设计是计算机网络原理课程之后的时间加强环节,通过本设计的训练使学生加深对网络协议的理解,并实现制定通信规则,同时通过实践,进一步掌握套接字编程方法,为大型网络编程打下坚实基础。三、课程设计的内容五子棋的局域网对战四、开发环境及实现所用语言开发环境:Microsoft Visual C+ 6.0语言: C+ 五、实现要点A、数据通信指令(协议)及各指令的处理内容客户与服务器采用TCP连接指令及处理:#define LOGINSERVER login /连接服务器#define LEAVESERVER leave /离开服务器#define REPEATENAME rpeat /名字重复#define SERVERCLOSEsvrcl /服务器关闭#define GETCLIENTIP getip /获取客户的IP#define SENDCLIENTIP sndip /发送客户的IP#define IPINFOMATION #IP:# /发送IP的信息#define MSGTYPELENGTH 5 /关键字长度enum LOGINSVR, GCLIENTIP, SCLIENTIP, LEAVESVR ; /进入服务器,取客户的IP,发送客户的IP,离开服务器客户发送数据给服务器void CGobangGameClientDlg:SendMessageToServer(unsigned int nMsgType /* = LOGINSVR */, CString strMsg /* = */)CString strSendMsg;switch( nMsgType )case LOGINSVR: strSendMsg = LOGINSERVER + strMsg;break;case GCLIENTIP:strSendMsg = GETCLIENTIP + strMsg;break;case SCLIENTIP:strSendMsg = SENDCLIENTIP + strMsg;break;case LEAVESVR:strSendMsg = LEAVESERVER + strMsg;break;default:break;m_pClientSocket-Send( strSendMsg, strSendMsg.GetLength();服务器端处理收到的数据void CGobangGameDlg:ProcessPendingRead(CClientSocket *pClientSocket)/定义缓冲区char bufferBUFFER_SIZE;/接收数据int nReceived = pClientSocket-Receive(buffer,BUFFER_SIZE,0);buffernReceived = 0;CString strReceived;strReceived.Format(%s, buffer);CString strMsgType = strReceived.Left( MSGTYPELENGTH );CString strMsgInfo = strReceived.Right( strReceived.GetLength() - MSGTYPELENGTH ) ;if( strMsgType = LOGINSERVER )if( isRepeatName( strMsgInfo ) = FALSE )ClientLoginServer( strMsgInfo , pClientSocket);UpdateClients(buffer, nReceived, pClientSocket);elsestrReceived = REPEATENAME;pClientSocket-Send(strReceived, strReceived.GetLength();else if( strMsgType = GETCLIENTIP)GetClientIP( strMsgInfo, pClientSocket );else if( strMsgType = SENDCLIENTIP)SendClientIP( strMsgInfo, pClientSocket );else if( strMsgType = LEAVESERVER )ClientLeaveServer( strMsgInfo, pClientSocket);UpdateClients(buffer, nReceived, pClientSocket);/从服务器收到数据的处理void CGobangGameClientDlg:ReceiveMessageFromServer()char bufferBUFFER_SIZE;unsigned int nReceive = m_pClientSocket-Receive(buffer, BUFFER_SIZE);buffernReceive = 0;CString strReceived;strReceived.Format(%s, buffer);CString strMsgType = strReceived.Left( MSGTYPELENGTH );CString strMsgInfo = strReceived.Right( strReceived.GetLength() - MSGTYPELENGTH ) ;if( strMsgType = LOGINSERVER )ClientLoginServer( strMsgInfo );else if( strMsgType = GETCLIENTIP)GetClientIP( strMsgInfo );else if( strMsgType = SENDCLIENTIP)SendClientIP( strMsgInfo );else if( strMsgType = LEAVESERVER )ClientLeaveServer( strMsgInfo );else if( strMsgType = REPEATNAME )RepeatName();客户与客户采用UDP形式进行聊天,下棋客户与客户采用TCP连接指令及处理:#define SENDCHESSINFO chess / 发送下棋的棋子信息#define SENDCHATINFO chati /发送聊天信息#define SENDCHESSLOSS closs /发送给别人我赢得了游戏#define SENDLEAVE leave /发送离开游戏的消息#define CRYCRAVEN ccven /发送认输申请#define REPENTANCE reptc /发送悔棋申请#define AGREECRYCRAVEN acven /发送对方回复的认输申请#define AGRESSREPENTANCE arept /发送对方回复的悔棋申请#define MSGTYPELENGTH 5 /关键字长度enum CHESSINFO, CHATINFO, CHESSLOSS, LEAVECHESS, CRYCVN, REPTC, ACRYCVN, AREPTC ;/棋子信息, 聊天信息, 别人赢得游戏, 离开游戏, 认输申请, 悔棋申请, 回复的认输申请, 回复的悔棋申请.发送信息给对手void CDlgGobang:SendMessageToOther(unsigned int nMsgType, CString strMsgInfo)switch( nMsgType )case CHATINFO:strMsgInfo = SENDCHATINFO + strMsgInfo;break;case CHESSINFO:strMsgInfo = SENDCHESSINFO + strMsgInfo;break;case CHESSLOSS:strMsgInfo = SENDCHESSLOSS + strMsgInfo;break;case LEAVECHESS:strMsgInfo = SENDLEAVE + strMsgInfo;break;case CRYCVN:strMsgInfo = CRYCRAVEN + strMsgInfo;break;case REPTC:strMsgInfo = REPENTANCE + strMsgInfo;break;case ACRYCVN:strMsgInfo = AGREECRYCRAVEN + strMsgInfo;break;case AREPTC:strMsgInfo = AGRESSREPENTANCE + strMsgInfo;break;default:break;m_pChatSocket-SendTo( strMsgInfo, strMsgInfo.GetLength(), m_nOtherPort, m_strOtherIPAddress );分析对方发过来的信息void CDlgGobang:ProcessPendingRead(CChatSocket* pChatSocket)/定义缓冲区char bufferBUFFER_SIZE;/接收数据int nReceived = pChatSocket-Receive(buffer,BUFFER_SIZE,0);buffernReceived = 0;CString strReceived;strReceived.Format(%s, buffer);CString strMsgType = strReceived.Left( MSGTYPELENGTH );CString strMsgInfo = strReceived.Right( strReceived.GetLength() - MSGTYPELENGTH ) ;if( strMsgType = SENDCHATINFO )m_ctlChatInfoList.AddString( strMsgInfo );else if( strMsgType = SENDCHESSINFO )ProcessOtherChessInfo( strMsgInfo );else if( strMsgType = SENDCHESSLOSS )ProcessLoss();else if( strMsgType = LEAVESERVER )ProcessLeave();else if( strMsgType = CRYCRAVEN )ProcessCryCraven();else if( strMsgType = REPENTANCE )ProcessRepentance();else if( strMsgType = AGREECRYCRAVEN )ProcessAgreeCryCraven( strMsgInfo );else if( strMsgType = AGRESSREPENTANCE )ProcessAgreeRepentance( strMsgInfo );B、 套接字使用方法 TCP连接的套接字的使用(1).服务器端套接字的实现1.创建socket2.绑定3.监听4.接受连接5.发送和接受数据6.关闭(2)客户端套接字的实现1.创建socket2.连接到服务器3. 发送和接受数据4. 断开连接UDP连接的套接字的使用1.创建socket2.绑定3.发送和接受数据4.关闭C、 棋盘和棋子的实现 /绘制棋子和棋盘 CPen* pSolidLinePen = new CPen(PS_SOLID, 2 , RGB(0, 0 , 0);CPen* pOldPen = dc.SelectObject( pSolidLinePen );/绘制棋盘unsigned int i = 0;unsigned int j = 0;unsigned int nIncreaseX = GAMEMAPDISTANCEX / ( m_nGameMapSize - 1 );unsigned int nIncreaseY = GAMEMAPDISTANCEY / ( m_nGameMapSize - 1 );/绘制横向棋盘线unsigned int nPointX = GAMEMAPBASEXPOINT;unsigned int nPointY = GAMEMAPBASEYPOINT;for( i = 0; i m_nGameMapSize; i +)dc.MoveTo( nPointX, nPointY );dc.LineTo( GAMEMAPMAXXPOINT, nPointY);nPointY += nIncreaseY;/绘制纵向棋盘线nPointX = GAMEMAPBASEXPOINT;nPointY = GAMEMAPBASEYPOINT;for( i = 0; i m_nGameMapSize; i + )dc.MoveTo( nPointX, nPointY );dc.LineTo( nPointX, GAMEMAPMAXYPOINT );nPointX += nIncreaseX;unsigned int nChessManSize = ( nIncreaseX nIncreaseY ? nIncreaseX : nIncreaseY ) / 4; /棋子的半径 /绘制对弈双方的棋子CPen* pSouthDashPen = new CPen( PS_DASH, 3 , RGB( 10, 200 , 200 ) );CPen* pNorthDashPen = new CPen( PS_DASH, 3, RGB( 140, 10, 10 ) ); CBrush* pNorthBrush = new CBrush( RGB( 90, 90, 90 ) ); CBrush* pSouthBrush = new CBrush( RGB( 240, 240, 244 ) ); CBrush* pOldBrush = dc.SelectObject( pNorthBrush );for( i = 0; i m_nGameMapSize; i +)for( j = 0; j m_nGameMapSize; j +)nPointX = GAMEMAPBASEXPOINT + i * nIncreaseX;nPointY = GAMEMAPBASEYPOINT + j * nIncreaseY;if( m_nGobangGameMapij = OTHERCHESSMAN )dc.SelectObject( pNorthDashPen );dc.SelectObject( pNorthBrush );dc.Ellipse( nPointX - nChessManSize, nPointY - nChessManSize, nPointX + nChessManSize, nPointY + nChessManSize );else if( m_nGobangGameMapij = MYCHESSMAN )dc.SelectObject( pSouthDashPen );dc.SelectObject( pSouthBrush );dc.Ellipse( nPointX - nChessManSize, nPointY - nChessManSize, nPointX + nChessManSize, nPointY + nChessManSize );nPointX = GAMEMAPBASEXPOINT; nPointY = GAMEMAPMAXYPOINT + 20;dc.TextOut( nPointX, nPointY,我的棋子);nPointX += 40;nPointY += 20; dc.SelectObject( pSouthDashPen );dc.SelectObject( pSouthBrush );dc.Ellipse( nPointX - nChessManSize, nPointY - nChessManSize, nPointX + nChessManSize, nPointY + nChessManSize );nPointX = GAMEMAPBASEXPOINT + GAMEMAPDISTANCEX / 2;nPointY = GAMEMAPMAXYPOINT + 20;dc.TextOut( nPointX, nPointY, 对手的棋子);nPointX += 40;nPointY += 20; dc.SelectObject( pNorthDashPen );dc.SelectObject( pNorthBrush );dc.Ellipse( nPointX - nChessManSize, nPointY - nChessManSize, nPointX + nChessManSize, nPointY + nChessManSize );dc.SelectObject( pOldPen );D、 棋盘存储结构及胜负规则的判定棋盘存储结构:unsigned int m_nGobangGameMapGAMEMAPMAXSIZEGAMEMAPMAXSIZE; /五子棋棋盘的棋子信息unsigned int m_nGameMapSize; /五子棋的实际大小/五子棋棋盘的状态分别为无棋子,我的棋子,对方的棋子#define NOCHESSMAN 0#define MYCHESSMAN 1#define OTHERCHESSMAN 2胜负规则的判定:五颗棋子连成一条线就为赢/*版本: 1.0 开发时间: 2009/3/2 作者: 鲁红辉 评审人:功能: 判断是否赢得了游戏 输入: 当前下的棋子x,y的位置 输出: 是否赢得了游戏 */unsigned int CDlgGobang:WhichWinGobangGame(const unsigned int& x, const unsigned int& y)unsigned int nTempX = 0;unsigned int nTempY = 0;unsigned int nConnectionChessman = 0;/判断横向有没有连在一起的五子棋nTempX = x;nConnectionChessman = 0;for( nTempY = 0; nTempY m_nGameMapSize; nTempY + )/如果相连的棋子与剩下的棋子之和没有五个的话跳出循环if( m_nGameMapSize - nTempY + nConnectionChessman = 5)return MYWIN;elsenConnectionChessman = 0;/判断纵向有没有连在一起的五子棋nTempY = y;nConnectionChessman = 0;for( nTempX = 0; nTempX m_nGameMapSize; nTempX +)/如果相连的棋子与剩下的棋子之和没有五个的话跳出循环if( m_nGameMapSize - nTempX + nConnectionChessman = 5)return MYWIN;elsenConnectionChessman = 0;/判断撇斜向有没有连在一起的五子棋nConnectionChessman = 0;if( x + y = m_nGameMapSize )nTempX = x + y;nTempY = 0;for( nTempY = 0; nTempY = nTempX; nTempY +)/如果相连的棋子与剩下的棋子之和没有五个的话跳出循环if( nTempX - nTempY + 1 + nConnectionChessman =5 )return MYWIN;elsenConnectionChessman = 0;elsenTempX = 0;nTempY = x + y;for( nTempX = 0; nTempX = nTempY; nTempX +)/如果相连的棋子与剩下的棋子之和没有五个的话跳出循环if( nTempY - nTempX + 1 + nConnectionChessman =5 )return MYWIN;elsenConnectionChessman = 0;/判断捺斜向有没有连在一起的五子棋nConnectionChessman = 0;if( x = y )nTempX = x - y;nTempY = 0;for( ; nTempX m_nGameMapSize; nTempX + )if( m_nGameMapSize - nTempX + nConnectionChessman =5 )return MYWIN;elsenConnectionChessman = 0;nTempY +;elsenTempX = 0;nTempY = y - x;for( ; nTempY m_nGameMapSize; nTempY +)if( m_nGameMapSize - nTempY + nConnectionChessman =5 )return MYWIN;elsenConnectionChessman = 0;nTempX +;return NOONEWIN;E、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全知识和技能素养培训课件
- 中国广电汕头市2025秋招笔试行测题库及答案通信技术类
- 1.1.1显微镜的使用说课稿-冀少版(2024)生物七年级上册
- 海南安全体验培训成本课件
- 安全监管检测培训课件
- 劳务派遣协议:劳务派遣协议范本6篇
- 2025年焊工证笔试题库及答案
- 爱心公益活动申请书
- 临床医学检验技术中级考试真题题库及答案
- 离职返聘转正申请书
- 2025年迎中秋节庆国庆节主题班会课件
- 摄影设备租赁平台的市场潜力与趋势-洞察及研究
- 第2课《中国人首次进入自己的空间站》课件+2025-2026学年统编版语文八年级上册
- 私营医院市场营销部升职晋升管理体系
- 2025至2030中国铷/铯及其化合物行业项目调研及市场前景预测评估报告
- 国库账户管理办法
- 工装租借管理办法
- JG/T 296-2010空气吹淋室
- T/CBMCA 020-2021地铺石瓷砖
- 2025年青岛市局属公办高中自主招生化学试卷试题(含答案解析)
- 高级日语(一)(含课后习题参考答案)
评论
0/150
提交评论