什么?print 函数还可以打印彩色围棋局面?

百家 作者:CSDN 2021-01-12 17:53:34

作者 | 天元浪子  责编 | 张文
头图 | CSDN 下载自东方 IC
出品 | CSDN(ID:CSDNnews)

尽管 print 函数是初学者最先接触到的第一个 Python 标准函数,但很多人并没有真正了解它。我曾经在《用 print() 函数实现的三个特效》一文中展示了 print 函数的一些实用技巧,受到读者热捧。
今天,我再给大家介绍 print 函数的另一个技巧:打印彩色文字和图案,并在最后定义一个打印围棋局面的函数,可以打印出下图这样的效果。

毕竟是在文本模式下,print 函数支持的彩色比较少,只有 8 种,如下表所示。

前景代码

背景代码

颜色

30

40

31

41

32

42

绿

33

43

34

44

35

45

36

46

37

47

print 支持以下几种显示模式:
  • 0 - 默认
  • 1 - 高亮
  • 4 - 下划线
  • 5 - 闪烁
  • 7 - 反白
  • 8 - 隐藏
  • 22 - 去高亮
  • 24 - 去下划线
  • 25 - 去闪烁
  • 27 - 去反白
  • 28 - 去隐藏
使用 print 函数打印彩色文字或图案时,每一行以前缀“\033[”开始,其后紧跟显示模式、前景色和背景色,三者中间以分号分割,后接小写字母“m”。在显示内容之后,一般以后缀“\033[0m”结束。
print("\033[0;31;47m" + "默认模式,白底红字" + "\033[0m")print("\033[5;34;43m" + "闪烁模式,黄底蓝字" + "\033[0m")
上面的代码显示效果如下图所示。

不过,如果你是在 Windows 环境中运行的话,估计不会出现这个期望的结果。
我猜测这应该是 Python 的一个非常古怪且难以解决的 bug,从 Py2 时代就一直如此。解决方案也很奇葩,使用 os 模块的 system 函数运行一次空命令就 OK 了。代码如下:
import osos.system('')
print("\033[0;31;47m" + "默认模式,白底红字" + "\033[0m")print("\033[5;34;43m" + "闪烁模式,黄底蓝字" + "\033[0m")
好,讲完了预备知识,是时候打印一个彩色的围棋局面了。
我们约定围棋局面用一个二维的 NumPy 数组来表示。黑子、白子、和空,我们分别用 Unicode 字符集中的 0x25cf、0x25cb、和 0x253c 来表示,边角也使用各自的对应符号。这个符号,我们可以在 IDLE 中直观地显示。
>>> chr(0x25cf)'●'>>> chr(0x25cb)'○'>>> chr(0x253c)'┼'>>> chr(0x250c)'┌'>>> chr(0x2510)'┐'
接下来,应用上面这些知识点,就可以写出一个打印围棋局面的函数了。
import numpy as npimport osos.system('')
def show_phase(phase): """显示局面""" for i in range(19): for j in range(19): if phase[i,j] == 1: chessman = chr(0x25cf) elif phase[i,j] == 2: chessman = chr(0x25cb) elif phase[i,j] == 9: chessman = chr(0x2606) else: if i == 0: if j == 0: chessman = '%s '%chr(0x250c) elif j == 18: chessman = '%s '%chr(0x2510) else: chessman = '%s '%chr(0x252c) elif i == 18: if j == 0: chessman = '%s '%chr(0x2514) elif j == 18: chessman = '%s '%chr(0x2518) else: chessman = '%s '%chr(0x2534) elif j == 0: chessman = '%s '%chr(0x251c) elif j == 18: chessman = '%s '%chr(0x2524) else: chessman = '%s '%chr(0x253c) print('\033[0;30;43m' + chessman + '\033[0m', end='') print()
if __name__ == '__main__': phase = np.array([ [0,0,2,1,1,0,1,1,1,2,0,2,0,2,1,0,1,0,0], [0,0,2,1,0,1,1,1,2,0,2,0,2,2,1,1,1,0,0], [0,0,2,1,1,0,0,1,2,2,0,2,0,2,1,0,1,0,0], [0,2,1,0,1,1,0,1,2,0,2,2,2,0,2,1,0,1,0], [0,2,1,1,0,1,1,2,2,2,2,0,0,2,2,1,0,1,0], [0,0,2,1,1,1,1,2,0,2,0,2,0,0,2,1,0,0,0], [0,0,2,2,2,2,1,2,2,0,0,0,0,0,2,1,0,0,0], [2,2,2,0,0,0,2,1,1,2,0,2,0,0,2,1,0,0,0], [1,1,2,0,0,0,2,2,1,2,0,0,0,0,2,1,0,0,0], [1,0,1,2,0,2,1,1,1,1,2,2,2,0,2,1,1,1,1], [0,1,1,2,0,2,1,0,0,0,1,2,0,2,2,1,0,0,1], [1,1,2,2,2,2,2,1,0,0,1,2,2,0,2,1,0,0,0], [2,2,0,2,2,0,2,1,0,0,1,2,0,2,2,2,1,0,0], [0,2,0,0,0,0,2,1,0,1,1,2,2,0,2,1,0,0,0], [0,2,0,0,0,2,1,0,0,1,0,1,1,2,2,1,0,0,0], [0,0,2,0,2,2,1,1,1,1,0,1,0,1,1,0,0,0,0], [0,2,2,0,2,1,0,0,0,0,1,0,0,0,0,1,1,0,0], [0,0,2,0,2,1,0,1,1,0,0,1,0,1,0,1,0,0,0], [0,0,0,2,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0] ], dtype=np.ubyte)     show_phase(phase

拼多多回应员工言论被识别;GitHub 程序员考公指南冲上热榜;Flash Player 中国版将继续更新  | 极客头条

Linux 能否拿下苹果 M1 阵地?

PyOpenCV 实战:借助视觉识别技术实现围棋终局的胜负判定

Firefox 终于对退格键“下手”了!

渲染百万网页,终于找到影响性能的原因了

25 款软件上榜,2020“最佳开源奖” 出炉!

子计算还没搞懂,光子计算又要来统治世界?

在看

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接