《河北联合大学信息学院联网游戏锄大地课设》由会员分享,可在线阅读,更多相关《河北联合大学信息学院联网游戏锄大地课设(19页珍藏版)》请在金锄头文库上搜索。
1、TCP-IP 协议与网络编程课程设计- 1 -1、软件背景介绍锄大地属于基础类扑克游戏,具有规则简单易学,打法生动精彩的特点,并且颇具发展成为竞技性智力游戏的潜力。锄大地较之竞技项目桥牌,运气成分偏大一些,但这一点也使其群众基础更为广泛。因锄大地游戏富含哲理,变化多端,精彩激烈,故有人说,锄大地可以提升到与麻将并列的适合大众参与的国粹地步。麻将是各自为战,互相牵制,而锄大地是在相互配合中尽量求得最大的利益,且敌我关系转瞬即变,并不固定,这成为锄大地最大的魅力所在。图 1 锄大地游戏界面游戏规则:扑克牌去掉大小王共 52 张,四人游戏,每家 13 张牌。 一、牌型 锄大地的出牌牌型有以下一些:单
2、张:任何一张单牌。一对:二张牌点相同的牌。三个:三张牌点相同的牌。顺:连续五张牌点相邻的牌,如“34567” “910JQK”“10JQKA”“A2345”等,顺的张数必须是 5 张,A 既可在顺的最后,也可在顺的最前,但不能在顺的中间,如“JQKA2”不是顺。杂顺:花色不全部相同的牌称为杂顺。同花顺:每张牌的花色都相同的顺称为同花顺。同花五:由相同花色的五张牌组成,但不是顺,称“同花五” 。.如红桃“278JK” 。三个带一对:例如:99955。四个带单张:例如:99995。TCP-IP 协议与网络编程课程设计- 2 -二、牌的大小1.只有张数相同的牌可以比较大小,例如:99 88,J 10
3、,但不能比较: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
4、.五张牌的牌型中,同花顺最大,四个带单张第二,三个带一对第三,同花五第四,杂顺最小。也就是说,上家出了杂顺后,你的任何一副同花五、三个带一对、四个带单张或同花顺都比杂顺大。三、出牌规则1.第一副牌都由拿方块 3 的一方首先出牌,而且第一轮出牌中必须包含方块 3。以后每副牌都由上副牌获胜者(第一个打完手中牌的一方 )出牌,并且第一轮牌不需要包含方块 3。 2.首家可以出任何一种合法的牌型。3.首家出牌后,下家所出的牌张数必须和首家的相同,同时比首家所出的牌大;下家也可以 Pass 表示不出牌,由再下一家继续出牌。4.如果连续三家都 Pass,这时最后出牌的一家可以重新打出新的牌型。5.如此继续,
5、直到一人手中的牌全部打光为止计算分数:在其中一方手中的牌全部出完后开始计分,计分过程举例如下: 1. 假设 A 、 B 、 C 、 D 四个玩家在一局游戏结束后,手中剩余的牌张数分别为:A:5 张 B:8 张 C:0 张 D:12 张 2. 先根据每家手中剩余的牌张数计算牌分,假设剩余牌张数为 n :(1)npReceiveData;/知道是新牌消息时转化为新牌消息char* p=(char*)pGameCard;RoomArraypGameCard-nRoom.MyCards.nPassNum=0; /只要有人出牌,则pass 数归零RoomArraypGameCard-nRoom.MyCa
6、rds.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-nRoo
7、m.dwPlayerIDi,p,pGameCard-nLen);if(pPass-nGameNo!=3)/当前不是轮到最后一个人if(i=pPass-nGameNo+1)/让下一个人能出牌pPass-bTurn=true;TCP-IP 协议与网络编程课程设计- 9 -if(RoomArraypPass-nRoom.MyCards.nPassNum=3)pPass-bNew=true;elsepPass-bNew=false;else/其它人不能出pPass-bTurn=false;else/当前轮到最后一个人if(i=0)/让第一个人出牌pPass-bTurn=true;if(RoomArra
8、ypPass-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 =
9、 TRUE; /应用程序是否活跃HWND hWndGame;void LoginFinish(); /设置登录完成后的处理函数bool bShowInfo=false;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)TCP-IP 协议与网络编程课程设计- 10 -WNDCLASS wndcls;wndcls.cbClsExtra = 0; /类结构后附加的额外的 byte 数wndcls.cbWndExtra = 0; wndcls.hbrBackgrou
10、nd=(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; /水
11、平重画和竖直重画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
12、对应的窗口大小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.t
13、op + ( rcArea.bottom-rcArea.top - h ) / 2;/ 创建窗口hWnd = CreateWindow(GameWindow,锄大地, dwStyle,x0, y0, w, h, NULL,NULL, hInstance, NULL);MyGame.InitGameWindow(hInstance,hWnd);/创建游戏窗口hInst=hInstance;/从磁盘加载一张位图到位图句柄TCP-IP 协议与网络编程课程设计- 11 -HBitmapBk =(HBITMAP):LoadImage(hInst,Main_bg.bmp,IMAGE_BITMAP,0,0,
14、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();/
15、更新画面/等待消息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); /实现滚动到最后一行下面是锄大地游戏服务器的部分源代码:TCP-IP 协议与网络编程课程设计- 12 -void