ASCII Python 艺术 # 2
你可能注意到了我之前关于类似任务的提问。我想要复制这个结构:
********************
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********************
如果把它想象成由4个三角形组成的,我可以单独制作每个角,然后把它们一个个放在一起。不过,我不知道该怎么把它们组合成一个更大的结构。我是应该尝试把它们拼在一起,还是像处理单个三角形那样,把这个大结构当成一个整体,逐行来处理呢?我只是觉得把三角形组合成一个更大的东西可能会是个捷径。
5 个回答
1
我会把这个看作一个不同的问题。如果你想象一个点在图形的中心,那么你只想在某个位置打印一个 *
,当到那个位置的“曼哈顿距离”大于边长的一半时。例如,你可以这样做:
import sys
r = 5
for y in range(-r,r+1):
for x in range(-r,r+1):
c = ' ' if (abs(x) + abs(y)) < r else '*'
sys.stdout.write(c)
print
... 这样就会产生这个结果:
***********
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
***********
1
print '\n'.join('*' * (20 - i) + ' ' * (i * 2) + '*' * (20 - i) for i in range(0, 20))
print '\n'.join('*' * i + ' ' * (40 - i * 2) + '*' * i for i in range(0, 20))
这是一个链接,点击后可以访问一个网站,网址是 http://codepad.org/Z46ldEOG。这个网站可能是用来分享代码或者进行代码测试的地方。
2
这个对我有效
w = 20
lines = []
for y in xrange(w / 2, 0, -1):
lines.append("".join(("*" * y, " " * (w - (y * 2)), "*" * y))
lines += reversed(lines[:-1])
for l in lines:
print l
如果你想的话,还可以把它缩小得更多:
lines = ["".join(("*" * y, " " * (w - (y * 2)), "*" * y)) for y in xrange(w / 2, 0, -1)]
print "\n".join(lines + lines[-2::-1])
输出 w = 20:
********************
********* *********
******** ********
******* *******
****** ******
***** *****
**** ****
*** ***
** **
* *
** **
*** ***
**** ****
***** *****
****** ******
******* *******
******** ********
********* *********
********************