深圳泊众专业棋牌游戏开发 视频游戏吧 9191pk 遛鸟棋牌游戏
玩网络棋牌月赚600-1万 斗地主技法从入门到精通 麻将高手秘籍 锄大地三十六计
棋牌游戏推广方案 中国象棋入门 北京上市公司收购棋牌游戏 赞助位预订

查看完整版本: 扑克牌类游戏DIY之一:整体布局的设计 (2)

擎墨閣文學 2008-5-1 11:55

扑克牌类游戏DIY之一:整体布局的设计 (2)

[table=98%][tr][td]经过上面的工作,扑克只是有了形,要让其有神还必须有效的管理。大多数扑克游戏都需有牌型、牌点、牌的张数等参数。针对不同牌的玩法,要善于总结分析,找出最有效的管理办法。我还是以斗地主为例谈谈自己的方案吧。[/td][/tr][/table][table=98%][tr][td]扑克可以采用数组记录牌点,但这种方法我试过,很麻烦效率也不高,最后还是选用了集合来管理。先把所有的PK控件加入一个集合中,作为待分发的牌,每个游戏者手中的牌、选中的牌、打过的牌都建立不同的集合。这样每张牌的牌点可通过调用该控件的Index属性算出,每张牌子的牌点计算方法是(假设建立的扑克控件集合名为mcoPK):[/td][/tr][/table][table=98%][tr][td]With mocPK(x)[/td][/tr][/table][table=98%][tr][td]If .index <= 103 then '两副牌时Index大于103的牌是大小王,要单独算牌点[/td][/tr][/table][table=98%][tr][td]PD = .index \ 8 '两副牌,每个牌点有8张,这样算出来3 - A、2对应的牌点就是 0 - 12[/td][/tr][/table][table=98%][tr][td]Else[/td][/tr][/table][table=98%][tr][td]PD = 13 + (.index - 104) \ 2 '小、大王的牌点对应13、14[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]End With[/td][/tr][/table][table=98%][tr][td]我总结了斗地主游戏的所有牌型,将其归纳为五种(若是一副牌的玩法还需增加两种,这里不说了),单只为1,对子为2,三只为3,三带二为4,四只及以上(俗称炸弹)为5。[/td][/tr][/table][table=98%][tr][td]完全表示一手打出的牌,光靠牌点与牌型是不行的,必须还有连牌的数量,如单只3开始的五连顺,它的牌点为起始的0,牌型为1,连牌为5;再如:5开始的三连对,它的牌点为起始的2,牌型为2,连牌为3等等。[/td][/tr][/table][table=98%][tr][td]这里可能有人会问,三带二时,三只可表示出来,那它所带的对子是什么,怎么知道呢。其实用三个参数表示一手牌,只是用于比较牌的大小而设的,三带二时比较大小是比三只的大小,所带的对子可不管它。到于具体到出牌的显示,每手牌还必须用前面提到的集合来记录所包含的控件,这样才能在牌桌上控制。带什么对子在游戏智能中要通分析手中的牌来决定,这也是智能设计上的一个难点,一般是选最小的对子来带。[/td][/tr][/table][table=98%][tr][td]为了让牌能够按顺序排放整齐,要建立一个排序的子过程,常用的就是起泡法。以从小到大排序为例,过程可如下设计:[/td][/tr][/table][table=98%][tr][td]Sub LiPai(co As Collection)[/td][/tr][/table][table=98%][tr][td]Dim i As Long, j As Long, k As Long, tempPK As PictureBox[/td][/tr][/table][table=98%][tr][td]k = co.Count '将集合中牌的总数赋值于变量k[/td][/tr][/table][table=98%][tr][td]If k < 2 Then Exit Sub '少于2 张牌,还排什么序[/td][/tr][/table][table=98%][tr][td]For i = 1 To k - 1 '两重循环让较小的牌象冒泡一样移到前面[/td][/tr][/table][table=98%][tr][td]For j = i + 1 To k[/td][/tr][/table][table=98%][tr][td]If co(i).Index > co(j).Index Then '按控件Index属性的大小排序,等同于按牌点排序[/td][/tr][/table][table=98%][tr][td]tempPK = co(j) '用一个临时变量保存较小的牌[/td][/tr][/table][table=98%][tr][td]co.Remove j '从集合中先移除较小的牌[/td][/tr][/table][table=98%][tr][td]co.Add tempPK, CStr(tempPK.Index), i '把临时变量中保存的小牌加到大牌前面[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]Next[/td][/tr][/table][table=98%][tr][td]Next[/td][/tr][/table][table=98%][tr][td]End Sub[/td][/tr][/table][table=98%][tr][td]以上过程只在集合里把控件按Index属性从小到大地整理了一下,若在桌面上表现出来,还需建立一个过程设定每张牌的位置,并连续运用控件的Zorder方法,保证大的牌盖住小的(如:图3)。[/td][/tr][tr][td][align=center][img]http://www.ccw.com.cn/htm/center/topic/02_5_28_2c.jpg[/img][/align][/td][/tr][/table][table=98%][tr][td]最后,还有一个很重要的洗牌过程,要保证发牌前集合里牌是被打乱了。编写洗牌与发牌过程,你会感到集合相比数组的优势。[/td][/tr][/table][table=98%][tr][td]Sub LuanPK()[/td][/tr][/table][table=98%][tr][td]Dim temp As Collection, i As Long, j As Long, k As Long[/td][/tr][/table][table=98%][tr][td]Do While mcoPK.Count > 0 '先清空该集合[/td][/tr][/table][table=98%][tr][td]mcoPK.Remove 1[/td][/tr][/table][table=98%][tr][td]Loop[/td][/tr][/table][table=98%][tr][td]For i = 0 To 107 '把两副牌加入集合[/td][/tr][/table][table=98%][tr][td]mcoPK.Add PK(i), CStr(PK(i).Index) '加入集合时使用Index作关键字,便于以后查找[/td][/tr][/table][table=98%][tr][td]Next[/td][/tr][/table][table=98%][tr][td]Set temp = New Collection '利于一个临时集合,将牌打乱[/td][/tr][/table][table=98%][tr][td]Do While mcoPK.Count > 0[/td][/tr][/table][table=98%][tr][td]Randomize '每次取牌前都要初始化随机序列[/td][/tr][/table][table=98%][tr][td]k = Int(Rnd() * mcoPK.Count + 1) '产生一个从1到mcoPK集合总数的随机数,随着后面不断在抽牌,集合总是逐渐变小的,直到抽光为止[/td][/tr][/table][table=98%][tr][td]temp.Add mcoPK(k), CStr(mcoPK(k).Index) '每次随机抽出的牌都加入临时集合[/td][/tr][/table][table=98%][tr][td]mcoPK.Remove k '抽出的牌可以从原集合中移除,保证抽出的牌不会重复,这就是集合比数组的优势所在[/td][/tr][/table][table=98%][tr][td]Loop[/td][/tr][/table][table=98%][tr][td]Set mcoPK = temp '临时集合中牌已是乱的了,重新赋予原集合[/td][/tr][/table][table=98%][tr][td]End Sub[/td][/tr][/table]

Эконо 2008-6-28 10:30

:)  :)  :)
页: [1]
查看完整版本: 扑克牌类游戏DIY之一:整体布局的设计 (2)