编副小牌过新年——用VB实现简单人工智能
编程爱好者
编者按:每当新年到来,亲戚朋友欢聚一堂的时候,总要有些东西来调节一下“年味”,玩玩扑克无疑是一种非常好的选择。如何在我们的爱机上实现一副牌局呢?本期将通过一个用VB编写的扑克牌游戏程序(程序界面如图1所示)来教大家在编程中如何实现简单人工智能。

扑克经常打,真要做一副软件扑克,也需要耗掉不少脑细胞。总结一下,我们的扑克无非有这么四个要素:牌面、牌值、牌型和规则。前三者是牌的基础,后一项是牌的灵魂。四者之间不是完全独立的,牌面、牌值和牌型是一致的。什么样的牌面,就决定了该牌是什么样的值(如:A、2……J、Q、K)和什么样的类型(如:黑桃、红心、方块、梅花)。牌的规则也即牌的玩法,决定牌的大小关系、胜利的条件等。
一、牌面制作
牌面我们可以自已做,找一副牌,然后用扫描仪扫成图片文件;另一种办法是找到前人的东东COPY来使用。但对牌面的几个要求是必需的,正面52张,如果加上大小王(JOKER),那就是54张了,因为JOKER涉及的规则较少,和其他牌的联系也较少,我们暂时不去研究,再者就是牌的背面,所以我们要编的牌一共是53张牌面。
二、巧妙计算牌值和牌型
牌值和牌型是密不可分的,和前面我们建立的牌面是一一对应的,但是图片与图片之间要进行区别并找出和牌值之间的关系来,可不是件容易的事情。这就需要我们动脑筋了,怎样将牌面安排得更加合理、易用呢?其实我们在建立程序界面时就应该考虑这个问题,这将和我们程序的复杂程度有密切的关系。因为牌面是一幅图,我们可以使用图片框(PictureBox)或图像框(ImageBox)控件,因为使用图片时不涉及复杂的操作,我们可以使用图像框,一共要用到53个图像框,怎么样安排它们才能使我们后面的工作更加有序和方便呢?可以用控件的数组形式。我们建立了img(0)-img(52)共53个图像框控件。黑桃1~黑桃13用(1~13)来表示,红心1~红心13(14~26),方块1~方块13(27~39),梅花1~梅花13(40~52),我们可将牌背面用(0)来表示,现在事实上牌值和牌型都有了,只要用相应的数字除以13的余数,就可得牌值;牌型也和13有联系,只要用相应的数字除以13取商,分别对应于四个范围,0~1,1~2,2~3,3~4,它们分别对应于不同的牌型。例如取值为22时的牌型牌值的计算方法为:
22/13=1余9,所以我们可推断出该牌为红心9
三、游戏规则的实现算法
不同的扑克游戏,其规则是不同的。下面我们以“打五张”牌局为例说明。打五张,顾名思议就是从一副牌中任取五张,如果不满意可再对换其中的几张,看牌面大小决定玩家所能赢取的点数。牌的大小规则从小到大说明如下:
1.一对:有两张牌的牌值一样大。如拿到一张花4和一张红心4。
2.两对:有两个两张牌值一样大的牌局。如拿到一张花4和一张红心4,一张红心6和黑桃6。
3.三条:有三张牌的牌值一样大,如拿到一张红心A、一黑桃A、一方块A。
4.顺子:五张牌值大小相连。 如黑桃2、红桃3、黑桃4、方块5、花6。
5.同花:五张牌的牌型相同,如黑桃4、黑桃6、黑桃Q、黑桃A、黑桃9。
6.葫芦:五张牌中有一个三条和一个对子。
7.铁支:四张牌的牌型相同。
8.同花顺:是同花且是顺子的牌。
怎样将上面的游戏规则实现呢?
我们只要了解各牌的特点,解决它们其实就不难了,一是须记录五张牌的牌型和13种可能牌值的个数,这是我们判断一副牌的两个依据;其次是我们要了解上述规则中可能有的包含关系,我们通过函数PokerType()来实现,下面的算法说明了各种规则的微妙关系:
If 同花 = True And 顺子 = True Then PokerType = "同花顺": Exit Function
If 同花 = True And 顺子 = False Then PokerType ="同花": Exit Function
If 顺子 = True Then PokerType = "顺子": Exit Function
If 三条 = True And 对子 = 1 Then PokerType = "葫芦": Exit Function
If 三条 = True And 对子 = 0 Then PokerType = "三条": Exit Function
If 对子 = 2 Then PokerType = "两对": Exit Function
If 对子 = 1 Then PokerType = "一对": Exit Function
四、界面设计
打开VB,建立一个标准EXE 工程,在窗体上添加图像框(ImageBox)控件,将它改名为img,然后再复制52个(有点烦^-^),将牌背面图形文件和img(0)的Picture属性建立联系,并将其他的52个图像框分别与相应图牌对应(如图2所示),现在一副牌建成了,下面我们就开始使用它了。

在窗体上添加图像框,并将它再复制四个,为我们展示手中牌的控件,并在窗体上放置两个命令按钮,将其Name属性分别改为cmdStart和cmdChange,Caption属性改为“发牌”和“请换牌”,其位置和大小应该一致。在图像框下对应位置放置Label4(0)~Label(4)五个标签,用来记录换牌情况,并在图像框下放置Label3(0)~Label3(7)标签,用来标记牌局规则中的八种状态。再放上两个文本框,用来记录下注数和原筹码数。一切就绪,加入代码,一副小牌就设计好了!
通过前面的介绍,聪明的读者已经知道大概怎么编写代码了。如果还有不清楚的地方,可以到以下网址下载全部源程序:
http://www.cpcw.com/xz/02-source.rar