长沙麻将怎么胡天胡缺一色怎么算?

长沙麻将全开放这牌怎么算钱
长沙麻将全开放这牌怎么算钱
我庄家~打双杆双鸟~全开放~我是碰碰胡+全求人+清一色+双杆全开中+双鸟全中(全中自己)2快钱一把~~其他3个人该给我多少钱???????????
补充:不要随便说数字,要详细点算法
不区分大小写匿名
楼主,如果你是全求人,就肯定是别人开杠放一个杠上炮,如果是自己开的,那就不能叫全求人.顶多是碰碰胡自摸.一般我们顶多也只算两个大方子,你这里应该是算清一色的碰碰胡,当然你们开打前这些就应该都讲好了.是不是算所有的大方子你也没有告诉我们.所以现在没人敢给你正确的答案.因为首先你没有告诉我们你们打的是三四片还是六七片,也没有告诉我到底是全求人还是自摸.
全求人也可以自摸的吧??????????????????
反正我以前打牌就算是最后一张牌自摸也不算全求人了.当然了,每次打牌都有规矩,反正我们打牌的规矩是这样.
我庄家~打双杆双鸟~全开放~我是碰碰胡+全求人+清一色+双杆全开中+双鸟全中(全中自己)
碰碰胡28清一色28全求人28每个人算36片子,每个人72块钱!
不懂还来答问,真搞不懂楼上的。全开放的概念就是剩一张自摸也是全求人。
楼主的问题只有一个不清楚,只是没有说双鸟是乘法还是加法。
以六七片为标准,答案如下:
鸟为加法:3个大番7*3=21,双杠再*2=42,第一鸟*2=84,第二个鸟+42=126番。2块的就是252块。
鸟为乘法:前面算法一样,第一鸟中为84番,第二鸟中的时候再*2=168番。2块就是336块。
鸟为加法:是4个大番。7*4=28,双杠*2=56,第一鸟*2=112,第二鸟+56=168番。336块。
鸟为乘法:112番*2=224番。就是448块。
既然是全开放的话,那就是这样算乘鸟 首先 一个大番子 7片子 &然后全求人翻一翻x2 清一色x2 双杠x4 双鸟x4 就是 7x2x2x4x4x2块钱一把=896一个加鸟的话就很好算 &3个大番子加起来 7+7+7 =21片 &双杠两个 21+21+21=63 全中 &63+63+63再乘以2块钱=378一个人。
&你的牌为5个方子 &而且是自己的庄家 &&5个方子(一个方子为7片)*2块 & &70起步 70+70+70 & 中两个相加 &210&&5个方子(一个方子为7片)&*2块 & &70起步70*2*2 & 中两个相乘 &280&&&& & & 这是最简单的算法 & & & & & & & & & & & & & & & & & &&
碰碰胡+全求人+清一色+双杆全开中=5个大合子 自己是庄家就是7片 7*2=14块(单个大合子的钱)5个大合子=14*5=70(底价)如果鸟是乘第一个鸟就是70*2=140 &第二个鸟140*2=280(一家)*3=840如果鸟是加第一个鸟就是70*2=140 &第二个鸟140+70=210(一家)*3=630但是能出这种牌的话钱还会进得多,因为起手一般会缺一色的。还要多算一个自摸
相关知识等待您来回答
湖南领域专家黄金岛的长沙麻将要怎么可以说话?
黄金岛的长沙麻将要怎么可以说话?
我玩黄金岛的长沙麻将,看到他们可以说话,请问要怎么说话`?
进入游戏大厅,在麻将类游戏点长沙麻将就出来个页面有详细是规则说明
长沙麻将起源湖南长沙,现在湖南中部流行。长沙麻将筒梭万,共一百零八张牌。玩法千变万化,以玩法活著称。就好像一个人的人生,多种多样,关键看你是否能干自我把握,只要把握好,照样可以成功。&& 1&平胡。就象绝大多数人的命运一样,平凡,一切靠自己一步一个脚印脚踏实地往前走,只有执着才能成功,最终胡牌。当然,期间多挫折,稍有失误,机会就会白白让给他人,导致放炮,输掉机会。&& 2&诈胡。湖南长沙麻将需要二五八做将,但是有两种情况可以胡牌,并且算大牌,一个是自己杠上开花甩骰,甩骰摸一墩牌,这就意味多了一次机会,还有就是海底,另一种就是别人杠上甩骰或赌海底。正所谓,人生博一博,自有精彩无限。&& 3&板板胡,缺一色。当你主手没有将或缺一色你就可以胡牌啦,这就好像天上掉馅饼一样,人的一生这种机会也是有的,就好像你中了******,此时,你自然告别了贫穷,过上大富大贵的日子。&& 4&四喜,六六顺。听名字就很吉利,当你主手有四张同样的牌,或者,两个三张同样的牌,你就可以胡啦,这就意味你交上好运,跟中奖没有什么区别啦。&& 5&将将胡,清一色,七对。不管你抓到一手什么的牌,只要你认真分析牌局,认定努力的方向,你就会离成功越来越近。人生也一样,每个人的人生道路不同,目标不一样,能力水平亦不同,但是,只要你好好把握自己,树立自己努力的方向,成功就在不远处等着你。&& 6&全求人。顾名思义就是全靠别人获取成功,乱吃乱碰最后留一张牌,还需要别人给你胡牌的机会。人世间何尝没有这种事情,当你的人生不能靠自己的努力成功,那么你可以借别人为自己谋取成功,这只能证明你厉害,没什么见不得人的。&& 玩牌如此,人生依然。或交上好运,或需要自己勤奋努力,艰苦创业。总之,一句话:命运掌握在自己手里,好好把握吧,这样,你的人生才会有意义,才会更精彩。&& 感谢黄金岛给我们这么好的平台让我们紧张的生活中也能体味休闲!&
长沙麻将打法简单、节奏快速,极易胡牌。长沙麻将 共一百零八张牌:包括筒、索、万,不带东、南、西、北风、中、发、白。和其他地方麻将相比增加了四喜、板板胡、六六顺、缺一色四种牌型,并且结合“扎鸟”让长沙麻将变得更加刺激独特。
游戏在一开始,只有庄家可得到十四张牌,其余的人十三张。庄家从牌中选出一张最无用的牌丢出。此时,其它三家都有权力要那张丢出的牌。庄家的下家(右手边的玩者),有权力吃或碰那张牌,其它两家则只可碰或杠那张牌。 “ 碰 ” 比 “ 吃 ” 优先。
1 、基本牌型
  1 、 11 、 123 、 123 、 123 、 123
  2 、 11 、 123 、 123 、 123 、 111(1111 ,下同 )
  3 、 11 、 123 、 123 、 111 、 111
  4 、 11 、 123 、 111 、 111 、 111
  5 、 11 、 111 、 111 、 111 、 111
  注:一对( 11 )是将牌,长沙麻将需要二、五、八做将,比如二万、五条、八筒等。如果是某些牌型则将可以为任意一对。
  2 、小胡
  1 、四喜:起完牌后,玩家手上已有四张一样的牌,即可胡牌。(四喜计分等同小胡自摸)
  2 、板板胡:起完牌后,玩家手上没有一张 2 、 5 、 8 (将牌),即可胡牌。(等同小胡自摸)
  3 、缺一色:起完牌后,玩家手上筒、索、万任缺一门,即可胡牌。(等同小胡自摸)
  4 、六六顺:起完牌后,玩家手上已有 2 个刻子(刻子:三个一样的牌),即可胡牌。(等同小胡自摸)
  5 、小胡: 2 、 5 、 8 作将,其余成刻子或顺子,即可胡牌。
  3 、大胡
  1 、天胡:单指庄家。庄家起牌后,即已经胡牌。
  2 、地胡:指闲家。当庄家打出第一张牌时,给闲家点炮。
  3 、碰碰胡:乱将,可碰,可杠,可自摸。
  4 、将将胡:玩家手上每一张牌都为 2 、 5 、 8 ,可碰。
  5 、清一色:乱将,有筒、索、万三种。任意一种可吃可碰。
  6 、海底捞月:最后一张牌为海底。海底胡牌,为大胡,需要将(将的种类根据当前牌型决定)。说明:长沙麻将中,海底牌可漫游。即轮到第一个玩家摸,他不要,则按照次序第二个玩家可要,依此类推。
  7 、海底炮:如果甲玩家要了海底,而又不能胡牌;乙玩家没有要得到海底,而又可以胡这张海底牌,即为乙玩家胡牌。同样如果丙和丁能胡则通胡。
  8 、七小对:胡牌时,手上任意七对牌。
  9 、杠上开花:玩家有四张一样的牌,即可选择开杠掷骰子(听牌的情况下)。补张牌的计数方法为:从最后一张牌计算,倒数,骰子开几点,即取倒数第几叠牌的最上面一张(如最上一张没有则取下方一张)。一旦补张的牌能被开杠者胡则算大胡。
  10 、抢杠胡:暗杠不能抢杠胡, 只有明杠可以抢胡。玩家在明杠的时候,其他玩家可以胡被杠的此张牌,叫抢杠胡;
  11 、杠上炮:如果开杠者掷骰子补张,补张的牌开杠者若不能胡而其他玩家可以胡属于杠上炮,若胡,则属于杠上开花。
其他回答 (1)
冲点卡就可以说话
相关知识等待您来回答
湖南领域专家黄金岛长沙麻将规则别人开杠,第一张他自己胡,第二张牌我可以胡? - 叫阿莫西中心 - 中国网络使得骄傲马戏中心!
黄金岛长沙麻将规则别人开杠,第一张他自己胡,第二张牌我可以胡?
当前位置:
VC++长沙麻将毕业设计论文
来源: 联系QQ: 作者: 网学
发布时间: 09/06/28
VC++长沙麻将毕业设计论文
近来随着技术的快速发展,各种麻将类游戏请进了电脑,像联众、腾讯等许多的大型的网站都有专门的游戏制作组,开发了各种类型的游戏,吸引众多的网络用户。目前,游戏产业在国内已经成为一种新兴产业。网络麻将游戏是一种在VC++6.0开发环境编制的,主要采用的是VisualC++编程和Winsock编程技术.游戏设计了四人打麻将,主要由服务器模块、客户端模块、游戏规则模块和视图模块四大模块构成,整个游戏利用模块的方法进行开发,逐步完善系统功能。
网络小游戏制作的目的是满足了人们休闲的需要,在紧张工作之余休闲类游戏能给人带来最大程度的放松,也可以增进人们之间的交流,沟通。
关键字:网络、麻将游戏、VC++、
With the recent rapid development of computer technology, all kinds of mahjong games invited to a computer, like Ourgame, Tencent, and many other large Web site of the game has produced specialized group, the development of various types of games, attract many Internet users. At present, the game industry in China has become a new industry. Mahjong game is a network in VC + + 6.0 development environment based mainly use the VisualC + + programming and Winsock programming technology. Game design of the four playing mahjong, mainly by the server module, client modules, the rules of the game Module View four modules and module structure, the entire game using the method of module development, and gradually perfecting the system.
&&Network game production was designed to meet the needs of the people leisure, in a tense game of his spare time leisure can bring the greatest degree of relaxation, can also enhance the exchange between the people, and communication.&
Keywords: network, mahjong games, VC + +&&&&&& 4
&VC++长沙麻将毕业设计论文
1.需求分析
在设计游戏之前,应先作游戏项目的需求分析,它主要包括游戏规则的描述和游戏功能需求.
1.1游戏规则描述
共一百零八张:筒、索、万,不带东、南、西、北风、中、发、白。
游戏在一开始,只有庄家可得到十四张牌,其余的人十三张。庄家从牌中选出一张最无用的牌丢出。此时,其它三家都有权力要那张丢出的牌。庄家的下家(右手边的玩者),有权力吃或碰那张牌,其它两家则只可碰或杠那张牌。 “ 碰 ” 比 “ 吃 ” 优先。
庄家确定方法:
A 、第一局由系统随机分配庄家。
B 、以后谁胡牌,下局谁做庄。
C 、如果有人要了海底牌后却没人胡则要海底牌的玩家下局当庄家。
D 、如果四个玩家都不要海底牌,则下轮由第一个可以选择海底牌的玩家当庄家。
E 、如果出现通炮情况,则下轮由放炮玩家当庄家。
F :如果此局无海底牌(即海底牌被补张),则补海底牌的玩家下局当庄家。
G :如果起手后,出现 2 个或 2 个以上的玩家胡(即天胡、四喜、六六顺、缺一色、板板胡五种牌型)则中鸟的玩家下局当庄家。
1 、基本牌型
1 、 11 、 123 、 123 、 123 、 123
2 、 11 、 123 、 123 、 123 、 111(1111 ,下同 )
3 、 11 、 123 、 123 、 111 、 111
4 、 11 、 123 、 111 、 111 、 111
5 、 11 、 111 、 111 、 111 、 111
注:一对( 11 )是将牌,长沙麻将需要二、五、八做将,比如二万、五条、八筒等。如果是某些牌型则将可以为任意一对。
1 、四喜:起完牌后,玩家手上已有四张一样的牌,即可胡牌。(四喜计分等同小胡自摸)
2 、板板胡:起完牌后,玩家手上没有一张 2 、 5 、 8 (将牌),即可胡牌。(等同小胡自摸)
3 、缺一色:起完牌后,玩家手上筒、索、万任缺一门,即可胡牌。(等同小胡自摸)
4 、六六顺:起完牌后,玩家手上已有 2 个刻子(刻子:三个一样的牌),即可胡牌。(等同小胡自摸)
5 、小胡: 2 、 5 、 8 作将,其余成刻子或顺子,即可胡牌。
1 、天胡:单指庄家。庄家起牌后,即已经胡牌。
2 、地胡:指闲家。当庄家打出第一张牌时,给闲家点炮。
3 、碰碰胡:乱将,可碰,可杠,可自摸。
4 、将将胡:玩家手上每一张牌都为 2 、 5 、 8 ,可碰。
5 、清一色:乱将,有筒、索、万三种。任意一种可吃可碰。
6 、海底捞月:最后一张牌为海底。海底胡牌,为大胡,需要将(将的种类根据当前牌型决定)。说明:长沙麻将中,海底牌可漫游。即轮到第一个玩家摸,他不要,则按照次序第二个玩家可要,依此类推。
7 、海底炮:如果甲玩家要了海底,而又不能胡牌;乙玩家没有要得到海底,而又可以胡这张海底牌,即为乙玩家胡牌。同样如果丙和丁能胡则通胡。
8 、七小对:胡牌时,手上任意七对牌。
9 、杠上开花:玩家有四张一样的牌,即可选择开杠掷骰子(听牌的情况下)。补张牌的计数方法为:从最后一张牌计算,倒数,骰子开几点,即取倒数第几叠牌的最上面一张(如最上一张没有则取下方一张)。一旦补张的牌能被开杠者胡则算大胡。
10 、抢杠胡:暗杠不能抢杠胡, 只有明杠可以抢胡。玩家在明杠的时候,其他玩家可以胡被杠的此张牌,叫抢杠胡;
11 、杠上炮:如果开杠者掷骰子补张,补张的牌开杠者若不能胡而其他玩家可以胡属于杠上炮,若胡,则属于杠上开花。
1.2游戏功能需求分析
游戏功能是一个网络游戏中最基本的功能,也是其他系统运行的基础平台.游戏界面需求和游戏功能需求的两大部分.
A.&& 游戏界面需求分析
(1)&&& 身份验证窗口
使用客户端软件登录游戏时,弹出身份验证窗口,必须输入正确的用户名和密码以及IP端口, 否则提示重新输入.服务器检验用户合法后,该用户就可进入其单击的房间.
(2)&&& 房间页面
房间页面可有桌子和用户名登录框, 用户名登录框无人时为白,用单击任意空框可进该位置上.等四人都进入,则开始进入打牌状态.
B. 游戏功能需求分析
(1)游戏启动
如果游戏4人都进入,游戏就启动.
(2)自动发牌
游戏启动后,服务器随机将牌发4个用户,只有庄家可得到十四张牌,其余的人十三张.用户只能看到自己的牌,其他用户的牌显示为背面.用户始终坐在正下方的位置(南侧),牌的顺序默认为万、条、筒、东南西北发(自左到右),各花色按大小顺序排列。发牌结束后自动进入打牌阶段。
(3)打牌阶段
打牌过程是按顺时针依次进行。庄家先从牌中选出一张最无用的牌丢出。此时,其它三家都有权力要那张丢出的牌。庄家的下家(右手边的玩者),有权力吃或碰那张牌,其它两家则只可碰或杠那张牌。 “ 碰 ” 比 “ 吃 ” 优先等等。
2.总体设计说明
针对以上的需求分析,把软件分成四部分:网络连接模型、文件传输模型、算法的分析、麻将实现来介绍。
2.1网络连接模型
在TCP/IP网络中两个进程间的相互作用的主机模式是客户端/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务
1、&&&&&& 打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。 
2、等待客户请求到达该端口。
3、接收到重复服务请求,处理该请求并发送应答信号。
4、返回第二步,等待另一客户请求  
5、关闭服务器。  
客户端:  
1、打开一通信通道,并连接到服务器所在主机的特定端口。  
2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……  
3、请求结束后关闭通信通道并终止。
基本套接字  
为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。  
1、创建套接字――socket()  
功能:使用前创建一个新的套接字  
格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);  
参数:af: 通信发生的区域  
type: 要建立的套接字类型  
procotol: 使用的特定协议
2、指定本地地址――bind()  
功能:将套接字地址与所创建的套接字号联系起来。 
 格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);  
参数:s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。  
其它:没有错误,bind()返回0,否则SOCKET_ERROR  
地址结构说明:struct sockaddr_in
short sin_//AF_INETu_
short sin_//16位端口号,网络字节顺序
struct in_addr sin_//32位IP地址,网络字节顺序
char sin_zero[8];//保留
3、建立套接字连接――connect()和accept()  
功能:共同完成连接工作  
格式:int PASCAL FAR connect(SOCKET s,const struct sockaddr FAR * name,int namelen);  
OCKET PASCAL FAR accept(SOCKET s,struct sockaddr FAR * name,int FAR * addrlen);  
参数:同上
4、监听连接――listen()  
功能:用于面向连接服务器,表明它愿意接收连接。  
格式:int PASCAL FAR listen(SOCKET s, int backlog);
5、数据传输――send()与recv()  
功能:数据的发送与接收  
格式:int PASCAL FAR send(SOCKET s,const char FAR * buf,int len,int flags); 
 int PASCAL FAR recv(SOCKET s,const char FAR * buf,int len,int flags);  
参数:buf:指向存有传输数据的缓冲区的指针。   
6、多路复用――select()  
功能:用来检测一个或多个套接字状态。  
格式:int PASCAL FAR select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds, fd_set FAR * exceptfds,const struct timeval FAR * timeout);
参数:readfds:指向要做读检测的指针    writefds:指向要做写检测的指针     exceptfds:指向要检测是否出错的指针     timeout:最大等待时间
7、&&&&&& 关闭套接字――closesocket()  
功能:关闭套接字s  
格式:BOOL PASCAL FAR closesocket(SOCKET s);
&VC++长沙麻将毕业设计论文
典型过程图面向连接的套接字的系统调用时序图无连接协议的套接字调用时序图若无法显示请联系QQ3710167
面向连接的应用流程图
2.2文件传输模块
虽然基于TCP/IP连接协议(流套接字)的服务是设计客户机/服务器应用程序时的主流标准,但有些服务也是可以通过无连接协议(数据报套接字)提供的。先介绍一下TCP socket 与UDP socket 在传送数据时的特性:Stream (TCP) Socket 提供双向、可靠、有次序、不重复的资料传送。Datagram (UDP) Socket 虽然提供双向的通信,但没有可靠、有次序、不重复的保证,所以UDP传送数据可能会收到无次序、重复的资料,甚至资料在传输过程中出现遗漏。由于UDP Socket 在传送资料时,并不保证能完整地送达对方,所以绝大多数应用都是采用TCP处理Socket,以保证资料的正确性。一般情况下TCP Socket 的数据发送和接收是调用send() 及recv() 这两个函数来达成,而 UDP Socket则是用sendto() 及recvfrom() 这两个函数,这两个函数调用成功发挥发送或接收的的长度,否则返回SOCKET_ERROR。
int PASCAL FAR send( SOCKET s, const char FAR *buf,int len, int flags );参数:
s:Socket 的识别码buf:存放要传送的的暂存区len buf:的长度flags:此函数被调用的方式  
对于Datagram Socket而言,若是 datagram 的大小超过限制,则将不会送出任何资料,并会传回错误值。对Stream Socket 言,Blocking 模式下,若是传送系统内的储存空间不够存放这些要传送的资料,send()将会被block住,直到资料送完为止;如果该Socket被设定为 Non-Blocking 模式,那么将视目前的output buffer空间有多少,就送出多少,并不会被 block 住。flags 的值可设为 0 或 MSG_DONTROUTE及 MSG_OOB 的组合。
int PASCAL FAR recv( SOCKET s, char FAR *buf, int len, int flags );参数:
s:Socket 的识别码buf:存放接收到的的暂存区len buf:的长度flags:此函数被调用的方式
对Stream Socket 言,我们可以接收到目前input buffer内有效的,但其数量不超过len的大小。
1、异步选择机制:
Windows Sockets 的异步选择函数提供了消息机制的网络事件选择,当使用它登记网络事件发生时,应用相应窗口函数将收到一个消息,消息中指示了发生的网络事件,以及与事件相关的一些信息。
  Windows Sockets 提供了一个异步选择函数 WSAAsyncSelect(),用它来应用程序感兴趣的网络事件,当这些事件发生时,应用相应的窗口函数将收到一个消息。  函数结构如下:
int PASCAL FAR WSAAsyncSelect(SOCKET s,HWND hWnd,unsigned int wMsg,long lEvent);
参数说明:   
hWnd:窗口句柄
wMsg:需要发送的消息
lEvent:事件(以下为事件的内容)
期望在套接字上收到数据(即读准备好)时接到通知
期望在套接字上可发送数据(即写准备好)时接到通知
期望在套接字上有带外数据到达时接到通知
期望在套接字上有外来连接时接到通知
FD_CONNECT
期望在套接字连接建立完成时接到通知
期望在套接字关闭时接到通知
例如:我们要在套接字读准备好或写准备好时接到通知,语句如下:
rc=WSAAsyncSelect(s,hWnd,wMsg,FD_READ|FD_WRITE);
如果我们需要注销对套接字网络事件的消息发送,只要将 lEvent 设置为0
2、步请求函数
  在 Berkeley Sockets 中请求服务是阻塞的,WINDOWS SICKETS 除了支持这一类函数外,还增加了相应的异步请求函数(WSAAsyncGetXByY();)。
3、阻塞处理方法
Windows Sockets 为了实现当一个应用程序的套接字调用处于阻塞时,能够放弃CPU让其它应用程序运行,它在调用处于阻塞时便进入一个叫“HOOK”的例程,此例程负责接收和分配WINDOWS消息,使得其它应用仍然能够接收到自己的消息并取得控制权。
WINDOWS 是非抢先的多任务环境,即若一个程序不主动放弃其控制权,别的程序就不能执行。因此在设计Windows Sockets 程序时,尽管系统支持阻塞操作,但还是反对员使用该操作。但由于 SUN 公司下的 Berkeley Sockets 的套接字默认操作是阻塞的,WINDOWS 作为移植的 SOCKETS 也不可避免对这个操作支持。
  在Windows Sockets 实现中,对于不能立即完成的阻塞操作做如下处理:DLL初始化→循环操作。在循环中,它发送任何 WINDOWS 消息,并检查这个 Windows Sockets 调用是否完成,在必要时,它可以放弃CPU让其它应用执行(当然使用超线程的CPU就不会有这个麻烦了^_^)。我们可以调用 WSACancelBlockingCall() 函数取消此阻塞操作。
  在 Windows Sockets 中,有一个默认的阻塞处理例程 BlockingHook() 简单地获取并发送 WINDOWS 消息。如果要对复杂进行处理,Windows Sockets 中还有 WSASetBlockingHook() 提供用户安装自己的阻塞处理例程能力;与该函数相对应的则是 SWAUnhookBlockingHook(),它用于删除先前安装的任何阻塞处理例程,并重新安装默认的处理例程。请注意,设计自己的阻塞处理例程时,除了函数 WSACancelBlockingHook() 之外,它不能使用其它的 Windows Sockets API 函数。在处理例程中调用 WSACancelBlockingHook()函数将取消处于阻塞的操作,它将结束阻塞循环。
4、&&&&&& 出错处理
Windows Sockets 为了和以后多线程环境(WINDOWS/UNIX)兼容,它提供了两个出错处理函数来获取和设置当前线程的最近错误号。(WSAGetLastEror()和WSASetLastError())
2、启动与终止
使用函数 WSAStartup() 和 WSACleanup() 启动和终止套接字。
VC++长沙麻将毕业设计论文
2.3算法的分析
数据结构:麻将的数字表示
用数字0~35表示麻将牌,其中0~8代表一万到九万,9~17代表一条到九条,18~26代表一筒到九筒,27代表东风,28代表南风,29代表西风,30代表北风,31代表中,32代表发,33代表白,34代表春夏秋冬,35代表梅竹兰菊
============================================
&0&&& 1&&&& 2&& 3&&& 4&&& 5&&& 6&&& 7&&& 8
============================================
一万 二万 三万 四万 五万 六万 七万 八万 九万
============================================
&9&&& 10&& 11&& 12&& 13&& 14&& 15&& 16&& 17
============================================
一条 二条 三条 四条 五条 六条 七条 八条 九条
============================================
18&&& 19&& 20&& 21&& 22&& 23&& 24&& 25&& 26
============================================
一筒 二筒 三筒 四筒 五筒 六筒 七筒 八筒 九筒
============================================
27&&& 28&& 29&& 30&& 31&& 32&& 33&& 34&& 35
============================================
东风 南风 西风 北风 红中 发财 白板& 花1& 花2
============================================
每个数字出现四次,代表四张牌,洗牌时采用随机算法提供牌墙
牌墙数据结构:
char SEAT[4][3] =
&&&&&&&&&& {&东&,
&&&&&&&&&& &&南&,
&&&&&&&&&& &&西&,
&&&&&&&&&& &&北&};
const char FENG[7][3] =
&&&&&&&&&& {&东&,
&&&&&&&&&& &南&,
&&&&&&&&&& &西&,
&&&&&&&&&& &北&,
&&&&&&&&&& &中&,
&&&&&&&&&& &发&,
&&&&&&&&&& &白&};
const char PAI[3][3] =
&&&&&&&&&& {&条&,
&&&&&&&&&& &筒&,
&&&&&&&&&& &万&};
const POINT ZhuangPos[4]=
{&& {5,500},
&&& {30,& 5},
&&& {760,20},
&&& {760,470}
const POINT SeatPos[4]=
{&& {35,500},
&&& {30, 35},
&&& {730,20},
&&& {760,440}
const POINT OtherPaiPos[3] =
{&& {760,410},
&&& {700, 20},
&&& {30 , 60},
const POINT ChuPaiPos[4] =
{&& { 360,350},
&&& {& 50,300},
&&& { 360,40},
& { 650,300}};
玩家数据结构:
玩家wanjia:{
&&&& 门风:
&&&&&&& menfeng:(27,28,29,30)
&&&&&&& gangpai{
&&&&&&& pai:0~33
&&&&&&& mingAn:0|1
&&&&&&&&&&&&& }
&&&&&& gangarr[0..3]:gangpai(最多四个杠,数字表示杠的牌,结构体第二位的0表示明杠,1表示暗杠)
&&&& 碰:pengpai[0..3]:0~33最多四个碰牌
&&&&&&& chipai{
&&&&& &&&&&chimin:(0~6,9~15,18~24)
&&&&&&&&&& chimax:(2~8,11~17,20~26)
&&&&&&&&&&&&& }吃牌中只用记录顺子的收尾即可
&&&&&&& chiarr[0..3]:chipai(最多有三个吃牌)
&&&&& 花牌:0~8(初始化为0,每摸到一个花牌加一)
&&&&& 手牌:paiInHand{
&&&&&&&&&&&&&& pai[0..13],
&&&&&&&&&&&&&& num:1,4,7,10,13
&&&&&&&&&&&&&&& &&&&&}
&&&&& 要牌pai[13]:除庄家外,初始化为-1,待摸牌上手(吃牌,碰牌,杠牌摸牌,魏我患掖蚺疲┖螅杂Φ呐浦蹈持蹈疲莆婕倚枰砼频谋曛荆ǖ狈歉菏保蓖婕掖硗昱坪螅普砗螅浦茫?
当要牌置位(非负)时,要对手牌进行胡牌判断:
由于手牌已经除掉了大量的碰杠吃等情况,简化的胡牌算法:
先对pai数组加上要牌一起排序;
然后用递归算法判断是否胡牌;
最后判断是否为7对,十三么,全不靠牌型:(注,这些牌型一般不容易胡,故番数也不小哦,^_^)
if(num==13)
& if(pai[0]==pai[1]&pai[2]==pai[3]&pai[4]==pai[5]&pai[6]==pai[7]&pai[8]==pai[9]&pai[10]==pai[11]&pai[12]==pai[13])
&&& return 1;//七对
& dblpos=-1;& //记录数组中对牌的位置;-1为没有对牌
& dblnum=0;//对的个数(如果超过两个对(可能是一个刻子)则不能胡十三么,全不靠牌型)
& for(i=0;i&14;i++}
&&&& if(pai[i]==pai[i+1])
&&&&&&&&&& dblpos=i;
&&&&&&&&&& dblnum++;
&&&&& if(dblnum&1)
&& if(dblnum==1) //可能为十三么
&&&&&& tirteen=1;
&&&&&& for(i=0;i&14;i++)
&&&&&&&&& if(pai[i]&0&[pai]&8)
&&&&&&&&&&& {
&&&&&&&&&&&&& &&tirteen=0;
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
VC++长沙麻将毕业设计论文
&else if(pai[i]&9&[pai]&17)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& tirteen=0;
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&&&&& else if(pai[i]&18&[pai]&26)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& tirteen=0;
&&&&&&&&&& &&&&&
&&&&&&&&&&& }//如果任何一张牌为非么九和非字牌,则不能胡十三么,
&&&&&&&&&& if(tirteen) return 1;//如果全部是么九和字牌,加上进入该段的牌只有一个对,则十三么胡牌
&&& else//可能为全不靠
&&&&& nowordpos=14;//记录下最后一个不是字牌的位置
&&&&& for (i=13;i&=0;i--)
&&&&&&&&& if(pai[i]&=26)
&&&&&&&&&&&& {
&&&&&&&&&&&&& nowordpos=i;
&&&&&&&&&&&&&
&&&&&&&&&&&& }
&&&&& if(nowordpos&=8)//如果非字牌有9个以上,肯定不能胡全不靠
&&&&& istirteen=1;
&&&&& for(i=0;i&=i++)
&&&&&&&&&& if(pai[i+1]-pai[i]&3&&pai[i+1]/9==pai[i]/9)//如果存在同一花色里两张可以吃别人的牌,则不能胡全不靠
&&&&&&&&&& {
&&&&&&&&&&&&& istirteen=0;
&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&& if(istirteen)
&&&&&& for(i=0;i&=nowordpos-1;i++)
&&&&&&&&&& for(j=i+1;j&=j++)
&&&&&&&&&&&&& if(pai[i]==pai[j] mod 9)
&&&&& &&&&&&&&&{
&&&&&&&&&&&&&&&&& istirteen=0;
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&& }
&&&&&&&&&&& if(istirteen==0)
if(istirteen) return 1;
2.4麻将功能的实现
在完成游戏的基本的功能后,接下来就可以进行对游戏内部功能的设计和实现,然后针对性把游戏完成.
2.4.1界面的绘制
主表面(primary surface)是用户在屏幕上可以看到的,它是显示内存的一部分。所有DirectDraw程序都有主表面,而且只有一个。它在DirectDraw表面对象之前就已经存在了,因此不能改变它的尺寸、格式和位置。主表面有一个很重要的特性――翻转。页面翻转用于中,可以产生相当平滑、不闪烁的动画。一个可以翻转的主表面实际上是两个表面,一个是可见的,一个是不可见的。不可见的表面称为后备缓冲区。当发生表面翻转时,后备缓冲区就成为可见的,而以前的可见表面则成为后备缓冲区
&从屏外表面位块传输
DDSURFACEDESC2
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; //这是离屏页面
desc.dwWidth =
desc.dwHeight =dwFlags指明了程序使用DDSCAPS结构,并设置缓冲区的高和宽。由DDSCAPS结构中的DDSCAPS_OFFSCREEN标志指定该表面是屏外缓冲区,在DDSURFACEDESC结构中将高和宽设为w和h,然后使用IDirectDraw::CreateSurface方法来创建表面。因为两个屏外表面的大小一样,创建第二个缓冲区只需要再运行一次IDirectDraw::CreateSurface即可(当然要用不同的指针)。你还可以在DDSCAPS中设置DDSCAPS_SYSTEMMEMORY或DDSCAPS_VIDEOMEMORY 来指定屏外缓冲区放在显示内存还是系统内存。将位图存放在显示内存可以加快后台缓冲区与屏外表面之间的数据传输速度,这在位图动画中非常重要。但是,如果你为屏外缓冲区指定了DDSCAPS_VIDEOMEMORY又没有足够的显示内存调入整个位图,当创建该表面时,程序就会返回一个DDERR_OUTOFVIDEOMEMORY的错误值。& 将位图文件调入屏外表面
::ColorKey()//镂空的实现
&&& key.dwColorSpaceHighValue = RGB(255,255,255);
&&& key.dwColorSpaceLowValue = RGB(255,255,255);
&&& pic-&SetColorKey(DDCKEY_SRCBLT,&key);
&&&}&&给出了设置colorkey的两种不同方法。第一种方法是注释内的3行,先设定DDCOLORKEY结构中color key的范围,再调IDirectDrawSurface::SetColorKey方法将color key 设置成黑色(假定位图在颜色表中以黑色作为调色板索引项255)。第二种方法是调用DDSetColorKey函数设置颜色的RGB值来选择color key,黑色就是RGB(0,0,0)。DDSetColorKey 函数调用了DDColorMatch函数,DDColorMatch存储放置于lpDDSOne表面的位图的0,0位置像素的颜色值,然后用提供的RGB值赋给0,0位置的像素,并将该颜色值屏蔽。  完成了这一步骤后,原来的颜色就可重新放回0,0处并用正确的Color Key调用DDSetColorKey函数,调用成功后,color key就放入DDCOLORKEY 结构中的成员变量dwColorSpaceLowValue ,同时也拷贝到dwColorSpaceHighValue成员,然后再调用IDirectDrawSurface::SetColorKey设置Color key。 CLR_INVALID是DDSetColorKey 和DDColorMatch函数中另一个有用的变量。如果在DDSetColorKey中以该值作为color key,位图左上角的像素就会作为color key使用。要想实现这一功能,需要调入位图文件All.bmp,将0,0处的像素值该为黑色,保存更改,然后如下改变对DDSetColorKey的调用: DDSetColorKey(lpDDSOne, CLR_INVALID);重新编译DDEX4,DDEX4就会使用0,0处的像素值作为color key了。&
&&& if(colorkey==1)
&&& {//拷贝源表面到目标表面dd
&&& dd-&pBackSurf-&BltFast(x,y,this-&pic,&rt,DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY);
VC++长沙麻将毕业设计论文
&&& //DDBLTFAST_SRCCOLORKEY和DDBLTFAST_WAIT,第一个标志用来激活源表面的色彩键码;第二个标志表示只有结束blt操作,BltFast()函数才返回。
&&& dd-&pBackSurf-&BltFast(x,y,this-&pic,&rt,DDBLTFAST_WAIT);&&&&&&& }&2.4.2麻将函数的实现
麻将网络游戏项目分为服务器端和客户端两大模块
&服务器端功能:提供游戏玩家注册、登录、
&&&&&&&&&&&&&&& 为游戏提供桌号、发牌.对于服务器就简单说明一下。&
if(WSAGETSELECTEVENT(lp)==FD_ACCEPT)
SOCKET&&&&& acceptS
SOCKADDR_IN& addr_
char uName[50],
password[30];
int len = sizeof(addr_from);
acceptSock = accept(ListenSocket,(SOCKADDR*)&addr_from,&len);
if(acceptSock==NULL)
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&& PostMessage(hwnd,WM_QUIT,0,0);
&&&&&&&&&&&&&&&&& return 0;
&&&&&&&&&&&&& }
&&&&&&&&&&&&& //接收注册名和密码
&&&&&&&&&&&&& if( RecvMsgDurTime(acceptSock,recvbuff)==-1)
&&&&&&&&&&&&&&&&& return 0;
&&&&&&&&&&&&& char *p=strstr(recvbuff,&login:&);
&&&&&&&&&&&&& if( p==NULL )
&&&&&&&&&&&&&&&&& return 0;
&&&&&&&&&&&&& p+=strlen(&login:&);
&&&&&&&&&&&&& char *p1 = strchr(p,',');
&&&&&&&&&&&&& strcpy(password,p1+1);
&&&&&&&&&&&&& *p1='\0';
&&&&&&&&&&&&& strcpy(uName,p);
&&&&&&&&&&&&& if( FindPlayer(uName) )
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&& memset(sendbuff,0,1024);
&&&&&&&&&&&&&&&&& sprintf(sendbuff,&error:Login Error,你用的用户名、密码已经登录了&);
&&&&&&&&&&&&&&&&& send( acceptSock,sendbuff,1024,0);
&&&&&&&&&&&&&&&&& return 0;
&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&& if( !IsLogin(uName, password) )
&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&& memset(sendbuff,0,1024);
&&&&&&&&&&&&&&&&& sprintf(sendbuff,&error:Login Error,请输入正确的用户名、密码&);
&&&&&&&&&&&&&&&&& send( acceptSock,sendbuff,1024,0);
&&&&&&&&&&&&&&&&& return 0;
&&&&&&&&&&&&& }
&&&&&&&&&&
&&&&&&&&&& else if(wp==FD_CLOSE)
&&&&&&&&&& {
&&&&&&&&&&&&& //closesocket();&&&&&&&&&&&&&&&&&&&&&& }//发牌的实现 的过程
void CMjTable::Fapai(int s1,int s2)
&&& int faplayer = (zhuang+s1+s2+1)%4;
&&& startdun = 136/4*faplayer + (s1+s2+2)*2 + 1;
&&& int oneplayer=
&&& fapai_pos =
&&& for(int i=0; i&48; i++)
&&&&&& if(i!=0 && i%4==0)
&&&&&&&&&& oneplayer = NextPlayer(oneplayer);
&&&&&& player[oneplayer]-&Zhuapai( realpai[fapai_pos] );
&&&&&& fapai_pos = (fapai_pos+1)%136;&&&&&&& }}然后再发送客户端send()函数来实现 .&客户端:游戏界面,判断是否吃、碰、杠、听牌及胡牌先定义以下:
const WORD&
&&&&&& ANSWER_PENG = 0x10,
&&&&&& ANSWER_MING_GANG& = 0x20,
&&&&&& ANSWER_AN_GANG&&&&&& = 0x40,
&&&&&& ANSWER_GANG&&&&&&&&& = ANSWER_MING_GANG | ANSWER_AN_GANG,
&&&&&& ANSWER_HU&& = 0x80,
&&&&&& ANSWER_CHI&&&& = 0x0F,
&&&&&& ANSWER_LEFT_CHI&&&&& = 0x01,
&&&&&& ANSWER_RIGHT_CHI& = 0x02,
&&&&&& ANSWER_MIDDLE_CHI = 0x04;
const WORD
&&&&&& PLAYER_STATE_DAPAI&&&&&& = 1,
&&&&&& PLAYER_STATE_CPGH&&& = 2,
&&&&&& PLAYER_STATE_ZIMOGH&&&&& = 5,
&&&&&& PLAYER_STATE_SELECT_CHI = 3,
&&&&&& PLAYER_STATE_IDLE&&& = 4;&
//画玩家的状态
&&& void DrawPlayerState(CDDraw *dd);
&&& //根据MouseMove选择玩家的状态
&&& void SelectStateByMouse(int xPos,int yPos);
&&& int& select_& //mouse选中的牌
&&& int& select_
&&& int& select_
&&& WORD PaiS//牌的吃碰杠和状态
&&& //确认Mouse选择的状态
&&& void DecideStateByLMouse(int xPos,int yPos);
&&& //取消Mouse选择的状态
&&& void CancleStateByRMouse();
&&& //解析服务器传来的消息,客户端玩家的状态也由此函数决定
&&& int ParseServerMSG(char *buff);
&&& //判断牌的吃碰杠胡
&&& WORD DecernCPGH(int pai,WORD cpgh_flag);
&&& //判断自摸牌的杠胡
&&& WORD DecernZIMOGH(int pai);
以下是玩家根据方向作出吃牌判断
WORD CClientPlayer::IsChi(int pai)
{&& int result[4];
&&& for(int i=0;i&4;i++)
&&&&&& result[i]=-1;
&&& for(i=0;i&StandNi++)
&&&&&& if(StandPai[i]&=108
&&&&&& || StandPai[i]/36!=duan)
&&&&&&&&&&
&&&&&& int lp = StandPai[i]%36/4;
&&&&&& if(lp-dp==-2)&&&& //LEFT 2
&&&&&&&&&& result[0]=
&&&&&& if(lp-dp==-1)&&&& //LEFT 1&&&&&&&&&
&&&&&&& result[1]=
&&&&&&&&&&&&&
&&&&&& if(lp-dp== 1)&&&& //RIGHT 1
&&&&&&&&&& result[2]=
&&&&&& if(lp-dp==2)&&&&& //RIGHT 2
&&&&&&&&&& result[3]=
是否碰杠牌
int CClientPlayer::IsPengGang(int pai)
&&& int num=0;
&&& for(int i=0;i&StandNi++)
&&&&&& if(StandPai[i]/4==pai/4)
&&&&&&&&&& num++;
&VC++长沙麻将毕业设计论文
bool CClientPlayer::IsHU(int enter)
&&& int distribe[34],copy_dist[34],dui[9];
&&& for(i=0;i&34;i++) distribe[i]=0;
&&& for(i=0;i&StandNi++)
&&&&&& int pai = StandPai[i]/4;
&&&&&& distribe[pai]++;
&&& distribe[enter/4]++;
&&& int dui_num=0;
&&& for(i=0;i&9;i++) dui[i]=0;
&&& for(int dpai=0;dpai&34;dpai++)
&&&&&& if(distribe[dpai]&=2)
&&&&&&&&&& dui[dui_num]=
&&&&&&&&&& dui_num++;
&&& if(dui_num==0) return FALSE;
&&& //--------------------------------------------------------------------------
&&& for(i=0;i&dui_i++)
&&&&&& for(int j=0;j&34;j++)
&copy_dist[j]=distribe[j];
&&&&&& copy_dist[dui[i]] -= 2;
&&&&&& int c0;
&&&&&& & c0=if_contented_num(&copy_dist[0]);& &&
if(c0==false)
&&&&&& & c0=if_contented_num(&copy_dist[9]);&&&&
if(c0==false)
&&&&&& &&& c0=if_contented_num(&copy_dist[18]);&
if(c0==false)
&&&&&& &&& c0=if_contented_zi(&copy_dist[27]); &
if(c0==false)
&&&&&& return TRUE;
【如何开始】
1.选择游戏服务器
2.选择游戏房间
3.进入房间后,四人都进入同一房间就可进行游戏
出牌:鼠标左键点击想出的牌,选择好后,点击 左键,或者在牌池中点击鼠标右键即可出牌。
长沙麻将打法简单、节奏快速,极易胡牌。长沙麻将 共一百零八张牌:包括筒、索、万,不带东、南、西、北风、中、发、白。和其他地方麻将相比增加了四喜、板板胡、六六顺、缺一色四种牌型,并且结合“扎鸟”让长沙麻将变得更加刺激独特。但在本游戏中没能实现和完成聊天功能以及计分,只能简单的做出打麻将的吃、碰、杠、听牌、胡牌。还有很多东西要继续学习来完成该游戏。
注意:在VC中进行WINSOCK的API编程开发的时候,需要在项目中使用下面三个文件,否则会出现编译错误。
1.INSOCK.H: 这是WINSOCK API的头文件,需要包含在项目中。
2.WSOCK32.LIB: WINSOCK API连接库文件。在使用中,一定要把它作为项目的非缺省的连接库包含到项目文件中去。
3.WINSOCK.DLL: WINSOCK的动态连接库,位于WINDOWS的安装目录下。
&VC++长沙麻将毕业设计论文
三年的大学生活,我在学校里不但学到了有关的专业知识,而且学会了做人的道理。感谢三年来关怀我成长的老师,你们的教诲将使我受益终生!感谢三年来给予我帮助的老师、同学;感谢在毕业设计阶段给与我帮助的老师和同学;特别感谢我的毕业设计指导老师彭老师,感谢他在设计中给我的指导和教诲。使我对未来的道路充满了信心!让我学会了很多书本上没有学到和没理解的知识,也让我的实践经验更上一层楼。真的非常感谢。&
1、《游戏设计概论》 北京科海电子出版社 2003年6月第1版 荣钦科技编
2、《Visual C++游戏设计》北京科海电子出版社2003年6月第1版荣钦科技编著
3、《Visual C++网络游戏建模与实现》北京科海电子出版社 2003年6月第1版 苏羽王媛媛 编著&4、《Visual C++经典游戏程序设计》人民邮电出版社 罗伟坚 编著&5、《Visual C++高级编程》人民邮电出版社 张力&& 编著
上一篇资讯:
下一篇资讯:
文章排行榜
说的太好了,我顶!
Copyright & 2014
Corporation, All Rights Reserved
Processed in 0.0424 second(s), 3 db_queries,
0 rpc_queries

我要回帖

更多关于 长沙麻将将将胡 的文章

 

随机推荐