簡(jiǎn)單撲克游戲規(guī)則.gif
為之前一篇添加玩法規(guī)則墓毒,參考了最為親切的關(guān)牌(流行于江浙一帶)
我的關(guān)牌規(guī)則
1.牌數(shù)
一副牌片吊,保留了所以牌,共54張疮装;
2.發(fā)牌
由系統(tǒng)隨機(jī)分發(fā)2家的牌喻频,每家27張缩宜,不重復(fù)
3.出牌
- 第一次為黑桃3先出
- 牌的大小順序:大王,小王,2锻煌,A妓布,K,Q宋梧,J匣沼,10,9捂龄,8释涛,7,6倦沧,5唇撬,4,3展融。
- 牌形分為:?jiǎn)螐垺?一對(duì)窖认、 三張、姐妹對(duì)(兩張三張都可以連接愈污,且連接數(shù)量無(wú)限)耀态、順子(數(shù)量無(wú)限制)轮傍、炸彈(不能4帶1):
- 除了炸彈以外暂雹,普通牌形不允許對(duì)壓,相同牌形只有比它大的才能出创夜。
- 炸彈任何牌形都能出杭跪,炸彈的大小為:天王炸,2驰吓,A涧尿,K,Q檬贰,J姑廉,10,9翁涤,8桥言,7,6葵礼,5号阿,4,3鸳粉。
思路
1. 客戶端向服務(wù)器發(fā)送的是出牌的撲克塊狀代碼數(shù)組
//利用$(selector).each 將每一個(gè)選中(上移)的撲克牌的html放進(jìn)數(shù)組
var i = 0;
$(".click-up").each(function() {
list[i] = $(this).prop("outerHTML"); //獲取選中的牌的整個(gè)html代碼
$(this).removeClass("click-up");
$("#preview-below").append(list[i]);
$(this).remove();
i++;
});
2. 利用socket.io
發(fā)送到對(duì)方客戶端扔涧,如下獲取
//利用append動(dòng)態(tài)添加到指定id為“preview-above”的div里
for (var index in data.discard) {
$("#preview-above").append(data.discard[index]);
}
簡(jiǎn)單點(diǎn),直接把id為preview-above
元素里的撲克.poker
利用attr("id")
取出id
值并進(jìn)行正則操作獲取值
$("#preview-above").find(".poker").each(function() {
var pokerId = $(this).attr("id"); //atte取出id值
pokerId = pokerId.replace(/[p]([0-9]+)/g, "$1"); //獲取選中的牌的編號(hào)(刪掉id值首字母p)
aboveList[j] = getPokerFace(pokerId);
j++;
});
3. 判斷牌的類型
3.1 由于撲克牌的序號(hào)是從1到54,但這并不是撲克牌的面值枯夜。轉(zhuǎn)換操作:
//返回每張牌的面值
function getPokerFace(n) {
var temp = n % 13;
var result;
if(n == 53) { //大王
result = 17;
} else if(n == 54) { //小王
result = 16;
}
if(temp >= 3 && temp <= 12) { //3到Q
result = temp;
} else if(temp == 0) { //老K
result = 13;
} else if(temp == 1) { //A
result = 14;
} else if(temp == 2) { //2
result = 15;
}
return result;
}
3.2 獲取到撲克牌面值弯汰,進(jìn)行確定撲克牌數(shù)組的類型操作
//出牌類型:?jiǎn)危瑢?duì)湖雹,連對(duì)蝙泼,炸
var ONE = "ONE";
var TWO = "TWO";
var TWO_2 = "TWO_2";
var THREE = "THREE";
var THREE_2 = "THREE_2";
var THREE_3 = "THREE_3";
var FOUR = "FOUR";
var STRAIGHT = "STRAIGHT";
var ERROR = "ERROR";
var KING = "KING";
簡(jiǎn)陋的狀態(tài)轉(zhuǎn)化
//牌型狀態(tài)機(jī)
function typeState(type, n, m) {
switch (type) {
//單
case ONE:
if(n == m) {
type = TWO;
} else if(n == m +1 && m == 16) {
type = KING;
} else if(n == m + 1){
type = STRAIGHT;
} else {
type = ERROR;
}
break;
//對(duì)
case TWO:
if(n == m) {
type = THREE;
} else if(n == m + 1){
type = TWO_2;
} else {
type = ERROR;
}
break;
case TWO_2:
if(n == m) {
type = TWO;
} else {
type = ERROR;
}
break;
case THREE:
if(n == m) {
type = FOUR;
} else if(n == m + 1){
type = THREE_2;
} else {
type = ERROR;
}
break;
case THREE_2:
if(n == m) {
type = THREE_3;
} else {
type = ERROR;
}
break;
case THREE_3:
if(n == m) {
type = THREE;
} else {
type = ERROR;
}
break;
case STRAIGHT:
if(n == m + 1) {
type = STRAIGHT;
} else {
type = ERROR;
}
break;
default:
break
}
return type;
}
//返回牌的類型和排列中最小牌的面值
function getPokerType(pokerList) {
var type = ONE;
var n, m;
for(var i = 1; i < pokerList.length; i++) {
n = pokerList[i-1];
m = pokerList[i];
type = typeState(type, n, m);
}
if(type == TWO_2 || type == THREE_2 || type == THREE_3 || (type == STRAIGHT && pokerList.length < 5)) {
type = ERROR;
}
var result = {
type: type,
val: m,
length: pokerList.length
};
return result;
}
3.3 獲取我自己選中的牌
$("#box-below").find(".click-up").each(function() {
var pokerId = $(this).attr("id");
pokerId = pokerId.replace(/[p]([0-9]+)/g, "$1"); //獲取選中的牌的id(刪掉首字母p)
belowList[k] = getPokerFace(pokerId);
k++;
});
將兩個(gè)撲克牌數(shù)組的類型進(jìn)行比較并確定大小
//pkObj.data.before為true表示誰(shuí)拿到?3 或者 對(duì)方放棄我可以出任意牌,同時(shí)我出的牌必須符合規(guī)則劝枣,即type != ERROR
var myPoker = getPokerType(belowList);
//compare(aboveList, belowList)用于比較相同類型的牌的大小
if(compare(aboveList, belowList) || (pkObj.data.before && myPoker.type != ERROR))
//將選擇出的牌和對(duì)方出的牌進(jìn)行比較
function compare(list1, list2) {
var check = false;
var data1 = getPokerType(list1); //對(duì)方的牌類型
var data2 = getPokerType(list2); //我的牌類型
//1.類型相同的情況下再比較數(shù)組第一個(gè)元素大小;
//2.4表示炸汤踏,對(duì)方不是炸,我出炸則check為true
//3.天王炸
if((data1.type == data2.type && (data1.length == data2.length) && list2[0] > list1[0]) || (data1.type != FOUR && data2.type == FOUR) || (data2.type == KING)) {
check = true;
}
//check為true可出牌舔腾,否則不能出牌
return check;
}
總結(jié)
- jquery設(shè)置按鈕的disabled屬性
$('#button').attr('disabled',"true"); //添加disabled屬性
$('#button').removeAttr("disabled"); //移除disabled屬性
- replace()
pokerId = pokerId.replace(/[p]([0-9]+)/g, "$1"); //$1獲取]([0-9]+)的值