前言
去年下半年做了一个项目,是扑克类的网络游戏。原计划包括:拱猪、斗地主、梭哈、红五三打一等。但是最重项目流产,只完成了拱猪和红五三打一。去年在动工的时候,网上的相关资料很少(一般都是很简单的比较大小游戏),尤其是win32下以MFC实现更加是凤毛麟角。我主要参考了一篇老外的文章,此文主要阐述了如何利用windows自带的cards.dll绘制各色扑克牌,以及示范程序,我会在收藏中贴出来。想找到联众或者中游的源代码作参考自然是不可能的。故而其设计还是我自己实现的。目前项目流产,不愿意让其躺在硬盘里睡大觉,愿意将一些所得贴出来与大家共享,也算作一种敝帚自珍吧。
概述
游戏分为
网络层和
应用程,
网络层由同学Kiang完成并且封装,应用层由笔者完成。在笔者开发
应用层的时候,只需要知道网络层有如下特性:
1、 诸个游戏者每人运行一个程序实例于各自的计算机上。此处将每个实例定义为一个“
端”。
2、 诸个端中有一个为“
主机”,“主机”直接负责与游戏服务器联系,即:从运营商的服务器上下载各个游戏者的积分等信息;并且负责将消息分发至其他的玩家。诸个端中,与“主机”相对应的,定义为“
从机”。
3、 网络层提供的服务:将本端应用层发来的消息分发到其他所有的端;将其他端发送来的消息正确发送到本端应用层。并且保证
正确性、
时序性。
由上面网络层的特性,设计应用层原理应当如下:
1、 定义每个参加游戏的人为“
玩家”。每个玩家在每个端上都有一个抽象的映射,即一个
Player。若一个游戏有N人(N个玩家)参与,则在每个端上,共有N个Player。某端N个玩家中有一个是
本地的(
local
),其他N-1个是
远程的
(remote)。所谓本地(local)即,接受来自GUI的消息并且向其他端相对同一个玩家的Player(remote)发出消息。而remote Player则不接受来自GUI的消息,接受来自远端Player(local)的消息。故而,藉remote-local结构,应用层通过网络消息同步各个端某个玩家对应的所有Player,保持各段数据的一致性
2、 剥离游戏和界面,即剥离
Game和
View两个类。Game类负责以虚函数重载的方法根据各个不同的游戏,设置不同的规则。有如下几个基本功能分别需要由虚函数实现:
l 大小比较规则
但张牌或者组合牌的大小比较。
l 出牌合法判定规则
若出牌不是本规则允许的组合,则被退回。
l 出牌次序判定
每一局、每一轮、每一副牌谁先走牌,谁后走牌。