我只要重要的算法就是了~~高手请赐教~~

解决方案 »

  1.   

    //你想要的(梭哈发牌和比牌算法),希望对你有用!
    牌形 = function (对象, 花色, 点数) {
        //trace("执行牌形 "+对象+" "+花色+" "+点数);
        //把数字花色换为字符花色
        if (花色 == 0) {
            花色 = "方块";
        } else if (花色 == 1) {
            花色 = "梅花";
        } else if (花色 == 2) {
            花色 = "红桃";
        } else if (花色 == 3) {
            花色 = "黑桃";
        }
        this[对象].黑桃._visible = false;
        this[对象].红桃._visible = false;
        this[对象].梅花._visible = false;
        this[对象].方块._visible = false;
        this[对象][花色]._visible = true;
        this[对象][花色].gotoAndStop(点数);
    };
    洗牌 = function () {
        //动态设置总牌52张
        var 总牌:Array = new Array();
        for (var i = 0; i<4; i++) {
            for (var j = 8; j<=14; j++) {
                总牌.push([i, j]);
            }
        }
        //设置玩家的牌组
        //5个玩家
        for (var i = 1; i<=5; i++) {
            this["牌组"+i] = new Array();
            //发牌数据给玩家(5张)
            for (var j = 1; j<=5; j++) {
                //随机抽总牌
                var 随机值 = int(random(总牌.length));
                //添进牌组
                var 抽中值 = 总牌.splice(随机值, 1);
                this["牌组"+i].push(抽中值[0]);
                //让牌数据形象化
                牌形(("玩家"+i+j), 抽中值[0][0], 抽中值[0][1]);
                //this["玩家"+i+j].牌形(this["牌组"+i][0, this["牌组"+i][1]]);
            }
        }
        /*
        for (var i = 1; i<=4; i++) {
        trace(this["牌组"+i]);
        }
        */
    };
    洗牌();
    //牌级分类
    类型数组 = ["散牌", "对子", "双对", "三条", "顺子", "同花", "葫芦", "铁支", "同花顺"];
    判断牌类型 = function (牌, 判断起始) {
        牌数 = 牌.length;
        var 牌组 = new Array();
        //设置默认值
        if (判断起始 == undefined) {
            判断起始 = 0;
        }
        if (牌数 == undefined) {
            牌数 = 5;
        }
        var 最终类型 = "";
        var 追加值 = [0, 0];
        牌数--;
        //排序
        if (判断起始 == 0) {
            //trace("排序牌");
            牌组 = 牌;
        } else {
            for (var i = 判断起始; i<=牌数; i++) {
                牌组.push(牌[i]);
            }
        }
        牌组.sortOn(1, 2 | 16);
        //trace(牌组);
        //临时显示 
        /*
        var 显示 = "";
        for (var i = 0; i<牌数; i++) {
        显示 += 牌组[i][1]+" ";
        }
        //trace(显示);
        //
        */
        //牌数为4 从0算起
        if (牌数 == 4) {
            var 对比值 = 牌组[0][1];
            //检测是否是顺子 
            for (var i = 1; i<5; i++) {
                对比值--;
                if (对比值 != 牌组[i][1]) {
                    //返回不是同花顺也不是顺子
                    //return false;
                    最终类型 = 0;
                    break;
                }
            }
            //检测是否是同花
            var 对比值 = 牌组[0][0];
            for (var i = 1; i<5; i++) {
                if (对比值 != 牌组[i][0]) {
                    if (最终类型 != 0) {
                        最终类型 = 4;
                        break;
                    }
                }
            }
            if (最终类型 == "") {
                最终类型 = 8;
            }
        } else {
            最终类型 = 0;
        }
        //追加最大牌的花色和牌面                                                      
        if (判断起始 == 0) {
            追加值 = [牌组[0][1], 牌组[0][0]];
        } else {
            追加值 = [牌组[判断起始-1][1], 牌组[判断起始-1][0]];
        }
        //检查对子                                       
        var 对比值 = 0;
        var 牌类型 = 0;
        var 对子数 = 1;
        var 最终对子数 = 0;
        var temp = 0;
        if (判断起始 != 0) {
            判断起始--;
        }
        for (var i = 判断起始; i<=牌数; i++) {
            /*
            trace("");
            trace("i="+i);
            trace("对比值"+对比值);
            trace("牌值"+牌组[i][1]);
            */
            if (对比值 != 牌组[i][1]) {
                //trace("牌不同");
                if (对子数>最终对子数) {
                    最终对子数 = 对子数;
                    //trace("最终对子数"+最终对子数);
                }
                对子数 = 1;
                对比值 = 牌组[i][1];
                //牌类如果全散牌为5点。2对为2类或3类
                牌类型++;
            } else {
                //trace("牌同");
                //对子数++;            
                对子数++;
                //对子数追加
                //单对追加
                if (temp == 0 or 对子数>=3) {
                    追加值[0] = 牌组[i][1];
                    追加值[1] = 0;
                    temp = 牌类型;
                } else if (temp != 牌类型) {
                    //双对追加
                    if (追加值[0]>牌组[i][1]) {
                        追加值[1] = 牌组[i][1];
                    } else {
                        //当位置1小于位置2时换位
                        var temp_h = 追加值[0];
                        追加值[0] = 牌组[i][1];
                        追加值[1] = temp_h;
                    }
                }
            }
        }
        if (对子数>最终对子数) {
            最终对子数 = 对子数;
            //trace("最终对子数"+最终对子数);
        }
        //判断类型                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
        var 类型值 = [牌类型, 最终对子数];
        trace("类型值="+类型值);
        if (类型值.toString() == "2,4") {
            //4带1
            最终类型 = 7;
        } else if (类型值.toString() == "2,3") {
            //3带对
            最终类型 = 6;
        } else if (类型值.toString() == (牌数-1)+",3") {
            //3带1
            最终类型 = 3;
        } else if (类型值.toString() == (牌数-1)+",2") {
            //双对
            最终类型 = 2;
        } else if (类型值.toString() == 牌数+",2") {
            //单对
            最终类型 = 1;
        }
        //判断同色     
        if (牌数 == 4) {
            if (最终类型 != 8) {
                var 对比值 = 牌组[0][0];
                for (var i = 1; i<5; i++) {
                    if (对比值 != 牌组[i][0]) {
                        i = 10;
                    }
                }
                //trace(i);
                if (i == 5) {
                    最终类型 = 5;
                }
            }
        }
        //trace("追加值="+追加值);                                                                                                                                                                                                                                                                                                                                                 
        //trace(最终类型);
        trace("牌类型及大小: "+[最终类型, 追加值[0], 追加值[1]]);
        trace("");
        return [最终类型, 追加值[0], 追加值[1]];
    };
    //比较牌大小
    比较牌 = function () {
        //显示各玩家牌级
        比牌级 = new Array();
        for (var i = 1; i<=5; i++) {
            返回值 = 判断牌类型(this["牌组"+i], 0);
            返回值.push("牌组"+i);
            比牌级.push(返回值);
            this["状态"+i].text = 类型数组[返回值[0]];
        }
        比牌级.sortOn([0, 1, 2], 2 | 16);
        //trace(比牌级);
        //trace(比牌级[0][3]);
        //显示
        for (var i = 0; i<5; i++) {
            _root["大小"+比牌级[i][3].charAt(2)].text = "第"+(i+1);
        }
    };
    比较牌();
    //按钮重刷
    button1.onRelease = function() {
        trace("---------------------");
        洗牌();
        比较牌();
    };