Linux Shell編程繪制國(guó)際象棋棋盤(pán)
這兩天在學(xué)習(xí)一些shell編程的知識(shí),在做到一道國(guó)際象棋的題目時(shí),覺(jué)得有些意思,就將它寫(xiě)成博客。
先來(lái)看看國(guó)際象棋棋盤(pán)長(zhǎng)啥樣:
仔細(xì)想了會(huì)棋盤(pán)的分布規(guī)則,這個(gè)問(wèn)題肯定有很多思路,我自己想到的是規(guī)則是
1.將棋盤(pán)行數(shù)作為一個(gè)大循環(huán),循環(huán)8次,每次循環(huán)根據(jù)行號(hào)的奇偶來(lái)確定格子顏色的次序;
2.在單個(gè)行中,循環(huán)8次并判斷列的奇偶數(shù)來(lái)確定打印顏色
以上思路能夠打印出最簡(jiǎn)單的棋盤(pán),但是shell中一個(gè)空格的顯示形狀并非正方形,而且是空格的高度大于寬度。因此需要在單個(gè)棋盤(pán)的行的打印循環(huán)外在加一層控制打印空格行數(shù)的循環(huán),以下圖可能對(duì)理解有些幫助:
上圖通過(guò)echo打印了3個(gè)紅色的空格并非正方形,并且可以看到最后一行的綠色光標(biāo)并非正方形,它構(gòu)成了整個(gè)棋盤(pán)的最小打印單元,那我就需要控制單行中空格個(gè)數(shù)以及由多少行空格組成一個(gè)規(guī)則正方行,如下圖
上圖中,熒光部分seq 2控制打印兩行,熒光%4s部分控制每行打印多少個(gè)空格,通過(guò)\n\c來(lái)控制一次循環(huán)后換行的問(wèn)題。
綜上,怎個(gè)棋盤(pán)就分成當(dāng)行打印由兩個(gè)循環(huán)來(lái)控制寬度和高度,由一個(gè)判斷語(yǔ)句根據(jù)循環(huán)次數(shù)的奇偶來(lái)控制打印顏色;在此基礎(chǔ)上再加上一個(gè)控制打印整個(gè)棋盤(pán)8行的大循環(huán),并且使用一個(gè)判斷語(yǔ)句來(lái)根據(jù)循環(huán)次數(shù)的奇偶數(shù)來(lái)控制每行的顏色和上下行的顏色錯(cuò)開(kāi)。打印結(jié)果如下:
在以上基礎(chǔ)上,實(shí)現(xiàn)用戶可自定義的棋盤(pán)格子的長(zhǎng)寬,以及自定義的顏色。
基本原理是在:
echo -e "\033[1;4$[$COL1]m`printf "%$[$WI]s"`\033[0m\c"
其中變量COL1是棋盤(pán)的第一種顏色,變量WI是棋盤(pán)單個(gè)格子的寬度。高度則帶入給變量賦值后當(dāng)作循環(huán)的次數(shù)。注意這里的寬度/高度最小單元是一個(gè)光標(biāo)的寬度和高度。
高度,寬度的問(wèn)題解決了,還有控制選擇顏色的問(wèn)題。在bash中默認(rèn)顏色有以下幾種:
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 藍(lán)底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天藍(lán)底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
其中的數(shù)字40-47分別代表對(duì)應(yīng)背景顏色,這里不需要打印前景字體所以不需要30-37數(shù)字。另外剔除黑色背景
將幾種顏色作為選擇菜單,通過(guò)select實(shí)現(xiàn)選擇并賦給變量COL1 COL2
完整的效果如下:
以下是完整的代碼,請(qǐng)遵循GPL:
#!/bin/bash #================================================================== # Copyright (C) 2018Westos All rights reserved. # # FileName:chess.sh # Author: 知行至之 # Mail: 291556677@qq.com # Date:2018-05-07 # Description: 知行至之的國(guó)際象棋棋盤(pán) # 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
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Shell腳本中調(diào)用另一個(gè)腳本的三種方式講解
今天小編就為大家分享一篇關(guān)于在Shell腳本中調(diào)用另一個(gè)腳本的三種方式講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-04-04Linux shell條件判斷if中的-a到-z的意思【推薦】
這篇文章主要介紹了Linux shell條件判斷if中的-a到-z的意思,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Linux?ps命令詳解及Linux查看進(jìn)程的操作方法
這篇文章主要介紹了Linux?ps命令詳解,Linux查看進(jìn)程的操作方法,ps命令常用的方式有三種,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12簡(jiǎn)介L(zhǎng)inux中cp和mv搭配{,}在shell當(dāng)中的用法
這篇文章主要介紹了簡(jiǎn)介L(zhǎng)inux中cp和mv搭配{,}在shell當(dāng)中的用法,作者舉了四個(gè)這樣的大括號(hào)擴(kuò)展示例,需要的朋友可以參考下2015-06-06Shell腳本中使用for循環(huán)和cat命令實(shí)現(xiàn)按順序合并文件
這篇文章主要介紹了Shell腳本中使用for循環(huán)和cat命令實(shí)現(xiàn)按順序合并文件,本文先是用sed命令來(lái)實(shí)現(xiàn),發(fā)現(xiàn)不能完成需求,后使用for循環(huán)解決,需要的朋友可以參考下2015-01-01