• 2014年七月写过的代码,现在看来,还有待改进呀


    那个时候闲来无事,随手写了一个斗地主的逻辑

    <?php
    
    /**
    
     * Created by JetBrains PhpStorm.
    
     * User: Administrator
    
     * Date: 14-7-30
    
     * Time: 下午3:49
    
     * To change this template use File | Settings | File Templates.
    
     */
    
    
    
    class DemoAction extends Action{
    
        private $order = array();
    
        function _initialize(){
    
            $this->rule();
    
        }
    
        function index(){
    
            $array = $this->getAllCard();
    
            shuffle($array);
    
            $i = 0;
    
            //分牌
    
            foreach($array as $val){
    
                $j = ++$i%3;
    
                $result[$j][] = $val;
    
            }
    
            //三张底牌
    
            $other = array();
    
            $other[0] = array_pop($result[0]);
    
            $other[1] = array_pop($result[1]);
    
            $other[2] = array_pop($result[2]);
    
            //print_r($result[0]);
    
            $result2[0] = $this->sort($result[0]);
    
            $res = $this->insert_three($result2[0],$other);
    
            print_r($res);die;
    
            $result2[1] = $this->sort($result[1]);
    
            $result2[2] = $this->sort($result[2]);
    
            print_r($result2);
    
            print_r($other);
    
        }
    
        //排序
    
        function sort($cards){
    
            $temp = array();
    
            foreach($cards as $k=>$v){
    
                $temp[$v['num']][] = $k;
    
            }
    
            $temp2 = array();
    
            foreach($this->order as $val){
    
                $temp[$val] && $temp2[] = $temp[$val];
    
            }
    
            $temp3 = array();
    
            foreach($temp2 as $k2=>$v2){
    
                foreach($v2 as $k3=>$v3){
    
                    $temp3[] = $cards[$v3];
    
                }
    
            }
    
            return $temp3;
    
        }
    
        //抢地主之后,将底牌插入序列
    
        function insert_three($array,$three){
    
            foreach($three as $val){
    
                $temp[$val['num']][] = $val['color'];
    
            }
    
            $nums = array_keys($temp);
    
            $new_array = array();
    
            $insert1 = true;
    
            $insert2 = true;
    
            $insert3 = true;
    
            foreach($array as $key2=>$val2){
    
                $new_array[] = $val2;
    
                $next_key = $key2+1;
    
                if($insert1){
    
                    $begin_compare = $this->compare_num($val2['num'],$nums[0]);
    
                    $end_compare = $this->compare_num($nums[0],$array[$next_key]['num']);
    
                    if($begin_compare<=0 && $end_compare<=0){
    
                        foreach($temp[$nums[0]] as $color){
    
                            $new_array[] = array('num'=>$nums[0],'color'=>$color);
    
                        }
    
                        unset($nums[0]);
    
                        $insert1 = false;
    
                    }
    
                }
    
                if($nums[1] && $insert2){
    
                    $begin_compare = $this->compare_num($val2['num'],$nums[1]);
    
                    $end_compare = $this->compare_num($nums[1],$array[$next_key]['num']);
    
                    if($begin_compare<=0 && $end_compare<=0){
    
                        foreach($temp[$nums[1]] as $color){
    
                            $new_array[] = array('num'=>$nums[1],'color'=>$color);
    
                        }
    
                        unset($nums[1]);
    
                        $insert2 = false;
    
                    }
    
                }
    
                if($nums[2] && $insert3){
    
                    $begin_compare = $this->compare_num($val2['num'],$nums[2]);
    
                    $end_compare = $this->compare_num($nums[2],$array[$next_key]['num']);
    
                    if($begin_compare<=0 && $end_compare<=0){
    
                        foreach($temp[$nums[2]] as $color){
    
                            $new_array[] = array('num'=>$nums[2],'color'=>$color);
    
                        }
    
                        unset($nums[2]);
    
                        $insert3 = false;
    
                    }
    
                }
    
            }
    
            $last_count = count($nums);
    
            if($last_count!=0){
    
                if($last_count==1){
    
                    $this_num = current($nums);
    
                    foreach($temp[$this_num] as $color){
    
                        $new_array[] = array('num'=>$this_num,'color'=>$color);
    
                    }
    
                }else{
    
                    sort($nums);
    
                    foreach($nums as $k=>$v){
    
                        foreach($temp[$v] as $color){
    
                            $new_array[] = array('num'=>$v,'color'=>$color);
    
                        }
    
                    }
    
                }
    
            }
    
            return $new_array;
    
        }
    
        function getAllCard(){
    
            return array(
    
                array("num"=>1,"color"=>1),
    
                array("num"=>1,"color"=>2),
    
                array("num"=>1,"color"=>3),
    
                array("num"=>1,"color"=>4),
    
                array("num"=>2,"color"=>1),
    
                array("num"=>2,"color"=>2),
    
                array("num"=>2,"color"=>3),
    
                array("num"=>2,"color"=>4),
    
                array("num"=>3,"color"=>1),
    
                array("num"=>3,"color"=>2),
    
                array("num"=>3,"color"=>3),
    
                array("num"=>3,"color"=>4),
    
                array("num"=>4,"color"=>1),
    
                array("num"=>4,"color"=>2),
    
                array("num"=>4,"color"=>3),
    
                array("num"=>4,"color"=>4),
    
                array("num"=>5,"color"=>1),
    
                array("num"=>5,"color"=>2),
    
                array("num"=>5,"color"=>3),
    
                array("num"=>5,"color"=>4),
    
                array("num"=>6,"color"=>1),
    
                array("num"=>6,"color"=>2),
    
                array("num"=>6,"color"=>3),
    
                array("num"=>6,"color"=>4),
    
                array("num"=>7,"color"=>1),
    
                array("num"=>7,"color"=>2),
    
                array("num"=>7,"color"=>3),
    
                array("num"=>7,"color"=>4),
    
                array("num"=>8,"color"=>1),
    
                array("num"=>8,"color"=>2),
    
                array("num"=>8,"color"=>3),
    
                array("num"=>8,"color"=>4),
    
                array("num"=>9,"color"=>1),
    
                array("num"=>9,"color"=>2),
    
                array("num"=>9,"color"=>3),
    
                array("num"=>9,"color"=>4),
    
                array("num"=>10,"color"=>1),
    
                array("num"=>10,"color"=>2),
    
                array("num"=>10,"color"=>3),
    
                array("num"=>10,"color"=>4),
    
                array("num"=>11,"color"=>1),
    
                array("num"=>11,"color"=>2),
    
                array("num"=>11,"color"=>3),
    
                array("num"=>11,"color"=>4),
    
                array("num"=>12,"color"=>1),
    
                array("num"=>12,"color"=>2),
    
                array("num"=>12,"color"=>3),
    
                array("num"=>12,"color"=>4),
    
                array("num"=>13,"color"=>1),
    
                array("num"=>13,"color"=>2),
    
                array("num"=>13,"color"=>3),
    
                array("num"=>13,"color"=>4),
    
                array("num"=>14,"color"=>1),
    
                array("num"=>14,"color"=>2),
    
            );
    
        }
    
    
    
        function rule(){
    
            $this->order = array(3,4,5,6,7,8,9,10,11,12,13,1,2,14);
    
        }
    
        //根据规则比较牌的大小
    
        function compare_num($num1,$num2){
    
            if($num1===false)return false;
    
            $index1 = array_search($num1,$this->order);
    
            $index2 = array_search($num2,$this->order);
    
            if($index1>$index2)return 1;
    
            if($index1<$index2)return -1;
    
            return 0;
    
        }
    
        //炸弹
    
        function is_bomb($cards){
    
            $count = $cards[0]['num']==14?2:4;
    
            if(count($cards)!=$count) return false;
    
            if(!empty($cards[0]['num'])
    
                && $cards[0]['num']==$cards[1]['num']
    
                && $cards[0]['num']==$cards[2]['num']
    
                && $cards[0]['num']==$cards[3]['num']){
    
                return true;
    
            }
    
            return false;
    
        }
    
        //炸弹KO
    
        function hit_bomb($initiative,$passive){
    
            if( $this->is_bomb($initiative)
    
                && $this->is_bomb($passive)){
    
                if($this->compare_num($initiative[0]['num'],$passive[0]['num'])==1){
    
                    return true;
    
                }else{
    
                    return false;
    
                }
    
            }
    
            return null;
    
        }
    
        //单牌$cards = array([0]=array(....));
    
        function is_one($cards){
    
            if(count($cards)!=1)return false;
    
            return true;
    
        }
    
        //单牌KO $passive是单牌
    
        function hit_one($initiative,$passive){
    
            if($this->is_one($initiative)){
    
                if($this->compare_num($initiative[0]['num'],$passive[0]['num'])==1){
    
                    return true;
    
                }
    
            }elseif($this->is_bomb($initiative))
    
                return true;
    
        }
    
        //对牌
    
        function is_twins($cards){
    
            if(count($cards)!=2)return false;
    
            return (!empty($cards[0]['num']) && $cards[0]['num']==$cards[1]['num'] && $cards[0]['num']!=14);
    
        }
    
    
    
        /**
    
         * 对牌KO,要求$passive必须是is_twins
    
         * @param $initiative主动
    
         * @param $passive被动
    
         */
    
        function hit_twins($initiative,$passive){
    
            //if($this->is_twins($passive)){
    
                if($this->is_twins($initiative)){
    
                    if($this->compare_num($initiative[0]['num'],$passive[0]['num'])==1){
    
                        return true;
    
                    }
    
                }elseif($this->is_bomb($initiative))
    
                    return true;
    
            //}
    
            //return null;
    
        }
    
        //三个X
    
        function is_three($cards){
    
            if(count($cards)!=3)return false;
    
            return (!empty($cards[0]['num']) && $cards[0]['num']==$cards[1]['num'] && $cards[0]['num']==$cards[2]['num']);
    
        }
    
        //要求$passive必须是is_three
    
        function hit_three($initiative,$passive){
    
            //if($this->is_three($passive)){
    
                if($this->is_three($initiative)){
    
                    if($this->compare_num($initiative[0]['num'],$passive[0]['num'])==1){
    
                        return true;
    
                    }
    
                }elseif($this->is_bomb($initiative))
    
                    return true;
    
            //}
    
            //return null;
    
        }
    
        //三带一
    
        function is_three_one($cards){
    
            if(count($cards)!=4)return false;
    
            $tongji = array();
    
            foreach($cards as $ca){
    
                ++$tongji[$ca['num']];
    
            }
    
            if(count($tongji)!=2)return false;
    
            return array_search(3,$tongji);
    
        }
    
        //$passive_num 由is_three_one计算得来
    
        function hit_three_one($initiative,$passive_num){
    
            if($this->compare_num($this->is_three_one($initiative),$passive_num)==1)
    
            {
    
                    return true;
    
            }elseif($this->is_bomb($initiative))
    
                return true;
    
        }
    
        //三代二
    
        function is_three_two($cards){
    
            if(count($cards)!=5)return false;
    
            $tongji = array();
    
            foreach($cards as $ca){
    
                ++$tongji[$ca['num']];
    
            }
    
            if(count($tongji)!=2)return false;
    
            if(array_search(2,$tongji)===false)return false;
    
            return array_search(3,$tongji);
    
        }
    
        //$passive_num 由is_three_two计算得来
    
        function hit_three_two($initiative,$passive_num){
    
            if($this->compare_num($this->is_three_two($initiative),$passive_num)==1)
    
            {
    
                return true;
    
            }elseif($this->is_bomb($initiative))
    
                return true;
    
        }
    
        //四带二
    
        function is_four_two($cards){
    
            if(count($cards)!=6)return false;
    
            $tongji = array();
    
            foreach($cards as $ca){
    
                ++$tongji[$ca['num']];
    
            }
    
            if(count($tongji)!=2)return false;
    
            if(array_search(2,$tongji)===false)return false;
    
            return array_search(4,$tongji);
    
        }
    
        //$passive_num 由is_four_two计算得来
    
        function hit_four_two($initiative,$passive_num){
    
            if($this->is_bomb($initiative))
    
                return true;
    
            if($this->compare_num($this->is_four_two($initiative),$passive_num)==1)
    
            {
    
                return true;
    
            }
    
        }
    
        //顺子
    
        function is_sequence($cards){
    
            $count = count($cards);
    
            if($count<5)return false;
    
            $nums = array();
    
            foreach($cards as $ca){
    
                //小二,王都不算顺子牌
    
                if(in_array($ca['num'],array(2,14)))return false;
    
                $nums[] = $ca['num'];
    
            }
    
            $min = min($nums);
    
            if($min==1)return false;
    
            $index = array_search($min,$this->rule);
    
            for($i=1;$i<$count;++$i)
    
                if(!in_array($this->rule[++$index],$nums))return false;
    
            return $min;
    
        }
    
        //$passive_num 由is_sequence计算得来
    
        function hit_sequence($initiative,$passive_num){
    
            if($this->is_bomb($initiative))
    
                return true;
    
            if($this->compare_num($this->is_sequence($initiative),$passive_num)==1)
    
            {
    
                return true;
    
            }
    
        }
    
        //多联对
    
        function is_more_twins($cards){
    
            $count = count($cards);
    
            if($count<6 || $count%2==1)return false;
    
            $nums = $tongji = array();
    
            foreach($cards as $ca){
    
                //小二,王都不算顺子牌
    
                if(in_array($ca['num'],array(2,14)))return false;
    
                $nums[] = $ca['num'];
    
                ++$tongji[$ca['num']];
    
            }
    
            foreach($tongji as $v){
    
                if($v!=2)return false;
    
            }
    
            $min = min($nums);
    
            if($min==1)return false;
    
            $index = array_search($min,$this->rule);
    
            $count = $count/2;
    
            for($i=1;$i<$count;++$i)
    
                if(!in_array($this->rule[++$index],$nums))return false;
    
            return $min;
    
        }
    
        //$passive_num 由is_more_twins计算得来
    
        function hit_more_twins($initiative,$passive_num){
    
            if($this->is_bomb($initiative))
    
                return true;
    
            if($this->compare_num($this->is_more_twins($initiative),$passive_num)==1)
    
            {
    
                return true;
    
            }
    
        }
    
        //飞机
    
        function is_plan($cards){
    
            $count = count($cards);
    
            if($count<6)return false;
    
            $nums = $tongji = array();
    
            foreach($cards as $ca){
    
                //王都不算飞机牌
    
                if(in_array($ca['num'],array(14)))return false;
    
                $nums[] = $ca['num'];
    
                ++$tongji[$ca['num']];
    
            }
    
            $main = array();
    
            $append_count = 0;
    
            foreach($tongji as $k=>$v){
    
                if($v>3)
    
                    return false;
    
                elseif($v==3)
    
                    $main[] = $k;
    
                else
    
                    ++$append_count;
    
            }
    
            $main_count = count($main);
    
            if($main_count!=$append_count)return false;
    
            $min = min($main);
    
            $index = array_search($min,$this->rule);
    
            $count = $count/2;
    
            for($i=1;$i<$count;++$i)
    
                if(!in_array($this->rule[++$index],$nums))return false;
    
            return $min;
    
        }
    
        function hit_plan($initiative,$passive_num){
    
            if($this->is_bomb($initiative))
    
                return true;
    
            if($this->compare_num($this->is_plan($initiative),$passive_num)==1)
    
            {
    
                return true;
    
            }
    
        }
    
    }

    现在看来,当时还是挺不规范的

  • 相关阅读:
    2019 icpc南昌全国邀请赛-网络选拔赛J题 树链剖分+离线询问
    Android小项目之十二 设置中心的界面
    【Mood-5】14条建议,使你的IT职业生涯更上一层楼
    【Android 界面效果15】Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)
    单线程模型中Message、Handler、Message Queue、Looper之间的关系
    140个google面试题
    Android小项目之十一 应用程序的主界面
    Android小项目之十 应用程序更新的签名问题
    Android小项目之九 两种上下文的区别
    Android小项目之八 界面细节
  • 原文地址:https://www.cnblogs.com/tu6ge/p/5547654.html
Copyright © 2020-2023  润新知