正文

字牌游戏开发计划2007-02-25 01:31:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/23452.html

分享到:

没有代码。

我想起原来看的一集《卫斯理》的故事里面的一个家伙,他是卫斯理的朋友,卫斯理认识的朋友都是厉害角色,他的厉害之处是他的推理能力,他是天生的侦探,可惜没有做成侦探,于是他就天天在家里意识犯罪,什么是意识犯罪?在几年里他每天都想一个犯罪方案出来,并进行非常详细的计划,比如抢劫,他写出流程和计划,然后放在那里,当然他从未犯过罪,只是过把瘾而已,并乐此不疲,卫斯理都为他的计划之周密而惊叹。

这几天走亲戚拜年,茶饭之余从老到小就只知道打牌,麻将啊,扑克啊,昏天暗地,我看他们打的时候就想要是做个牌类游戏该如何着手设计,哦,意识犯罪而已。

我们这地方比较流行字牌,因为玩起来特刺激,啥是刺激?打一块钱一个码,一天下来估计可以输上好几百块~不比麻将,堆着麻烦,打起来也随意性大,输赢都有,一点都不刺激~

字牌和麻将很相似,但是规则上会复杂很多,牌是纸做的,实际中4人一起玩,但拿牌的只有3个,3个人摸牌,比4个人摸牌容易摸一些,而且上下吃也容易些,比如,你和你上家的牌大部分都能吃,所以近似2/3的牌可以吃。

怎样着手设计呢?或者说计划一下。

首先是数据结构啦,从最底层开始。编码,牌如何用数字表示,原则,越简单越好,统一编码,比如1到10表示万,11到20表示条,统一一致编码。这时你会觉得是不是要做成复合形式的,就像MAC地址是平面的,而IP是分段的,在你还不知道这样编有什么好处的时候,别乱编,比如你觉得用二维数组表示更简单,但这样的操作是不是真的简单还不知道,有没有更麻烦的时候呢?或许有,因为以后的功能是应该可以扩充的。

有了牌的定义,然后就有桌面上的牌和手上的牌两类,桌上的牌在实际规则中或许比较复杂,但程序中很简单,只要是随机分发就行了,定义成一个可随机取的队列,类似代码如下:

typedef int SPoker;  //  牌的定义

class CPokerQueue
{
     SPoker poker[80];
    CPokerQueue();  //  在这里顺序填入应有的所有牌
public:
    SPoker hand();  //  摸牌
};

用一个指针指到这个队列的尾部,比如int rear=80;poker[0]到poker[rear-1]是全部的牌,于是摸一个牌,可以这样写:

int i=rand()%rear;  //  随机取牌
swap(poker[i],poker[rear-1]);  //  和最后一个交换
rear--;
return poker[rear];  //  将最后一个返回

这很简单,而且不会不符合概率的规律。而且这样一来不用‘洗牌’了,以前老想用个什么‘洗牌算法’呵呵,完全不必要,仔细想,‘洗牌’的目的是什么?让牌随机化,那摸牌的时候就顺序摸,外部效果是出来的牌随机化,反过来呢,我牌不洗全部都是顺序的,我摸牌随机摸,当然现实中我们不愿意这样做,洗好牌后会觉得安全一些,因为别人可能是赌王,随手一张大牌出来,所以先洗牌,然后老实摸牌,但是效果是一样的,我随机摸牌,是让计算机随机摸,所以游戏者不会做什么手脚,所以对大家都是公平的,而且外部效果完全一样,所以不用想个复杂的‘洗牌模型’,然后再想半天这个模型是否符合概率的规律啊,完全不必要。

好了,然后是另外一个类CHandPoker,表示手上的牌,这个类需要做的事比较多,由它发消息获得摸牌(从CPokerQueue),然后打牌到另外一个类CDeskPoker,表示打出的牌的队列,然后再定义一些操作,吃,从CDeskPoker中取一个,当然要满足吃的条件,碰,同样碰的条件,等,最难的是,胡牌,和胡牌的条件,这些条件就是和游戏规则有关,吃的条件,从那个被吃的子p开始,左边搜索一下,右边搜索一下,有xxp,xpx,pxx三种情况,很简单,碰更简单,最不好做的是能否胡牌的检查。

手上的牌是活的,是一个组合,不是固定的,你这样摆那样摆,或许哪个摆法,唉,它就胡了,好,那要怎么检查?以字牌为例,字牌里大小一到十,各4只,共80只牌,手上的牌20只,3乘6外加一对子,组牌规则有些像麻将,比如‘一二三’是一组牌,还有三只的碰‘二二二’等,也就是说,是否胡牌要看这些组是否都满足规则,一个小组合和大组合的问题,注意明确的一点是,是否胡牌要面向牌组。用深搜检查,结点就是牌组,但要从其它牌中取,既然是排列,那就不妨做一个有序的规定,比如升序,全部牌组以及组内都按升序:

一一一 二三四 ……八八

这里有没有必要把‘牌组’再封个类出来,如果组牌规则比较复杂的话可以考虑。

然后就对它进行搜索,组第一个牌组,当然要从中先选一个最小的,然后组一对,或者三只的吃、碰,或者四只的跑等,一但全部组成功就得到一个‘胡牌组合’,再看满足胡牌条件吗,然后把胡牌的可能码数记录下来,继续搜索,又找到一个的时候,比较一下,看谁胡得大,最大的一个组合才是最终结果。胡牌检查不光要完成是否能胡牌,还要返回最佳组牌方式和最佳码数。

粗略的就这些。

然后再考虑系统。在什么平台啊,网络协议呢,如何架这个系统,等一些实现。然后就是界面,要是做商业软件,还要请美工,画漂亮一些,操作方便些,做个前台程序出来。最后就是具体开发了,然后就卖,运行。

阅读(9317) | 评论(8)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册