最近刚在公司写了基于FLASH的斗地主游戏,现在准备陆续把出牌的算法给大家分享一下,希望能给初学者一些帮助.
首先,我们知道斗地主游戏中有这样一些牌型,我样现在对牌型做一个分类,分别用字母代表某一牌型:
A 单张
B 对子
C 三张
D 三带一
E 三带二
F 四带二
G 四个带二对
H 飞机不带
I 飞机带一
J 飞机带二
K 单顺
L 双顺
M 四个的炸弹
N 火箭
然后写出判断每一种牌型号的方法
假设我们现在有要出的牌,用数组表示(从大到小):
var cards:Array
=
[
"
10_1
"
,
"
10_2
","10_3","6_1"
];
很明显,这是个三带一的牌型,"_"前面的数字表示牌值,后面的表示花色,"10_1"表示黑桃10,"10_2"表示红桃10,以此类推。
我们首先记录下牌的长度,这是我们后面要用到的:
var cardsLen
=
cards.length;
然后用以下代码将牌重新组合一下:
var cardsArray:Array
=
new
Array();
cardsArray[
0
]
=
new
Array();
cardsArray[
0
][
0
]
=
Number(cards[
0
].substring(
0
, cards[
0
].indexOf(
"
_
"
)));
cardsArray[
0
][
1
]
=
1
;
var x
=
1
;

for
(var i
=
1
; i
<
cards.length; i
++
)
...
{

if (Number(cards[i].substring(0, cards[i].indexOf("_"))) == cardsArray[x-1][0]) ...{
cardsArray[x-1][1]++;

} else ...{
cardsArray[x] = new Array();
cardsArray[x][0] = Number(cards[i].substring(0, cards[i].indexOf("_")));
cardsArray[x][1] = 1;
x++;
}
}
这样产生一个cardsArray这样一个二维数组:
cardsArray[0]=[10,3];
cardsArray[1]=[6,1];
也就是前面是牌的值,后面是牌的张数。
然后还需要一个牌的按牌的张数降序排序的函数:order(_arr)
function
order(_arr) :Array
...
{
var temp:Array;
var len:Number = _arr.length-1;

for (var i = 0; i<len; i++) ...{

for (var j = 0; j<len-i; j++) ...{

if (_arr[j][1]<_arr[j+1][1]) ...{
temp = _arr[j];
_arr[j] = _arr[j+1];
_arr[j+1] = temp;
}
}
}
return _arr;
}
这个排序并不是经常用到。
今天先到这里,下次继续。