我不生产代码
我只是代码的搬运工

php使用cli模式生成圣诞树

今天是圣诞节,看到微博上说npm有个文档里没有写的命令可以生成圣诞树,于是试了一下,真的可以,效果如下:

npm.png

于是想,能不能用php的cli模式也生成一棵圣诞树呢?于是自己就写了一棵,效果如下:

my.png

代码如下:

class tree{
	public $color = [
		'red' => '0;31m',
		'green' => '0;32m',
		'blue' => '0;34m',
		'purple' => '0;35m',
		'yellow' => '1;33m',
	];

	public $charList = ['⁂', '@', '&', '$', '*', '(', ')', '^', '%'];

	public $width = 43;

	public function run()
	{
		$this->draw();
	}

	protected function draw()
	{
		$width = $this->width;
		echo "\n";
		for ($i = 1; $i <= $width/2; $i++) {
			$spaceLength = intval($width/2)-$i;
			if ($i == 1) {
				$this->setSpace($spaceLength);
				$this->setChar('*', 'yellow');
				$this->setSpace($spaceLength, true);
			} else {
				$this->setSpace($spaceLength);
				$this->start();
				$this->setTreeBody(($i-1)*2);
				$this->end();
				$this->setSpace($spaceLength, true);
			}
		}
		echo "\n";
		$this->treeBottom($width);
		$this->coryRight();
	}

	protected function setTreeBody($length)
	{
		for($i=0; $i < $length; $i++) {
			$char = $this->getRoundChar();
			$color = $this->getRoundColor();

			$this->setChar($char, $color);
		}
	}

	protected function start()
	{
		$this->setChar('/', 'green');
	}

	protected function end()
	{
		$this->setChar('\\', 'green');
	} 
	protected function treeBottom($length)
	{
		$center = ceil($length/2);
		for ($i = 0; $i < $length; $i++) {
			switch ($i) {
				case $center : 
					$this->setSpace(1);
					break;
				case $center - 1 :
				case $center + 1 :
					$this->setChar('|', 'green');
					break;	
				default:
					$this->setChar('^', 'green');
					break;
			}
		}

		echo "\n";

		for ($n = 0; $n < 2; $n++) {
			$this->setSpace($center-1);
			$this->setChar('|', 'green');
			$this->setSpace(1);
			$this->setChar('|', 'green');
			echo "\n";
		}		

		echo "\n";
	}

	protected function coryRight()
	{
		$coryRight = "Powerd by Sunwq!";
		$length = strlen($coryRight);
		$spaceLength = ceil(($this->width-$length)/2);
		$this->setSpace($spaceLength);
		for ($i = 0; $i < $length; $i++) {
			$color = $this->getRoundColor(); 
			$char = substr($coryRight, $i, 1);
			$this->setChar($char, $color);
		}
		echo "\n\n\n\n";
	}

	/**
	 * 获取随机颜色
	 * @return string
	 */
	protected function getRoundColor()
	{
		$colorLength = count($this->color);
		return array_keys($this->color)[mt_rand(0, $colorLength -1 )];
	}

	/**
	 * 获取随机字符
	 * @param  boolean $empty 是否有空白
	 * @return string
	 */
	protected function getRoundChar($empty = true)
	{
		$charLength = count($this->charList);
		if (mt_rand(1, 5) <= 2 && $empty) {
			$char = ' ';
		} else {
			$char = $this->charList[mt_rand(0, $charLength - 1)];
		}

		return $char;
	}

	/**
	 * 空白
	 * @param integer $length 空白长度
	 * @param boolean $enter  是否有换行
	 */
	protected function setSpace($length, $enter = false)
	{
		if ($length > 0) {
			echo str_repeat(' ', $length).($enter ? "\n" : '');
		}
	}

	/**
	 * 单个字符
	 * @param string $char  字符
	 * @param string $color 颜色
	 */
	protected function setChar($char, $color)
	{
		$color = isset($this->color[$color]) ? $this->color[$color] : $this->color[$this->getRoundColor()];
		echo "\033[{$color}{$char}\x1B[0m";
	}
}

本文章为本站原创,如转载请注明文章出处:https://www.sviping.com/archives/34

分享到:
上一篇: centos7.0中将php5.6到php7最新版本 下一篇: PHP常见编译错误及解决办法
12