国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > Linux Shell > 正文

Linux Shell編程繪制國(guó)際象棋棋盤

2020-07-27 18:44:59
字體:
供稿:網(wǎng)友

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

先來看看國(guó)際象棋棋盤長(zhǎng)啥樣:

仔細(xì)想了會(huì)棋盤的分布規(guī)則,這個(gè)問題肯定有很多思路,我自己想到的是規(guī)則是

1.將棋盤行數(shù)作為一個(gè)大循環(huán),循環(huán)8次,每次循環(huán)根據(jù)行號(hào)的奇偶來確定格子顏色的次序;
2.在單個(gè)行中,循環(huán)8次并判斷列的奇偶數(shù)來確定打印顏色

以上思路能夠打印出最簡(jiǎn)單的棋盤,但是shell中一個(gè)空格的顯示形狀并非正方形,而且是空格的高度大于寬度。因此需要在單個(gè)棋盤的行的打印循環(huán)外在加一層控制打印空格行數(shù)的循環(huán),以下圖可能對(duì)理解有些幫助:

上圖通過echo打印了3個(gè)紅色的空格并非正方形,并且可以看到最后一行的綠色光標(biāo)并非正方形,它構(gòu)成了整個(gè)棋盤的最小打印單元,那我就需要控制單行中空格個(gè)數(shù)以及由多少行空格組成一個(gè)規(guī)則正方行,如下圖

上圖中,熒光部分seq 2控制打印兩行,熒光%4s部分控制每行打印多少個(gè)空格,通過/n/c來控制一次循環(huán)后換行的問題。

綜上,怎個(gè)棋盤就分成當(dāng)行打印由兩個(gè)循環(huán)來控制寬度和高度,由一個(gè)判斷語(yǔ)句根據(jù)循環(huán)次數(shù)的奇偶來控制打印顏色;在此基礎(chǔ)上再加上一個(gè)控制打印整個(gè)棋盤8行的大循環(huán),并且使用一個(gè)判斷語(yǔ)句來根據(jù)循環(huán)次數(shù)的奇偶數(shù)來控制每行的顏色和上下行的顏色錯(cuò)開。打印結(jié)果如下:

在以上基礎(chǔ)上,實(shí)現(xiàn)用戶可自定義的棋盤格子的長(zhǎng)寬,以及自定義的顏色。
基本原理是在:

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

其中變量COL1是棋盤的第一種顏色,變量WI是棋盤單個(gè)格子的寬度。高度則帶入給變量賦值后當(dāng)作循環(huán)的次數(shù)。注意這里的寬度/高度最小單元是一個(gè)光標(biāo)的寬度和高度。

高度,寬度的問題解決了,還有控制選擇顏色的問題。在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ù)字。另外剔除黑色背景

將幾種顏色作為選擇菜單,通過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ó)際象棋棋盤#  Blog: http://blog.51cto.com/4081735 #  Lisense: GPL ##=================================================================read -p "Please input cell's height: " HIechoread -p "Please input cell's width: " WIecho[[ "$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        ;;    esacdone echoecho "====================="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        ;;    esacdone echoecho "====================="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 filet i++done

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 福贡县| 清远市| 封开县| 龙口市| 紫金县| 台前县| 舒城县| 南澳县| 门头沟区| 定襄县| 丰镇市| 上栗县| 三门县| 崇仁县| 嘉鱼县| 汤原县| 文水县| 镇安县| 衡阳县| 阿拉善左旗| 常山县| 咸阳市| 青田县| 乐安县| 濮阳县| 恩平市| 电白县| 邹城市| 巧家县| 乳源| 静宁县| 南华县| 浪卡子县| 滦南县| 泰兴市| 江安县| 岳阳县| 象州县| 衡阳市| 阳谷县| 卢氏县|