shell 最短代码打印标准国际棋盘

    技术2022-07-11  93

    前言

    前几年学习shell时候写的一个打印国际棋盘的一个小脚本,自我感觉实现方法还是蛮巧妙的,拿出来分享下 查看了网上一些写法,大部分是中规中矩的 采用套用三层循环的写法,倒也是可以实现,但是打印的效率就不敢恭维了,当打印的网格较大时,你可以明显的看到打印的轨迹,在一排一排的打印 而我的实现方法是用两层循环,然后根据奇数行和偶数行两个模块的打印规律来打印,效率提升明显哦,具体实现逻辑,可以参看代码

    几行代码打印棋盘

    代码展示

    for((i=1,a=40,b=47; i<=24;i++ )); do for((j=1;j<=4;j++ )) ;do echo -ne "\e[$a;1m \e[0m\e[$b;1m \e[0m" done [ $[i%3] -eq 0 ] && { a=$[a^b];b=$[a^b];a=$[a^b]; } echo done echo " This is the chessboard of the value=3 " echo

    效果图

    如果你认为这就完了,那你就图样图撕破斯了,我们的目标可不是简单打印个棋盘就ok,我们的目标是可以根据用户的需求,定制一个棋盘出来,比如打印一个红白相间的,边长为3个单位空格的棋盘 那问题来了,你说的单位到底多大,我第一次运行脚本怎么会知道,别着急,在运行脚本的 时候,第一次会打印出一个样板来供你参考 当然,你可能说你不关心棋盘大小,你可以直接回车,你会收到一个默认的棋盘单位为1 黑白相间的棋盘,因为大小都不想设置的人,大概率也不会关系棋盘的颜色,只是想试验下这个脚本是不是可用,那后面的选择颜色的环境,也就帮你省略了

    那么假如你想要一个大大的棋盘,好满足你 看来你是一个有梦想的咸鱼,那么请输入你期望的第一个单元的颜色,当然如果不想输入,也可以,反正有默认值,那第二个你也不用输了,因为我知道第一个单元颜色都不关心的人,大概率也不关心第二个了,哈哈 那么假如你目的明确的想要一个红白相间的,单位为4的棋盘,那么你就依次输入,选择对应的颜色就ok了,如果你是一个选择恐惧症患者,这个R|r选择将为你带来福音,随意一个颜色

    完整的棋盘代码

    代码展示

    #!/bin/bash # #******************************************************************** #Author: nieshaokai #QQ: 1195831127 #Date: 2018-05-08 #FileName: chess.sh #URL: http://www.kilsilent.com #Description: Print international board #Copyright (C): 2018 All rights reserved #******************************************************************** # n 棋盘单元的边长,单位是一个空格的长度 # N 棋盘的行数 # A 第一行第一列单元色 # B 第一行第二列单元色 # Space 棋盘单元空格的大小 #值为3的方块大小展示 #------------------------------------------------------------------------------------------ for((i=1,a=40,b=47; i<=24;i++ )); do for((j=1;j<=4;j++ )) ;do echo -ne "\e[$a;1m \e[0m\e[$b;1m \e[0m" done echo [ $[i%3] -eq 0 ] && { a=$[a^b];b=$[a^b];a=$[a^b]; } done echo " This is the chessboard of the value=3 " echo #用户输入模块 #选择方块大小 #------------------------------------------------------------------------------------------ while true; do read -p "please enter the checkerboard cell size(default 1): " -t 30 n if [ -z $n ];then echo break #用户输入为空,后两项直接跳过,赋给默认值 elif [[ $n =~ [0-9] ]] && [ $n -le 10 ] ;then break else echo -e "\e[31;1mplease enter a reson number eg '1-10'\e[0m" fi echo done #选择第一个方块的颜色 #------------------------------------------------------------------------------------------ while true;do if [ -z $n ];then n=1 #判断第一项是不是空,如果是空,则默认此项也用默认项,这里给单元块大小赋默认值 n=1 break echo fi #打印颜色选择列表 echo -e "\e[30;1m40 ----- black\e[0m" echo -e "\e[31;1m41 ----- red \e[0m" echo -e "\e[32;1m42 ----- green \e[0m" echo -e "\e[33;1m43 ----- yellow\e[0m" echo -e "\e[34;1m44 ----- blue \e[0m" echo -e "\e[35;1m45 ----- purpel\e[0m" echo -e "\e[36;1m46 -----sky-blue \e[0m" echo -e "\e[37;1m47 ----- white\e[0m" echo -e "\e[$[RANDOM%8+40];$[RANDOM%8+30]mR|r ----- RANDOM\e[0m" read -p "please choose the First unit color(default 40) : " -t 30 A if [ -z $A ];then echo break elif [[ $A =~ [0-9] ]] && [ $A -le 47 ] && [ $A -ge 40 ];then break elif [[ $A =~ [Rr] ]];then A=$[RANDOM%8+40] echo random-value is $A break else echo -e "\e[31;1mplease enter the number listed\e[0m" echo fi done #选择第二个方块的颜色 #------------------------------------------------------------------------------------------ while true;do if [ -z $A ];then A=40 # 判断第一个方块颜色是不是默认值,如果默认,那么此项也启用默认值,并且为两个方块赋值。 B=47 break fi read -p "please choose the Second unit color(default 47) : " -t 30 B if [ -z $B ];then # 这里判断当前输入是不是用户选择了默认,或者输入超时 B=47 break elif [[ $B =~ [0-9] ]] && [ $B -le 47 ] && [ $B -ge 40 ];then break elif [[ $B =~ [Rr] ]];then #是否采用随机值 B=$[RANDOM%8+40] echo random-value is $B break else echo -e "\e[31;1mplease enter the number listde\e[0m" fi done echo #-主函数棋盘体打印--------------------------------------------- # i:行数 # j:列数 #打印象棋谱的单元块 for ((i=1 ;i<=${n}*2 ;i++)); do Space=${Space}`echo -n " "` done for((i=1; i<=$n*8;i++ ));do for((j=1;j<=4;j++ ));do echo -ne "\e[$A;1m${Space}\e[$B;1m${Space}\e[0m" done echo if [ $[i%n] -eq 0 ];then A=$[A^B];B=$[A^B];A=$[A^B] fi done
    Processed: 0.011, SQL: 9