【问题标题】:What would the most efficient way be to draw a pixel using turtle in Python?在 Python 中使用海龟绘制像素最有效的方法是什么?
【发布时间】:2022-01-14 11:20:10
【问题描述】:

如果我要画马里奥的像素艺术,例如,有很多正方形(请参阅下面的像素艺术),那么最有效的方法是什么?我试过了,但是代码很长,甚至尽我所能用函数把它删减了。

Mario Image

这是我的代码,它可以工作,但效率不高:

import turtle
from turtle import *

speed(0)


def redSquare():
    fillcolor("red")
    begin_fill()
    for i in range(4):
        forward(30)
        right(90)
    end_fill()


def blueSquare():
    fillcolor("royalblue")
    begin_fill()
    for i in range(4):
        forward(30)
        right(90)
    end_fill()


def yellowSquare():
    fillcolor("yellow")
    begin_fill()
    for i in range(4):
        forward(30)
        right(90)
    end_fill()


def skinSquare():
    fillcolor("sandybrown")
    begin_fill()
    for i in range(4):
        forward(30)
        right(90)
    end_fill()


def brownSquare():
    fillcolor("saddlebrown")
    begin_fill()
    for i in range(4):
        forward(30)
        right(90)
    end_fill()


def blackSquare():
    fillcolor("black")
    begin_fill()
    for i in range(4):
        forward(30)
        right(90)
    end_fill()


penup()
goto(100, -150)
pendown()
brownSquare()

penup()
goto(70, -150)
pendown()
brownSquare()

penup()
goto(40, -150)
pendown()
brownSquare()

penup()
goto(10, -150)
pendown()
brownSquare()

penup()
goto(10, -120)
pendown()
brownSquare()

penup()
goto(40, -120)
pendown()
brownSquare()

penup()
goto(70, -120)
pendown()
brownSquare()

penup()
goto(40, -90)
pendown()
blueSquare()

penup()
goto(10, -90)
pendown()
blueSquare()

penup()
goto(-20, -90)
pendown()
blueSquare()

penup()
goto(-20, -60)
pendown()
blueSquare()

penup()
goto(-50, -60)
pendown()
blueSquare()

penup()
goto(10, -60)
pendown()
blueSquare()

penup()
goto(40, -60)
pendown()
blueSquare()

penup()
goto(70, -60)
pendown()
skinSquare()

penup()
goto(100, -60)
pendown()
skinSquare()

penup()
goto(100, -30)
pendown()
skinSquare()

penup()
goto(70, -30)
pendown()
skinSquare()

penup()
goto(40, -30)
pendown()
skinSquare()

penup()
goto(10, -30)
pendown()
blueSquare()

penup()
goto(-20, -30)
pendown()
blueSquare()

penup()
goto(-50, -30)
pendown()
blueSquare()

penup()
goto(-50, 0)
pendown()
blueSquare()

penup()
goto(-20, 0)
pendown()
yellowSquare()

penup()
goto(10, 0)
pendown()
blueSquare()

penup()
goto(40, 0)
pendown()
redSquare()

penup()
goto(70, 0)
pendown()
skinSquare()

penup()
goto(100, 0)
pendown()
skinSquare()

penup()
goto(100, 30)
pendown()
redSquare()

penup()
goto(70, 30)
pendown()
redSquare()

penup()
goto(40, 30)
pendown()
redSquare()

penup()
goto(10, 30)
pendown()
redSquare()

penup()
goto(-20, 30)
pendown()
blueSquare()

penup()
goto(-50, 30)
pendown()
blueSquare()

penup()
goto(-50, 60)
pendown()
redSquare()

penup()
goto(-20, 60)
pendown()
blueSquare()

penup()
goto(10, 60)
pendown()
redSquare()

penup()
goto(40, 60)
pendown()
redSquare()

penup()
goto(70, 60)
pendown()
redSquare()

penup()
goto(10, 90)
pendown()
redSquare()

penup()
goto(-20, 90)
pendown()
redSquare()

penup()
goto(-50, 90)
pendown()
redSquare()

penup()
goto(-50, 120)
pendown()
skinSquare()

penup()
goto(-50, 120)
pendown()
skinSquare()

penup()
goto(-20, 120)
pendown()
skinSquare()

penup()
goto(10, 120)
pendown()
skinSquare()

