ASCII Python 艺术 # 2

-2 投票
5 回答
1145 浏览
提问于 2025-04-17 01:30

你可能注意到了我之前关于类似任务的提问。我想要复制这个结构:

********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ****** 
*******      *******
********    ********
*********  *********
********************

如果把它想象成由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:

********************
*********  *********
********    ********
*******      *******
******        ******
*****          *****
****            ****
***              ***
**                **
*                  *
**                **
***              ***
****            ****
*****          *****
******        ******
*******      *******
********    ********
*********  *********
********************

撰写回答