前不久闲来无事,思索自制游戏玩玩,于是乎,自制android游戏之“诈金花”诞生了。
先上PP(界面有点简单,诸位看官将就将就了,以后可能会做成2d贴图的):
该demon主要实现了,随机发牌(一副牌,每人随机发三张)、牌大小的判断以及基础的下注功能;以后会完善电脑的ai制作。
一、随机发牌功能:
由于纸牌数据结构设计的好坏直接关系到后来牌大小的判断难易,以及识别牌的各种组成的难易。该demon中为每张牌定义了一个三位数字,作为标志。百位为1-4,代表牌的花色,后两位为一个两位数字,代表牌的点数,A为0,K为12.随机一个1-4的数和一个0-12的数即可拼凑成一张牌发给电脑或者玩家(部分代码如下)。当然最后显示时拟用规则,就可以把牌解释出来,显示给用户。
int card ;
while(true){
card = (getRandom(4)+1)*100+getRandom(13);
if(!checkExist(card))
break;
}
return card;
当然为了保证每张发出的牌不一样,就得存下每张已发出的牌,产生新牌时比对一下发牌历史。不累述了。
至此随机发牌结束。
二、关于牌大小规则的比对
玩过的人都知道,诈金花中豹子>顺金>金花>顺子>对子>普通牌>特殊牌(2、3、5),特殊牌又可以吃豹子,牌的含义不知道可以问度娘或谷哥,不累述。
如何才能区分出各个牌的大小呢?山人自有妙计。鄙人根据牌大小的规则,设计了几个case,计算出每种情况的大小,计算方法为:##(组合类型)##(同类型区分部分)##(可选部分) 其中#代表数字,如此没种组合都可以用这六位数来表示,组合之间大小可以通过比对这个数字大小来实现。
组合类型:豹子 6 顺金 5 金花 4 顺子 3 对子 2 普通 1 特殊和普通一样为1
同类型区分及可选:豹子为三张牌点数可选部分为花色 顺金为最大点数及花色 金花为最大点数及其次大点数 对子为对子大小和单牌大小
普通牌和其他不一样,六个#记录三张牌,通过比对每张牌比对大小
如此:豹子>60000 顺金>50000 金花>400000 顺子>300000 对子>200000 一般牌不可能比组合牌大(如果两人大小相同且>400000,则为相同金花,再比较最小的数和花色)
由于牌设计时已将花色部分和点数部分分开,因此区分牌组合类型不是很困难(如果发现有>60000的组合时(豹子),判断另一方是否为特殊牌;判断大小的函数中,将A的值设为13,比K的12大,方便比对,但如若发现对子中有A存在时,则判断是否有2存在,若有,则将A临时设为0,由于顺子中1 2 3 为最小,而q k A是最大的)代码不累述,不清楚可以email我)。
判断类型时从豹子开始比对,一级一级得出当前组合的类型,并算出其分数。比较双方纸牌组合分数即可知道赢家。
三、关于加注
设四个变量,两个代表双方当前余额,两个代表双方当前砝码,每加一次砝码,余额-1 。目前电脑加注为随机跟注,若电脑随机出来不跟注,认为输,显示双方牌,将双方当前砝码之和加至赢家余额中。若电脑跟注后,玩家手动点开盘,认为玩家输,加至赢家余额。若达到跟注上限,双方比对大小判断输赢。
这个实现是定义一个变量记录双方跟注次数,若次数达上限,传参数给判断赢家的函数,参数为-1,通知函数比对大小;若其中某方不跟注,传给函数的参数即位输家的id(id>=0),函数根据参数判断赢家,执行相关操作。代码实现不累述了。
将纸牌显示时,即可根据纸牌三位数,反解析出纸牌具体描述,显示之。
本文只是大概简述了鄙人实现的原理,现实证明可行,有兴趣的可以探讨探讨。与君共勉之~