如何用Python的标准print函数打印一个彩色的围棋局面?

举报
天元浪子 发表于 2021/07/26 22:31:29 2021/07/26
【摘要】 尽管print函数是初学者最先接触到的第一个Python标准函数,但很多人并没有真正了解它。我曾经在《用 print() 函数实现的三个特效》一文中展示了print函数的一些实用技巧,受到读者热捧。今天,我再给大家介绍print函数的另一个技巧:打印彩色文字和图案,并在最后定义一个打印围棋局面的函数,可以打印出下图这样的效果。 毕竟是在文本模式下,print函数支...

尽管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")

  
 
  • 1
  • 2

上面的代码显示效果如下图所示。
在这里插入图片描述

不过,如果你是在Windows环境中运行的话,估计不会出现这个期望的结果。我猜测这应该是Python的一个非常古怪且难以解决的bug,从Py2时代就一直如此。解决方案也很奇葩,使用os模块的system函数运行一次空命令就OK了。代码如下:

import os
os.system('')

print("\033[0;31;47m" + "默认模式,白底红字" + "\033[0m")
print("\033[5;34;43m" + "闪烁模式,黄底蓝字" + "\033[0m")

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

好,讲完了预备知识,是时候打印一个彩色的围棋局面了。我们约定围棋局面用一个二维的NumPy数组来表示。黑子、白子、和空,我们分别用Unicode字符集中的0x25cf、0x25cb、和0x253c来表示,边角也使用各自的对应符号。这个符号,我们可以在IDLE中直观地显示。

>>> chr(0x25cf)
'●'
>>> chr(0x25cb)
'○'
>>> chr(0x253c)
'┼'
>>> chr(0x250c)
'┌'
>>> chr(0x2510)
'┐'

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

接下来,应用上面这些知识点,就可以写出一个打印围棋局面的函数了。

import numpy as np
import os
os.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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

文章来源: xufive.blog.csdn.net,作者:天元浪子,版权归原作者所有,如需转载,请联系作者。

原文链接:xufive.blog.csdn.net/article/details/112363412

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。