penup()
goto(40, 120)
pendown()
skinSquare()

penup()
goto(70, 120)
pendown()
skinSquare()

penup()
goto(100, 150)
pendown()
blackSquare()

penup()
goto(70, 150)
pendown()
blackSquare()

penup()
goto(40, 150)
pendown()
blackSquare()

penup()
goto(10, 150)
pendown()
blackSquare()

penup()
goto(-20, 150)
pendown()
skinSquare()

penup()
goto(-50, 150)
pendown()
skinSquare()

penup()
goto(-50, 180)
pendown()
skinSquare()

penup()
goto(-20, 180)
pendown()
skinSquare()

penup()
goto(10, 180)
pendown()
skinSquare()

penup()
goto(40, 180)
pendown()
blackSquare()

penup()
goto(70, 180)
pendown()
skinSquare()

penup()
goto(100, 180)
pendown()
skinSquare()

penup()
goto(130, 180)
pendown()
skinSquare()

penup()
goto(100, 210)
pendown()
skinSquare()

penup()
goto(70, 210)
pendown()
skinSquare()

penup()
goto(40, 210)
pendown()
skinSquare()

penup()
goto(10, 210)
pendown()
blackSquare()

penup()
goto(-20, 210)
pendown()
skinSquare()

penup()
goto(-50, 210)
pendown()
skinSquare()

penup()
goto(-50, 240)
pendown()
skinSquare()

penup()
goto(-20, 240)
pendown()
skinSquare()

penup()
goto(10, 240)
pendown()
blackSquare()

penup()
goto(40, 240)
pendown()
skinSquare()

penup()
goto(100, 270)
pendown()
redSquare()

penup()
goto(70, 270)
pendown()
redSquare()

penup()
goto(40, 270)
pendown()
redSquare()

penup()
goto(10, 270)
pendown()
redSquare()

penup()
goto(-20, 270)
pendown()
redSquare()

penup()
goto(-50, 270)
pendown()
redSquare()

penup()
goto(-50, 300)
pendown()
redSquare()

penup()
goto(-20, 300)
pendown()
redSquare()

penup()
goto(10, 300)
pendown()
redSquare()

penup()
goto(-80, 300)
pendown()
redSquare()

penup()
goto(-110, 300)
pendown()
redSquare()

penup()
goto(-140, 300)
pendown()
redSquare()

penup()
goto(-80, 270)
pendown()
redSquare()

penup()
goto(-110, 270)
pendown()
redSquare()

penup()
goto(-140, 270)
pendown()
redSquare()

penup()
goto(-170, 270)
pendown()
redSquare()

penup()
goto(-170, 240)
pendown()
brownSquare()

penup()
goto(-140, 240)
pendown()
brownSquare()

penup()
goto(-110, 240)
pendown()
brownSquare()

penup()
goto(-80, 240)
pendown()
skinSquare()


penup()
goto(-80, 210)
pendown()
skinSquare()


penup()
goto(-110, 210)
pendown()
skinSquare()


penup()
goto(-140, 210)
pendown()
brownSquare()


penup()
goto(-170, 210)
pendown()
skinSquare()


penup()
goto(-200, 210)
pendown()
brownSquare()


penup()
goto(-200, 180)
pendown()
brownSquare()

penup()
goto(-170, 180)
pendown()
skinSquare()

penup()
goto(-140, 180)
pendown()
brownSquare()

penup()
goto(-110, 180)
pendown()
brownSquare()

penup()
goto(-80, 180)
pendown()
skinSquare()

penup()
goto(-80, 180)
pendown()
skinSquare()

penup()
goto(-80, 150)
pendown()
skinSquare()

penup()
goto(-110, 150)
pendown()
skinSquare()

penup()
goto(-140, 150)
pendown()
skinSquare()

penup()
goto(-170, 150)
pendown()
brownSquare()

penup()
goto(-200, 150)
pendown()
brownSquare()

penup()
goto(-140, 120)
pendown()
skinSquare()

penup()
goto(-110, 120)
pendown()
skinSquare()

penup()
goto(-80, 120)
pendown()
skinSquare()

penup()
goto(-80, 90)
pendown()
redSquare()

penup()
goto(-110, 90)
pendown()
blueSquare()

