九宫格乃至(2n-1)x (2n-1)宫格代码——绝对原创

上班闲时了解九宫格,就自己写了个2n-1宫格的类:


class Build_Grids

{
     /**
     * @var int 行颜色;
     */
    private $_tdStyle = 'style="border:1px solid;text-align:center;padding:5px 30px 5px 30px;font-size:16px;font-family:arial;background:#FDE9D9;"';


    /**
     * @var int 行颜色;
     */
    private $_tdVlaueStyle = 'style="border:1px solid;text-align:center;padding:5px 30px 5px 30px;font-size:16px;font-family:arial;"';


    /** 
    * @author:linquan 2017-11-28;
    * @param $n int 宫格数;
    * @return multitype:array 
    * @desc 显示宫格;
    */
    public function displayGrid($n)
    {
        $result = $this->getDisplayGrid($n);
        echo $result;
    }


    /** 
    * @author:linquan 2017-11-28;
    * @param $n int 宫格数;
    * @return multitype:array 
    * @desc 获取展示用的宫格html代码;
    */
    public function getDisplayGrid($n)
    {
        $result = $this->_setHeader();
        $result .= $this->_setGrid($n);

        $result .= $this->_setTailer();

        return $result;
    }


   /** 
   * @author:linquan 2017-11-28;
    * @param $n int 宫格数;
    * @return multitype:array 
    * @desc 获取宫格;
    */
    public function getGrid($n)
    {
        if(!is_int($n) || $n<3 ||  $n%2 == 0){
            exit('只能创建奇数宫格且不小于3的整数');
        }


        $x = ($n+1)/2;
        $y = $n;
        $count = $n*$n+1;


        $grids = array();
        $grids[$x][$y] = 1;
        for($i=2; $i<$count; $i++){
            //找到正常情况下的下一个坐标;
            list($x, $y) = $this->_getNextKey($n, $x, $y);

            //判断位置是否冲突,冲突则查找新位置;
            if(isset($grids[$x][$y])){
                list($x, $y) = $this->_getNewKey($n, $x, $y);
            }
            
            //找到新坐标,赋值;
            $grids[$x][$y] = $i;
        }

        return $grids;
    }

    /** 
    * @author:linquan 2017-11-29; 
    * @param $n int 宫格数;
    * @param $x int x坐标;
    * @param $y int y坐标;
    * @return multitype:array 
    * @desc 找到正常情况下的下一个位置;
    */
    private function _getNextKey($n, $x, $y)
    {
        $x++;

        $y++;


        //验证正常移动;
        $x = $x > $n? 1: $x;

        $y = $y > $n? 1: $y;

        return array($x, $y);
    }


    /** 
    * @author:linquan 2017-11-29; 
    * @param $n int 宫格数;
    * @param $x int x坐标;
    * @param $y int y坐标;
    * @return multitype:array 
    * @desc 下一个位置存在数据时,获取原位置下方的位置;
    */
    private function _getNewKey($n, $x, $y)
    {
        $x--;
        $y -= 2;


        //验证正常移动;
        $x = $x < 1? $x+$n: $x;
        $y = $y < 1? $y+$n: $y;

        return array($x, $y);
    }


    /** 
    * @author:linquan 2017-11-28;
    * @param $n int 宫格数;
    * @return multitype:array 
    * @desc 设置宫格值;
    */
    private function _setGrid($n)
    {
        $result = '';
        $grids = $this->getGrid($n);
        $tdAttr = $this->_tdStyle;

        //整理宫格数的html;
        for ($j=$n; $j>0; $j--) {
            $result .= '<tr>';
            for ($i=1; $i<=$n; $i++) {
                $result .= '<td '. $tdAttr .'>'. $grids[$i][$j] .'</td>';
            }
            $result .= '</tr>';
        }

        return $result;
    }


    /**
     * 头部信息;
     * @author:linquan 2017-11-21;
     * @return 表格头的HTML代码;
     */
    private function _setHeader()
    {
        return '<table style="border-collapse:collapse;margin:10px;border:1px solid;" cellpadding="5" cellspacing="0">';
    }




    /**
     * 尾部信息;
     * @author:linquan 2017-11-21;
     * @return 表格尾部的HTML代码;
     */
    private function _setTailer()
    {
        return '</table>';
    }


}


$grids = new Build_Grids();
// p($grids->getGrid(5));

$grids->displayGrid(9);


复制代码直接执行即可展示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值