Linux Shell編程基礎---國際象棋棋盤

這兩天在學習一些shell編程的知識,在做到一道國際象棋的題目時,覺得有些意思,就將它寫成博客。

先來看看國際象棋棋盤長啥樣:
Linux Shell編程基礎---國際象棋棋盤

仔細想了會棋盤的分佈規則,這個問題肯定有很多思路,我自己想到的是規則是
1.將棋盤行數作爲一個大循環,循環8次,每次循環根據行號的奇偶來確定格子顏色的次序;
2.在單個行中,循環8次並判斷列的奇偶數來確定打印顏色
以上思路能夠打印出最簡單的棋盤,但是shell中一個空格的顯示形狀並非正方形,而且是空格的高度大於寬度。因此需要在單個棋盤的行的打印循環外在加一層控制打印空格行數的循環,以下圖可能對理解有些幫助:
Linux Shell編程基礎---國際象棋棋盤
上圖通過echo打印了3個紅色的空格並非正方形,並且可以看到最後一行的綠色光標並非正方形,它構成了整個棋盤的最小打印單元,那我就需要控制單行中空格個數以及由多少行空格組成一個規則正方行,如下圖,
Linux Shell編程基礎---國際象棋棋盤

上圖中,熒光部分seq 2控制打印兩行,熒光%4s部分控制每行打印多少個空格,通過\n\c來控制一次循環後換行的問題。

綜上,怎個棋盤就分成當行打印由兩個循環來控制寬度和高度,由一個判斷語句根據循環次數的奇偶來控制打印顏色;在此基礎上再加上一個控制打印整個棋盤8行的大循環,並且使用一個判斷語句來根據循環次數的奇偶數來控制每行的顏色和上下行的顏色錯開。打印結果如下:
Linux Shell編程基礎---國際象棋棋盤

在以上基礎上,實現用戶可自定義的棋盤格子的長寬,以及自定義的顏色。
基本原理是在:

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

完整的效果如下:

Linux Shell編程基礎---國際象棋棋盤

以下是完整的代碼,請遵循GPL:

#!/bin/bash

#==================================================================
#  Copyright (C) 2018Westos All rights reserved.
#   
#   FileName:chess.sh
#   Author: 知行至之
#   Mail: [email protected]
#   Date:2018-05-07
#   Description: 知行至之的國際象棋棋盤
#   Blog: https://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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章