Linux Shell编程绘制国际象棋棋盘

所属分类: 脚本专栏 / linux shell 阅读数: 2079
收藏 0 赞 0 分享

这两天在学习一些shell编程的知识,在做到一道国际象棋的题目时,觉得有些意思,就将它写成博客。

先来看看国际象棋棋盘长啥样:

仔细想了会棋盘的分布规则,这个问题肯定有很多思路,我自己想到的是规则是

1.将棋盘行数作为一个大循环,循环8次,每次循环根据行号的奇偶来确定格子颜色的次序;
2.在单个行中,循环8次并判断列的奇偶数来确定打印颜色

以上思路能够打印出最简单的棋盘,但是shell中一个空格的显示形状并非正方形,而且是空格的高度大于宽度。因此需要在单个棋盘的行的打印循环外在加一层控制打印空格行数的循环,以下图可能对理解有些帮助:

上图通过echo打印了3个红色的空格并非正方形,并且可以看到最后一行的绿色光标并非正方形,它构成了整个棋盘的最小打印单元,那我就需要控制单行中空格个数以及由多少行空格组成一个规则正方行,如下图

上图中,荧光部分seq 2控制打印两行,荧光%4s部分控制每行打印多少个空格,通过\n\c来控制一次循环后换行的问题。

综上,怎个棋盘就分成当行打印由两个循环来控制宽度和高度,由一个判断语句根据循环次数的奇偶来控制打印颜色;在此基础上再加上一个控制打印整个棋盘8行的大循环,并且使用一个判断语句来根据循环次数的奇偶数来控制每行的颜色和上下行的颜色错开。打印结果如下:

在以上基础上,实现用户可自定义的棋盘格子的长宽,以及自定义的颜色。
基本原理是在:

echo -e "\033[1;4$[$COL1]m`printf "%$[$WI]s"`\033[0m\c"

其中变量COL1是棋盘的第一种颜色,变量WI是棋盘单个格子的宽度。高度则带入给变量赋值后当作循环的次数。注意这里的宽度/高度最小单元是一个光标的宽度和高度。

高度,宽度的问题解决了,还有控制选择颜色的问题。在bash中默认颜色有以下几种:

echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"

其中的数字40-47分别代表对应背景颜色,这里不需要打印前景字体所以不需要30-37数字。另外剔除黑色背景

将几种颜色作为选择菜单,通过select实现选择并赋给变量COL1 COL2

完整的效果如下:

以下是完整的代码,请遵循GPL:

#!/bin/bash
 
#==================================================================
# Copyright (C) 2018Westos All rights reserved.
#  
#  FileName:chess.sh
#  Author: 知行至之
#  Mail: 291556677@qq.com
#  Date:2018-05-07
#  Description: 知行至之的国际象棋棋盘
#  Blog: http://blog.51cto.com/4081735 
#  Lisense: GPL 
#
#=================================================================
read -p "Please input cell's height: " HI
echo
read -p "Please input cell's width: " WI
echo
[[ "$HI" =~ ^[0-9]+$ ]] && [[ "$WI" =~ ^[0-9]+$ ]] || { echo "Invalid argu,Please input Numeric"; exit; }
echo "====================="
PS3="Please choose the Player1's Board Color(1-7): "
select COL1 in red green yellow blue purple skyblue white;do
    case $COL1 in
    red)
        echo Player\'s color is $COL1
        let COL1=1
        break
        ;;
    green)
        echo Player\'s color is $COL1
        let COL1=2
        break
        ;;
    yellow)
        echo Player\'s color is $COL1
        let COL1=3
        break
        ;;
    blue)
        echo Player\'s color is $COL1
        let COL1=4
        break
        ;;
    purple)
        echo Player\'s color is $COL1
                let COL1=5
        break
        ;;
    skyblue)
        echo Player\'s color is $COL1
        let COL1=6
        break
        ;;
    white)
        echo Player\'s color is $COL1
        let COL1=7
        break
        ;;
    esac
done
 
echo
echo "====================="
echo
 
