編碼也快樂活動:撲克牌排序(JavaScript)

北落師門發表於2012-11-29

其中寫了兩個可以實現紙牌排序的函式。第一個是計算紙牌位置然後放入陣列中(後來想了想可能也觸犯規則了,而且這種方法不夠靈活,如果將程式拿來用做多個人輪流摸牌然後排序的話就不能用了),第二個是用了JavaScript中的sort()方法實現順序,不過受花色困擾要分別給按照顏色劃分的四個陣列分別排序後再組合。如果不考慮摸牌的情況,可以嘗試直接對放滿紙牌物件的cardCase陣列分別根據其中元素的color和number屬性來排序,不過這個方法怎麼實現我還沒想到。如果有知道的還望不吝賜教。

$(function() {
    var cardCase = new Array();
    var handsCadr =new Array();

    var cardColor = new Array("黑桃","紅心","梅花","方塊");
    var cardValue = new Array("A","2","3","4","5","6","7","8","9","10","J","Q","K");

    var spade = new Array();
    var heart = new Array();
    var club = new Array();
    var diamond = new Array();

    //洗牌,根據花色和牌值生成紙牌,再打亂順序
    function shuffle(cardColor,cardValue) {
        for(var i = 0; i < cardColor.length; i++){
            var number = 0;
            for (var x = 0; x < cardValue.length; x++) {
                number += 1;
                cardCase[i*cardValue.length + x] = {"color": cardColor[i],
                                                    "value": cardValue[x],
                                                    "number": number};
            }
        };

        cardCase = cardCase.sort(function() {
            return Math.random()>0.5?-1:1;
        });

        return cardCase;
    };

    //第一種排序方式:根據花色和牌面值直接將牌放入對應位置
    function drawCard1(cardCase) {
        for (var y = 0; y < cardCase.length; y++) {
            switch (cardCase[y].color)
            {
            case "黑桃":
                handsCadr[cardCase[y].number-1] = cardCase[y];
                break;
            case "紅心":
                handsCadr[cardCase[y].number + 12] = cardCase[y];
                break;
            case "梅花":
                handsCadr[cardCase[y].number + 25] = cardCase[y];
                break;
            case "方塊":
                handsCadr[cardCase[y].number + 38] = cardCase[y];
                break;
            }
        }
    };

    //排序函式
    function cardSort(cardNumber){
        return function(object1, object2){
            var value1 = object1[cardNumber];
            var value2 = object2[cardNumber];
            if (value1 < value2)
            {
                return -1;
            } else if (value1 > value2)
            {
                return 1;
            } else {
                return 0;
            }
        }
    }

    //第二種排序方式,將紙牌按照花色放入對應的陣列中,再分別給每個陣列排序,然後組合這些陣列
    function drawCard2(cardCase) {
        for (var y = 0; y < cardCase.length; y++) {
            switch (cardCase[y].color)
            {
            case "黑桃":
                spade.push(cardCase[y]);
                break
            case "紅心":
                heart.push(cardCase[y]);
                break
            case "梅花":
                club.push(cardCase[y]);
                break
            case "方塊":
                diamond.push(cardCase[y]);
                break
            }
        }

        spade.sort(cardSort("number"));
        heart.sort(cardSort("number"));
        club.sort(cardSort("number"));
        diamond.sort(cardSort("number"));
        handsCadr = spade.concat(heart,club,diamond);
    };

    //列印,在頁面中輸入排列好的順序
    function print() {
        for (var z = 0; z < 52; z++) {
            document.write(handsCadr[z].color + handsCadr[z].value + "<br/>");
        }
    };

    $(".shuffle1").click(function() {
        shuffle(cardColor,cardValue);
        drawCard1(cardCase);
        print();
    });

    $(".shuffle2").click(function() {
        shuffle(cardColor,cardValue);
        drawCard2(cardCase);
        print();
    });

});

相關文章