设为首页 收藏本站
查看: 686|回复: 0

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

[复制链接]

尚未签到

发表于 2018-8-24 08:45:02 | 显示全部楼层 |阅读模式
  这两天在学习一些shell编程的知识,在做到一道国际象棋的题目时,觉得有些意思,就将它写成博客。
  先来看看国际象棋棋盘长啥样:
DSC0000.jpg

  仔细想了会棋盘的分布规则,这个问题肯定有很多思路,我自己想到的是规则是
  1.将棋盘行数作为一个大循环,循环8次,每次循环根据行号的奇偶来确定格子颜色的次序;
  2.在单个行中,循环8次并判断列的奇偶数来确定打印颜色
  以上思路能够打印出最简单的棋盘,但是shell中一个空格的显示形状并非正方形,而且是空格的高度大于宽度。因此需要在单个棋盘的行的打印循环外在加一层控制打印空格行数的循环,以下图可能对理解有些帮助:
DSC0001.jpg

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

  上图中,荧光部分seq 2控制打印两行,荧光%4s部分控制每行打印多少个空格,通过\n\c来控制一次循环后换行的问题。
  综上,怎个棋盘就分成当行打印由两个循环来控制宽度和高度,由一个判断语句根据循环次数的奇偶来控制打印颜色;在此基础上再加上一个控制打印整个棋盘8行的大循环,并且使用一个判断语句来根据循环次数的奇偶数来控制每行的颜色和上下行的颜色错开。打印结果如下:
DSC0003.jpg

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

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
  完整的效果如下:
DSC0004.jpg

  以下是完整的代码,请遵循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>  
echo

  
read -p "Please input cell's>  
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
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-555761-1-1.html 上篇帖子: shell脚本编程4:正则表达式 下篇帖子: 使用shell一键克隆虚拟机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表