Linux Shell编程基础---国际象棋棋盘

这两天在学习一些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: [email protected]
#   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

原文地址:http://blog.51cto.com/4081735/2114036

时间: 2024-10-15 02:51:46

Linux Shell编程基础---国际象棋棋盘的相关文章

Linux Shell编程基础

在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐藏  -R 显示文件夹内的内容  -c 按照最后一次修改时间排序  -t 按照修改时间排序输出 echo 显示  -n 不换行 touch  创建一个文件,或者修改文件的访问时间和修改时间 touch -a file 只更改访问时间 -m之更改修改实际那 -t指定特定时间 cp  复制文件 -a 保

Linux shell编程基础笔记

1.shell变量本地变量:a=1    (等号两边不能出现空格)只读变量:readonly 变量名=变量值    (在使用过程中不能更改)声明变量:linux给变量赋值时默认是字符或字符串型,如果需要数值运算,需要事先声明declare 参数 变量名[=变量值]declare的参数: -a:数组 -i:整型 -r:只读设置整型变量,除了用declare -i声明以外,还可以:a=$(($a+1)) or a=$[a+1]清除变量:unset 变量名(只读变量无法清除)访问shell变量:set

linux——shell编程基础

编程语言有两类 强类型:如C语言.数据具有其特定的类型,先声明定义后才能使用.数据运算时必须符合类型要求(如不能把字符串类型数据直接与整型数据做算数运算) 弱类型:如shell.数据默认为字符型,不应事先声明.数据运算时会自动转换数据类型. 变量 变量命名规则: 变量由字母.数字.下划线组成. 不能有数字开头 变量类型:本地变量.环境变量.局部变量.特殊变量(内置).参数变量.只读变量. 注意如果变量没有定义在shell的配置文件,那么他的生命周期只是当前shell进程,一退出就失效. 作用域示

[Linux]shell编程基础/linux基础入门

声明执行程序 #!/bin/bash 用来告诉系统使用/bin/bash 程序来执行该脚本.譬如python 脚本,可以这样写: #!/usr/bin/python 赋值和引用 赋值公式: 变量名=值 取一个变量的值的时候,需要在变量名前面加上$ 符号,譬如: var="hello bash" echo $var 如果出现拼接,而且又没有空格为分隔符,这个时候就需要使用大括号将变量括住,如: num=3 echo "this is the ${num}th" 其输出

Linux shell编程 基础正则表达式

Linux学习之二十一-shell编程基础

Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell 脚本(shell script),是一种为 shell 编写的脚本程序 Shell 编程跟 java.php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了 Linux中的shell种类(shell解释器的种类

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux shell脚本基础学习详细介绍(完整版)二

详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续. Linux shell脚本基础已经被分成好几个部分了,这里对控制流程的内容也就马上讲完了,这是最后一部分关于here document,这里举例稍微有点复杂,我们慢慢来分析这个复杂Linux shell脚本. 6. Here documents 当要将几行文字传递给一个命令时,here docu

shell编程基础一(多种方法求值1+2+..+100)

#SHELL编程基础一(多种方法求值1+2+..+100)##为什么要学好shell shell脚本语言是实现linux系统管理及自动化运维所必备的重要工具,linux系统的底层及基础应用软件的核心大都涉及shell脚本的内容. 每一个合格的linux系统管理员或运维工程师,都需要能够熟练地编写shell脚本语言,并能够阅读系统及各类软件附带的shell脚本内容. 只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的工作,从而为个人的职场发展奠定较好的基础.# 本文的宗旨是熟