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

前言

前几年学习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











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值