penup()
goto(-140, 90)
pendown()
redSquare()

penup()
goto(-170, 90)
pendown()
redSquare()

penup()
goto(-200, 60)
pendown()
redSquare()

penup()
goto(-170, 60)
pendown()
redSquare()

penup()
goto(-140, 60)
pendown()
redSquare()

penup()
goto(-110, 60)
pendown()
blueSquare()

penup()
goto(-80, 60)
pendown()
redSquare()

penup()
goto(-80, 30)
pendown()
blueSquare()

penup()
goto(-110, 30)
pendown()
blueSquare()

penup()
goto(-140, 30)
pendown()
redSquare()

penup()
goto(-170, 30)
pendown()
redSquare()

penup()
goto(-200, 30)
pendown()
redSquare()

penup()
goto(-230, 30)
pendown()
redSquare()

penup()
goto(-230, 0)
pendown()
skinSquare()

penup()
goto(-200, 0)
pendown()
skinSquare()

penup()
goto(-170, 0)
pendown()
redSquare()

penup()
goto(-140, 0)
pendown()
blueSquare()

penup()
goto(-110, 0)
pendown()
yellowSquare()

penup()
goto(-80, 0)
pendown()
blueSquare()

penup()
goto(-80, -30)
pendown()
blueSquare()

penup()
goto(-110, -30)
pendown()
blueSquare()

penup()
goto(-140, -30)
pendown()
blueSquare()

penup()
goto(-170, -30)
pendown()
skinSquare()

penup()
goto(-200, -30)
pendown()
skinSquare()

penup()
goto(-230, -30)
pendown()
skinSquare()

penup()
goto(-230, -60)
pendown()
skinSquare()

penup()
goto(-200, -60)
pendown()
skinSquare()

penup()
goto(-170, -60)
pendown()
blueSquare()

penup()
goto(-140, -60)
pendown()
blueSquare()

penup()
goto(-110, -60)
pendown()
blueSquare()

penup()
goto(-80, -60)
pendown()
blueSquare()

penup()
goto(-110, -90)
pendown()
blueSquare()

penup()
goto(-140, -90)
pendown()
blueSquare()

penup()
goto(-170, -90)
pendown()
blueSquare()

penup()
goto(-140, -120)
pendown()
brownSquare()

penup()
goto(-170, -120)
pendown()
brownSquare()

penup()
goto(-200, -120)
pendown()
brownSquare()

penup()
goto(-230, -150)
pendown()
brownSquare()

penup()
goto(-200, -150)
pendown()
brownSquare()

penup()
goto(-170, -150)
pendown()
brownSquare()

penup()
goto(-140, -150)
pendown()
brownSquare()

exitonclick()