PS3="Please choose the Player2's Board Color(1-7): "
select COL2 in red green yellow blue purple skyblue white;do
    case $COL2 in
    red)
        echo Player2\'s color is $COL2
        let COL2=1
        break
        ;;
    green)
        echo Player2\'s color is $COL2
        let COL2=2
        break
        ;;
    yellow)
        echo Player2\'s color is $COL2
        let COL2=3
        break
        ;;
    blue)
        echo Player2\'s color is $COL2
        let COL2=4
        break
        ;;
    purple)
        echo Player2\'s color is $COL2
        let COL2=5
        break
        ;;
    skyblue)
        echo Player2\'s color is $COL2
        let COL2=6
        break
        ;;
    white)
        echo Player2\'s color is $COL2
        let COL2=7
        break
        ;;
    esac
done
 
echo
echo "====================="
echo
 
for i in {1..8};do
 if [ $[i%2] -eq 1 ];then
    for j in `seq $HI`;do
        for k in {1..8};do
            if [ $[k%2] -eq 1 ];then
                echo -e "\033[1;4$[$COL1]m`printf "%$[$WI]s"`\033[0m\c"
            else
                echo -e "\033[1;4$[$COL2]m`printf "%$[$WI]s"`\033[0m\c"
            fi
            let k++
        done
        echo
        let j++
    done
 else
    for j in `seq $HI`;do
        for k in {1..8};do
            if [ $[k%2] -eq 1 ];then
                echo -e "\033[1;4$[$COL2]m`printf "%$[$WI]s"`\033[0m\c"
            else
                echo -e "\033[1;4$[$COL1]m`printf "%$[$WI]s"`\033[0m\c"
            fi
            let k++
        done
        echo
        let j++
    done
 fi
let i++
done

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Linux shell中的printf的详细用法

这篇文章主要介绍了Linux shell中的printf的详细用法的相关资料,希望能通过本文能帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

shell字符截取命令之cut命令的实例详解

这篇文章主要介绍了shell字符截取命令之cut命令的实例详解的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux 在Bash脚本中怎么关闭文件描述符的实例

这篇文章主要介绍了Linux 在Bash脚本中怎么关闭文件描述符的实例的相关资料,希望通过本文能帮助到大家实现这样的功能,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux使用文本编辑器vi常用命令

vi就是一种功能强大的文本编辑器,而vim则是高级版的vi,不但可以用不同颜色显示文字内容,还能进行诸如shell脚本、C语言程序编辑等功能,可以作为程序编辑器。下面通过本文给大家介绍linux 文本编辑器vi常用命令,一起看看吧
收藏 0 赞 0 分享

Linux 中unzip解压时中文乱码的解决办法

这篇文章主要介绍了Linux 中unzip解压时中文乱码的解决办法的相关资料,这里提供两种解决办法,希望能通过本文帮助到大家,需要的朋友可以参考下
收藏 0 赞 0 分享

Linux shell ftp命令根据文件日期下载文件的方法

最近做项目遇到这样的需求要求ftp获取远程数据的文件,根据文件的创建时间点下载文件。下面小编给大家分享知识点小结,感兴趣的朋友要求看看吧
收藏 0 赞 0 分享

Linux下服务器重启的脚本命令

Linux关闭和重启系统一般使用相同的命令可以实现。下面脚本之家小编给大家带来了Linux下服务器重启的脚本命令,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享

Linux中的特殊符号与正则表达式

这篇文章主要介绍了Linux中的特殊符号与正则表达式,需要的朋友可以参考下
收藏 0 赞 0 分享

利用shell命令统计日志的方法详解

这篇文章主要给大家介绍了关于利用shell命令统计日志的方法,通过这个命令将会对大家的学习或者工作具有一定的参考学习价值,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
收藏 0 赞 0 分享

Linux中的Syslog命令

syslog是Linux系统默认的日志守护进程,默认的syslog配置文件是/etc/syslog.conf文件。接下来通过本文给大家分享Linux中的Syslog命令,感兴趣的朋友一起看看吧
收藏 0 赞 0 分享
查看更多