河北联合大学信息学院联网游戏锄大地课设.doc_第1页
河北联合大学信息学院联网游戏锄大地课设.doc_第2页
河北联合大学信息学院联网游戏锄大地课设.doc_第3页
河北联合大学信息学院联网游戏锄大地课设.doc_第4页
河北联合大学信息学院联网游戏锄大地课设.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TCP-IP协议与网络编程课程设计1、 软件背景介绍 锄大地属于基础类扑克游戏,具有规则简单易学,打法生动精彩的特点,并且颇具发展成为竞技性智力游戏的潜力。锄大地较之竞技项目桥牌,运气成分偏大一些,但这一点也使其群众基础更为广泛。 因锄大地游戏富含哲理,变化多端,精彩激烈,故有人说,锄大地可以提升到与麻将并列的适合大众参与的国粹地步。麻将是各自为战,互相牵制,而锄大地是在相互配合中尽量求得最大的利益,且敌我关系转瞬即变,并不固定,这成为锄大地最大的魅力所在。图1锄大地游戏界面 游戏规则:扑克牌去掉大小王共52张,四人游戏,每家13张牌。 一、牌型 锄大地的出牌牌型有以下一些:单张:任何一张单牌。一对:二张牌点相同的牌。三个:三张牌点相同的牌。顺:连续五张牌点相邻的牌,如“34567”“910JQK”“10JQKA”“A2345”等,顺的张数必须是5张,A既可在顺的最后,也可在顺的最前,但不能在顺的中间,如“JQKA2”不是顺。杂顺:花色不全部相同的牌称为杂顺。同花顺:每张牌的花色都相同的顺称为同花顺。同花五:由相同花色的五张牌组成,但不是顺,称“同花五”。.如红桃“278JK”。三个带一对:例如:99955。四个带单张:例如:99995。 二、牌的大小1.只有张数相同的牌可以比较大小,例如:99 88,J 10,但不能比较:99 和 10。2.单张牌的大小:首先比较牌点,如果牌点相同再比较牌的花色。牌点从大到小依次为:2 A K Q J 10 9 8 7 6 5 4 3。花色从大到小的顺序为:黑桃、红桃、梅花、方块。比如:黑桃9 红桃9 梅花9 方块9 黑桃83.其它牌型在进行比较时都取其中一张最大的牌按单张的方式进行比较:三个带一对时,取三个中的最大一张。四个带单张时,取四个中最大的一张进行比较。顺子中最大的一张进行比较,注意2在顺子中作为小牌,如:6 5 4 3 2顺子比较时,只取6进行比较;A在和K相连作顺时,按大牌进行比较,在和2连在一起作顺时,作小牌处理。4.五张牌的牌型中,同花顺最大,四个带单张第二,三个带一对第三,同花五第四,杂顺最小。也就是说,上家出了杂顺后,你的任何一副同花五、三个带一对、四个带单张或同花顺都比杂顺大。 三、出牌规则1.第一副牌都由拿方块3的一方首先出牌,而且第一轮出牌中必须包含方块3。以后每副牌都由上副牌获胜者(第一个打完手中牌的一方)出牌,并且第一轮牌不需要包含方块3。 2.首家可以出任何一种合法的牌型。3.首家出牌后,下家所出的牌张数必须和首家的相同,同时比首家所出的牌大;下家也可以Pass表示不出牌,由再下一家继续出牌。4.如果连续三家都Pass,这时最后出牌的一家可以重新打出新的牌型。5.如此继续,直到一人手中的牌全部打光为止计算分数: 在其中一方手中的牌全部出完后开始计分,计分过程举例如下: 1. 假设 A 、 B 、 C 、 D 四个玩家在一局游戏结束后,手中剩余的牌张数分别为: A:5 张 B:8 张 C:0 张 D:12 张 2. 先根据每家手中剩余的牌张数计算牌分,假设剩余牌张数为 n :(1)n8 时,牌分为 n(2)8n10 时,牌分为 2n (3)10n13 时,牌分为 3n (4)n=13 时,牌分为 4n (5) 如果游戏结束时,手上还有 8 张或更多的牌,同时有黑桃 2 ,牌分还要再乘以 2 根据上述算法, ABCD 的牌分分别如下:A:5 分 B:8 x 2 = 16 分 C:0 分 D:12 x 3 = 36 分 3. 按下面的公式计算最后得分: A 的得分 =(B 的牌分 -A 的牌分 )+(C 的牌分 -A 的牌分 )+(D 的牌分 -A 的牌分 ) B 的得分 =(A 的牌分 -B 的牌分 )+(C 的牌分 -B 的牌分 )+(D 的牌分 -B 的牌分 ) C 的得分 =(A 的牌分 -C 的牌分 )+(B 的牌分 -C 的牌分 )+(D 的牌分 -C 的牌分 ) D 的得分 =(A 的牌分-D 的牌分 )+(B 的牌分 -D 的牌分 )+(C 的牌分 -D 的牌分 ) 按上述公式计算得到 ABCD 的实际得分为: A: (16 - 5) + (0 - 5) + (36 - 5) = 11 + -5 + 31 = 37 分 B: (5 - 16) + (0 - 16) + (36 - 16) = -11 + -16 + 20 = -7 分 C: (5 - 0) + (16 - 0) + (36 - 0) = 5 + 16 + 36 = 57 D: (5 - 36) + (16 - 36) + (0 - 36) = -31 + -20 + -36 = -872、 核心算法思想 根据锄大地游戏的游戏规则,可以得知游戏的流程为:发完牌后,手中有方块3的玩家获得出牌权,之后是按顺时针方向顺序出牌,可以选择pass,即放弃出牌,当其他三方玩家都选择放弃出牌时,重新获得出牌优先权。直至一家手中的牌全部出完,游戏结束,并且计分。1、牌型结构体,以1-8的整形数值来表示各种牌型,由于所有牌型中,最多包含的牌数不超过5张,所以设置指向纸牌的指针数组大小为5就可以了,用来指向该牌型中的牌在原来一副牌中的位置。单张:牌型为1,权值为该牌的权值;一对:牌型为2,权值为该对中权值最大的牌的权值;三张:牌型为3,权值为该三张中权值最大的牌的权值;杂顺:牌型为4,权值为该杂顺中权值最大的牌的权值;五同花:牌型为5,权值为该五同花中权值最大的牌的权值;三带二:牌型为6,权值为该三带二中的三张中权值最大的牌的权值;四带一:牌型为7,权值为该四带一中的四张牌中权值最大的牌的权值;同花顺:牌型为8,权值为该同花顺中权值最大的牌的权值。另外,顺为A2345,权值不能为牌2的权值,而要用牌5的权值;顺为23456,也一样,不能用牌2的权值,而要用到牌6的权值。2、设置全局变量count4,用来记录当前玩家手中牌的数量,初始为12,当其中一个值为0时,游戏结束。int count4;/玩家手中牌的数量3、位置记录参数sait,用来记录各个玩家所在的位置,主要是配合countsait来使用,在牌面评估中也起到比较大作用。0、1、2、3分别表示机器玩家1、机器玩家2、机器玩家3、用户玩家。4、洗牌与发牌算法:第一种:定义一个拥有52个元素的一维数组赋值为-1。然后随机生成0-52之间的数,然后判断生成的数是否在数组中已存在,不存在则存入数组,已存在则重新生成,直到52个数全部出现为止。第二种:也可以这样,比如,定义一个拥有52个元素的一维数组,依次赋值为0-51,然后随机生成两个0-51的数字,把这两个位置的数字互换。这样做比较多的次数之后,也就形成乱序的了,这个效率也不是特别高,但是比第一种要好。第三种:定义一个拥有52个元素的一维数组,依次赋值为0-51, 随机52次,每次随机出一个数字,和第i个位置也即是当前位置的数字交换,这样就比较不错了。考虑到效率跟公平性的问题,我所采用的第三种的算法来实现的。5、用户出牌、牌型判断与合法性检测算法:轮到用户玩家出牌时,玩家根据自己手中牌选择是否出牌,选择pass则直接跳过,不做其他处理,如果是出牌,用户玩家需要选择要出的牌的序号进行出牌。在用户玩家选择出牌后,机器根据用户玩家所出的牌进行牌型的判断、合法性的检测,具体算法如下:(1)如果用户所出的牌数为1张,课直接判断为单张。如果是2两张,则要判断这两张牌的牌值是否相等,如相等,课判断为对。如果是三张牌,要判断这三张牌的牌值是否相等,如相等,可判断为三张。(2)关键是用户所出的牌为5张的情况,可能有杂顺、五同花、同花顺、三带二、四带一这五中情况。首先根据权值进行排序并判断这五张牌中是否存在牌值相等的两张牌,如果有则可能是三带二、四带一或不合法,如果第1张牌与第4张牌相等或第2张牌与第5张牌相等,并且有一个对子,则可以判断为三带二;如果是第1张牌与第3张牌相等或第3张牌与第5牌相等,则可以判断为四带一;不符合以上两种情况为不合法。假如不存在牌值相等的两张牌,则可能的情况为杂顺、五同花、同花顺,判断这五张牌的牌值是否为依次增大的,如果是,那么可以判断为杂顺或同花顺,如果花色一样,可以判断为同花顺,否则为杂顺;如果这五张牌的牌值不是依次增大的,可能的情况为五同花或者是不合法,只有花色相同时才能判断为五同花,否则不合法。判断所出的牌大小是否合法,如果是优先出牌,那么只要牌型合法就可以出牌,如果是跟牌,则一定要比上家大的牌才合法,主要是通过比较上家牌型与用户出牌牌型来实现的。3、 核心算法流程图开始是否优先出牌判断是否比上家的牌大出牌结束不合法否否是是图2牌值合法判断流程图判断所出的牌大小是否合法,如果是优先出牌,那么只要牌型合法就可以出牌,如果是跟牌,则一定要比上家大的牌才合法,主要是通过比较上家牌型与用户出牌牌型来实现的。开始初始化52张牌,依次给这52张牌赋值i=0随机生成一个0-51的数字赋予k第i张牌与第k张牌的位置交换i=51i+0-12号位置的牌给玩家113-25号位置的牌给玩家126-38号位置的牌给玩家139-51号位置的牌给玩家1结束否是图3洗牌、发牌算法流程图定义一个拥有52个元素的一维数组,依次赋值为0-51, 随机52次,每次随机出一个数字,和第i个位置也即是当前位置的数字交换4、 源代码下面给出的是锄大地游戏洗牌发牌算法源代码:#defineBASE3/底牌数#defineEVERYONE17/每人发牌数#definePLAYMEM3/玩家数#defineSUM(EVERYONE*PLAYMEM+BASE)/总牌数#defineSELECT(EVERYONE+BASE)/选择底牌之后的牌数#defineSTIMES10/洗牌次数usingnamespacestd;voidShuffle();/洗牌intDealCard();/发牌inlinevoidSortCard(int*nCard,intnSize);/排序用户手中的牌inlineconstcharGetSuit(intnCard);/确定花色inlineconstchar*GetFace(intnCard);/确定牌的大小(字符串)inlineintGetFacePoints(intnCard);/确定牌的大小(数值)intnCardSUM;/代表一副张的牌constcharchSuit4=6,3,4,5; /代表牌的花色constchar*pchFace13=3,4,5,6,7,8,9,10,J,Q,K,A,2;/代表牌的大小,mm代表小王,MM大王intnCurrentCard=-1;/当前牌数voidOutputCards(int*nCard,intnSize);/输出牌,包括发给玩家的张牌,张底牌,玩家选择底牌之后的张牌intAgainCardSELECT;/选择底牌之后的牌归并inlinevoidInsertArray(int*nCard,int*bCard);/选择某个玩家之后的牌,归并下面给出的是用锄大地游戏出牌的主要源代码: case IDB_BTN_LOGIN:MSG_LOGIN MyLogin;/定义当前用户登录MyLogin.dwType=MSGID_LOGIN;/新用户登录类型赋值MyLogin.nLen=sizeof(struct MSG_LOGIN);char cText20;GetWindowText(Hwnd_Edit_Name,cText,20);strcpy(MyLogin.chPlayerName,cText);char* p = (char*)&MyLogin;/将新牌结构体强转化为字符串指针MySocket.Send(p,sizeof(struct MSG_LOGIN);/通过MyGame的MySocket的Send方法发送 break;case IDB_BTN_START:Btn_Start.BtnEnable(false);MSG_GAME_READY MyReady;/定义当前用户准备MyReady.dwType=MSGID_GAME_READY;/新牌结构体类型赋值MyReady.nLen=sizeof(struct MSG_GAME_READY);MyReady.bReady=true;MyReady.nRoom=MyCards.MyRoom;MyReady.nGameNo=MyCards.MyGameNo;char* p = (char*)&MyReady;/将新牌结构体强转化为字符串指针MySocket.Send(p,sizeof(struct MSG_GAME_READY);/MySocket的Send方法发送break;case IDB_BTN_PASS:MSG_GAME_PASS MyPass;/定义新牌结构体MyPass.dwType=MSGID_GAME_PASS;/新牌结构体类型赋值MyPass.nLen=sizeof(struct MSG_GAME_PASS);/长度赋值MyPass.nGameNo=MyCards.MyGameNo;MyPass.nRoom=MyCards.MyRoom;char* p = (char*)&MyPass;/将新牌结构体强转化为字符串指针MySocket.Send(p,sizeof(struct MSG_GAME_PASS);/MySocket的Send方法发送MyCards.CancelSel();break;case IDB_BTN_CP:if(MyCards.CardRule()MSG_GAME_NOWCARD MyNowCard;/定义新牌结构体MyNowCard.dwType=MSGID_GAME_NOWCARD;/新牌结构体类型赋值MyNowCard.nLen=sizeof(struct MSG_GAME_NOWCARD);/长度赋值MyNowCard.nGameNo=MyCards.MyGameNo;MyNowCard.dwPlayerID=MyCards.MyPlayerID;MyNowCard.nNumber=MyCards.CardCurSel.size();/出牌数赋值,这里为随机值,注意真正在游戏中是由玩家选取数决定MyNowCard.nLeave=MyCards.CardCur.size()-MyCards.CardCurSel.size(); /计算还剩多少张MyNowCard.nCurType=MyCards.nCurPutType;MyNowCard.nRoom=MyCards.MyRoom;for(int i=0;ipReceiveData;/知道是新牌消息时转化为新牌消息char* p=(char*)pGameCard;RoomArraypGameCard-nRoom.MyCards.nPassNum=0; /只要有人出牌,则pass数归零RoomArraypGameCard-nRoom.MyCards.g_Result.nLeavepGameCard-nGameNo=pGameCard-nLeave;for(int i=0;inGameNo!=3)/当前不是轮到最后一个人if(i=pGameCard-nGameNo+1)/让下一个人能出牌pGameCard-bTurn=true;else/其它人不能出pGameCard-bTurn=false;else/当前轮到最后一个人if(i=0)/让第一个人出牌pGameCard-bTurn=true;else/其它人不能出pGameCard-bTurn=false;SendMsgTo(g_RoomInfoArraypGameCard-nRoom.dwPlayerIDi,p,pGameCard-nLen);if(pPass-nGameNo!=3)/当前不是轮到最后一个人if(i=pPass-nGameNo+1)/让下一个人能出牌pPass-bTurn=true;if(RoomArraypPass-nRoom.MyCards.nPassNum=3)pPass-bNew=true;elsepPass-bNew=false;else/其它人不能出pPass-bTurn=false;else/当前轮到最后一个人if(i=0)/让第一个人出牌pPass-bTurn=true;if(RoomArraypPass-nRoom.MyCards.nPassNum=3)pPass-bNew=true;elsepPass-bNew=false;else/其它人不能出pPass-bTurn=false;下面是创建游戏窗口的部分源代码:HWND Hwnd_Edit_Ip;const int IDB_EDIT=11; /定义文本框HWND Hwnd_Edit_Name;HWND hwndPush;const int IDB_PUSHBUTTON=13;/定义文本框HWND hwndChatEdit; /只读文本框显示char bigchar5000; /显示在大文本框里的文本BOOL bActive = TRUE;/应用程序是否活跃HWND hWndGame;void LoginFinish(); /设置登录完成后的处理函数bool bShowInfo=false;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)WNDCLASS wndcls;wndcls.cbClsExtra= 0; /类结构后附加的额外的byte数wndcls.cbWndExtra= 0; wndcls.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); /窗口刷新的画笔句柄wndcls.hCursor=LoadCursor(NULL,IDC_ARROW);wndcls.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndcls.hInstance=hInstance; wndcls.lpfnWndProc=WndProc; /指定消息回调函数wndcls.lpszClassName=GameWindow; /标题栏显示标题wndcls.lpszMenuName=NULL; /菜单wndcls.style=CS_HREDRAW | CS_VREDRAW; /水平重画和竖直重画RegisterClass(&wndcls);hInst = hInstance; / Store instance handle in our global variable/设置窗口风格:DWORD dwStyle;dwStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;/取得去掉windows系统菜单栏后的工作区RECT rcArea;SystemParametersInfo( SPI_GETWORKAREA, NULL, &rcArea, NULL );/取得客户区大小为800*600 对应的窗口大小RECT rect;rect.left=rect.top=0;rect.right=800;rect.bottom=600;:AdjustWindowRectEx( &rect, dwStyle, TRUE, 0);/ 将视窗的位置设定在屏幕(工作范围)的中央int w = rect.right-rect.left;int h = rect.bottom-rect.top-GetSystemMetrics(SM_CYMENU);int x0 = rcArea.left + ( rcArea.right-rcArea.left - w ) / 2;int y0 = rcArea.top + ( rcArea.bottom-rcArea.top - h ) / 2;/ 创建窗口hWnd = CreateWindow(GameWindow,锄大地, dwStyle, x0, y0, w, h, NULL,NULL, hInstance, NULL);MyGame.InitGameWindow(hInstance,hWnd);/创建游戏窗口hInst=hInstance;/从磁盘加载一张位图到位图句柄HBitmapBk =(HBITMAP):LoadImage(hInst,Main_bg.bmp,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);if (!hWnd) return FALSE;ShowWindow(hWnd,SW_SHOWNORMAL); /显示窗口UpdateWindow(hWnd); /更新窗口MSG msg;while(1)if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)if(!GetMessage(&msg, NULL, 0, 0 ) return msg.wParam;TranslateMessage(&msg); DispatchMessage(&msg);else if(bActive)MyGame.UpdateFrame();/更新画面/等待消息else WaitMessage();return (int) msg.wParam; MyGame.MySocket.StartConnect(hWndGame,cText);/游戏窗口内的MySocket对象连接服务顺 MyGame.MySocket.SetCallBackRecv(GameMessageHandler);/设置MySocket的接收回调函数break;break;break;if(IDYES=MessageBox(hwnd,是否真的结束?,锄大地,MB_YESNO) void ShowText(char *p) sprintf(bigchar,%s%s,bigchar,p);/连接字符串 SetWindowText(hwndChatEdit,bigchar);/显示聊天字符串 int ChatEditLineCount=SendMessage(hwndChatEdit,EM_GETLINECOUNT,0,0);/得到一共多少行 SendMessage(hwndChatEdit,EM_LINESCROLL,0,ChatEditLineCount); /实现滚动到最后一行 下面是锄大地游戏服务器的部分源代码:void CGame:NotifyProc(PVOID* pPlayerContext, DWORD dwMsgId,PVOID pMsgBuffer)switch(dwMsgId) / 网络消息类型case NET_MSGID_CLIENT_CONNECT:/ 客户端连接上char strtmp50;break;case NET_MSGID_CLIENT_LEAVE:/ 客户端离开时APP_PLAYER_INFO* pPlayerInfo = LPAPP_PLAYER_INFO(*pPlayerContext);if(pPlayerInfo!=NULL)char strtmp50;sprintf(strtmp,Socket=%d%s,pPlayerInfo-PlayerInfo.chPlayerName,pPlayerInfo-dwPlayerID,rn);g_PlayerList.remove(pPlayerInfo);/玩家线程中断SAFE_DELETE(pPlayerInfo);ShowText(strtmp);break;case NET_MSGID_RECEIVE:/ 收到客户端消息时int nNumber;LPMSG_RECEIVE pMsgReceive = (LPMSG_RECEIVE)pMsgBuffer;MSG_GENERIC* pGenericMsg = (MSG_GENERIC*)pMsgReceive-pReceiveData;switch(pGenericMsg-dwType) / 判断收到的消息类型case MSGID_LOGIN:/接收到登录用户名消息case MSGID_GAME_NOWCARD:MSG_GAME_NOWCARD* pGameCard=(MSG_GAME_NOWCARD*)pMsgReceive-pReceiveData;/知道是新牌消息时转化为新牌消息char* p=(char*)pGameCard;RoomArraypGameCard-nRoom.MyCards.nPassNum=0; /只要有人出牌,则pass数归零RoomArraypGameCard-nRoom.MyCards.g_Result.nLeavepGameCard-nGameNo=pGameCard-nLeave;for(int i=0;inGameNo!=3)/当前不是轮到最后一个人if(i=pGameCard-nGameNo+1)/让下一个人能出牌pGameCard-bTurn=true;else/其它人不能出pGameCard-bTurn=false;else/当前轮到最后一个人if(i=0)/让第一个人出牌pGameCard-bTurn=true;else/其它人不能出pGameCard-bTurn=false;for(int i=0;inGameNo!=3)/当前不是轮到最后一个人if(i=pPass-nGameNo+1)/让下一个人能出牌pPass-bTurn=true;if(RoomArraypPass-nRoom.MyCards.nPassNum=3)pPass-bNew=true;elsepPass-bNew=false;else/其它人不能出pPass-bTurn=false;else/当前轮到最后一个人if(i=0)/让第一个人出牌pPass-bTurn=true;if(RoomArraypPass-nRoom.MyCards.nPassNum=3)pPass-bNew=true;elsepPass-bNew=false;else/其它人不能出pPass-bTurn=false;/ 回调函数typedef void (CALLBACK* NOTIFYPROC)(PVOID* pPlayerContext, DWORD dwMsgId,PVOID pMsgBuffer);class CIOCPServerpublic:CIOCPServer();virtual CIOCPServer();SOCKETm_sListen;/ 监听端口WSAEVENTm_hEvent;/ 监听事件BOOLm_bClose;/ 是否关闭线程LONGm_nWorkerCnt;/ 完成端口工作线程数HANDLEm_hCompletionPort;/ 完成端口CRITICAL_SECTIONm_cs;vector m_listClient;/ 客户列表NOTIFYPROC m_pNotifyProc;/ 消息处理函数BOOLIsOpen() return !m_bClose; / 初始化套接字,创建完成端口线程LRESULTInitialize(NOTIFYPROC pNotifyProc);/ 释放资源,结束所有客户端,关闭完成端口voidRelease();/ 开始监听LRESULTListen(int port, int backlog);/ 发送数据给某客户voidSendTo(DWORD dwNid,const LPMSG_BUFFER_DESC BufferDesc);PCSTRGetHostName(SOCKET socket);int FindGameNo(DWORD dwNid);protected:/ 错误码#define NET_OK0/ 操作完成#define NET_ERROR1/ 操作错误#define NET_ERROR_THREAD2/ 创建线程错误#define NET_ERROR_IOCP3/ 完成端口错误#pragma once#define MSGID_LOGIN 1 /登录消息#define MSGID_PLAYERINFO 2 /玩家消息#define MSGID_CHAT 3 /聊天消息#define MSGID_GAME_READY 4 /准备游戏消息#define MSGID_GAME_START 5 /开始游戏消息#define MSGID_GAME_ALLCARD 6 /所有牌消息#define MSGID_GAME_NOWCARD 7 /当前出牌消息#define MSGID_GAME_ENTERROOM 8 /进入房间#define MSGID_GAME_PASS 9 /玩家不出#define MSGID_GAME_RESULT 10 /游戏结果#define MSGID_GAME_TIME 11 /游戏倒计时开始#define MSGID_ALLPLAYER 12 /所有用户#define MSGID_ALLROOM 13 /所有房间信息#define MSGID_ROOM_GAMESTATE 14 /其中一个房间游戏状态的消息struct Cardint No; /0-51,编号int nIndex; /1为14,从2-13仍然为原来值int Value; /0-51;struct MSG_GENERICDWORD dwType; /消息类型int nLen; /消息长度,分包时用;struct MSG_LOGIN:public MSG_GENERIC DWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo; /玩家为第几号bool bSelf; /是否为自己char chPlayerName20; /玩家名字char chPlayerPass20; /用户密码;struct USERINFODWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETchar chPlayerName20; /玩家名字int nPlayerGrade; /玩家等级。0表示包身工,1表示短工,2表示长工,3表示佃户,4表示富农,5表示地方int nGameScore; /游戏分数int nWin; /胜利次数int nLose; /失败次数int nPing; /平局次数int nFace; /头像;/ 服务器端玩家结构typedef struct _APP_PLAYER_INFO:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo; /当前登录玩家编号USERINFO PlayerInfo; /玩家住处APP_PLAYER_INFO,*LPAPP_PLAYER_INFO;struct MSG_ALLPLAYERINFO:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo; /当前登录玩家编号int nPlayerNum; /玩家个数USERINFO PlayerInfoArray20;/玩家信息列表,当前游戏最多20个人进入;struct MSG_CHAT:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo; /发消息人的IDint nToID; /向某玩家发送的ID,如为0,则为向所有人发送char chChat200; /聊天信息长度,最长200字节int nRoom; /房间ID;struct MSG_GAME_READY:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo;bool bReady;int nRoom; /房间ID;struct MSG_GAME_START:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo;bool bStart;bool bTurn;int nRoom; /房间ID;struct MSG_GAME_ALLCARD:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo; /玩家次序,0表示该玩家为胜者为第一局有3者先出,1表示第二出,2表示第三出,3表示第4出int nTurnNo; /表示轮到哪个玩家出,nTurnNo为零的先出Card CartArray13; /服务器发的牌,分别按次序发送不同的牌给每个玩家int nRoom; /房间ID;struct MSG_GAME_NOWCARD:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo; /服务器给出的玩家次序编号,表示当前是第几个玩家bool bTurn;int nNumber; /出了几张牌int nCurType; /当前类型Card NowCardArray5; /出牌的数组,最多一次出5张int nLeave; / 还剩多少张牌int nRoom; /房间ID;struct MSG_GAME_ENTERROOM:public MSG_GENERICDWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGameNo;int nRoom; /房间的编号int nFace;struct MSG_GAME_PASS:public MSG_GENERIC /表示玩家不出DWORD dwPlayerID; /玩家ID,等于此玩家的SOCKETint nGame

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论