【问题讨论】:

    标签: python pixel turtle-graphics python-turtle coding-efficiency


    【解决方案1】:

    最有效的方法是什么?

    我同意@martineau 的一般方法 (+1),但由于您想要最有效的方法,我会更改一些内容。我会使用 stamping 而不是 drawing 来减少代码量并加快速度。我还会使用字母字符串来表示颜色像素,而不是整数数组。而且我会将图像倒置而不是倒置存储。我发现这使得作为触摸打字员输入图像变得更容易,并且即使以编码形式也更容易可视化图像。我会在这个问题上抛出tracer()

    from turtle import Screen, Turtle
    
    PIXEL_SIZE = 30
    CURSOR_SIZE = 20
    
    COLORS = {
        'B': 'blue',
        'K': 'black',
        'O': 'orange',
        'R': 'red',
        'T': 'brown',
        'W': 'white',
        'Y': 'yellow',
    }
    
    PIXELS = [
        "WWWRRRRRRWWWW",
        "WWRRRRRRRRRRW",
        "WWTTTOOOKOWWW",
        "WTOTOOOOKOOOW",
        "WTOTTOOOOKOOO",
        "WTTOOOOOKKKKW",
        "WWWOOOOOOOOWW",
        "WWRRBRRRRWWWW",
        "WRRRBRRBRRRWW",
        "RRRRBBBBRRRRW",
        "OORBYBBYBROOW",
        "OOOBBBBBBOOOW",
        "OOBBBBBBBBOOW",
        "WWBBBWWBBBWWW",
        "WTTTWWWWTTTWW",
        "TTTTWWWWTTTTW",
    ]
    
    WIDTH, HEIGHT = len(PIXELS[0]), len(PIXELS)
    
    screen = Screen()
    screen.setup((WIDTH + 3) * PIXEL_SIZE, (HEIGHT + 3) * PIXEL_SIZE)
    screen.tracer(False)
    
    turtle = Turtle()
    turtle.hideturtle()
    turtle.shape('square')
    turtle.shapesize(PIXEL_SIZE / CURSOR_SIZE)
    turtle.penup()
    
    x0 = -WIDTH/2 * PIXEL_SIZE
    y0 = HEIGHT/2 * PIXEL_SIZE
    
    for i, row in enumerate(PIXELS):
        turtle.setposition(x0, y0 - i * PIXEL_SIZE)
    
        for pixel in row:
            turtle.color(COLORS[pixel])
            turtle.stamp()
            turtle.forward(PIXEL_SIZE)
    
    screen.tracer(True)
    screen.exitonclick()
    

    这种方法甚至适用于文字像素:

    【讨论】:

    • 我同意,使用turtle.stamp() 可能是使用turtle 绘制像素的最快方法之一。你还对我的帖子进行了许多其他有用的改进——所以你的回答得到了我的投票。
    • 非常感谢您的好评!我是初学者,想知道是哪一部分让乌龟立即创建了像素艺术,而不是实际看到绘制它?
    • @JacobVoss,通常海龟会减慢绘图速度,以便您可以看到它的发生,这称为 tracing。当我使用tracer(False) 时,我关闭了跟踪,但我希望系统知道何时向用户显示绘图的当前状态,即update() 调用。其他操作可能会导致更新,因此不要假设您可以完全控制它。当您准备好向您的用户显示您的更改时,请务必致电 update()
    【解决方案2】:

    最快的方法可能是定义一个函数,在当前海龟位置绘制适当大小的像素形状,然后在一对嵌套的for 循环中重复调用。

    这是一个例子:

    import turtle
    
    COLORS = {0: 'white',
              1: 'red',
              2: 'blue',
              3: 'green',
              4: 'black',
              5: 'yellow',
              6: 'orange'}
    
    PIXELS = [[0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 4, 0, 4, 0, 0],
              [0, 0, 0, 2, 3, 0, 0, 0],
              [0, 0, 0, 3, 2, 0, 0, 0],
              [0, 5, 4, 4, 4, 4, 4, 0],
              [0, 0, 6, 6, 6, 6, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0]]
    
    WIDTH, HEIGHT = len(PIXELS[0]), len(PIXELS)
    
    scn = turtle.Screen()
    pen = turtle.Turtle()
    
    def pixel():
        for i in range(4):
            pen.forward(30)
            pen.left(90)
        pen.forward(30)
    
    
    if __name__ == "__main__" :
        scn.setup(600, 600)
        pen.speed(0)
        pen.hideturtle()
        for i in range(WIDTH):
            pen.up()
            pen.setpos(0, 30*i)  # Row position.
            pen.down()
            row = PIXELS[i]
            for j in range(HEIGHT):
                col = COLORS[row[j]]
                pen.fillcolor(col)
                pen.begin_fill()
                pixel()
                pen.end_fill()
    
        print('done - press any key to exit')
        turtle.onkeypress(exit)
        turtle.listen()
        turtle.done()
    

    结果:

    【讨论】:

      【解决方案3】:

      你可以像这样定义一个叫做 square 的函数:

      def square():
             for x in range(4):
                   t.forward(20)
                   t.right(90)
      

      绘制一个 20x20 的正方形。

      现在您可以使用它来绘制任何颜色,如下例所示,这将形成一条 4 像素的水平线,就像俄罗斯方块一样:

      def Tetris_Piece_1():
        for x in range(4):
            t.begin_fill()
            square()
            t.color("Blue")
            t.end_fill()
            t.color("Black")
            t.forward(20) 
      

      我认为它不能再优化了,还请查看本教程:(https://replit.com/talk/learn/How-to-draw-Pixel-Art-on-Python-with-Turtle/7556)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-31
        • 2018-02-08
        • 1970-01-01
        • 2011-04-17
        • 2012-11-18
        • 1970-01-01
        • 2010-09-30
        • 1970-01-01
        相关资源
        最近更新 更多