棋牌游戏 梭哈发牌和比牌算法

//梭哈发牌和比牌算法
演示如下:
Flash动画


牌形 = 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("---------------------");
    洗牌();
    比较牌();
};

//=====================================
//
//转载请注明出处:羽柴 鬼铃-blog  
//     www.ycflash.com/blog
//
//=====================================
下载文件 点击下载此文件


[本日志由 admin 于 2008-05-08 06:35 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 2 | 引用: 0 | 查看次数: 3460
回复回复Flying[2007-11-08 09:25 PM | del]
谢谢
回复回复axue[2007-09-08 11:30 AM | del]
很不错,有很大的帮助,我是个初学者,希望和柴兄交个朋友,有问题的时候可以交流下。QQ:5484219
发表评论
你没有权限发表评论!