[Python] 用 turtle 来绘制国际象棋棋盘(不含棋子)

86 阅读2分钟

背景

turtle — Turtle graphics 中提供了关于 turtle\text{turtle} 模块的介绍。我想用 turtle\text{turtle} 来生成些简单的图案,以巩固学习的效果。最近我经常下国际象棋,于是想到可以用 turtle\text{turtle} 来绘制国际象棋的棋盘。

正文

基本的分析

国际象棋的棋盘长这样 ⬇️

image.png

为了降低难度,我们不关心以下内容

  • 棋子
  • 棋盘边上用于表示坐标的数字和字母

那么我们的目标就变为,绘制 8×88\times 8 个黑白相间的正方形格子(左上角的格子是白色的)。考虑到只有 8×88\times 8 个格子,我们可以遍历 8888 列,绘制对应的格子(需要计算每个格子的颜色)。

代码

有了上述思路后,结合 turtle — Turtle graphics 中的文档,不难写出对应的 Python\text{Python} 代码。

我写的版本如下(trae 提供了一些帮助)⬇️

import turtle

CELL_SIZE = 50
INIT_X = -200
INIT_Y = 200
ROW_CNT = 8
COL_CNT = 8


def calculate_color(r, c):
    if (r + c) % 2 == 0:
        return "white"
    return "black"


def main():
    turtle.title("chessboard")
    turtle.bgcolor("lightgreen")
    turtle.speed('fastest')
    turtle.pensize(1)

    for row in range(ROW_CNT):
        for col in range(COL_CNT):
            x = INIT_X + col * CELL_SIZE
            y = INIT_Y - row * CELL_SIZE
            turtle.teleport(x, y)
            turtle.setheading(0)

            color = calculate_color(row, col)
            turtle.color(color)
            turtle.fillcolor(color)
            with turtle.fill():
                for _ in range(4):
                    turtle.forward(CELL_SIZE - 1)
                    turtle.right(90)

    turtle.hideturtle()
    turtle.mainloop()


if __name__ == "__main__":
    main()

请将以上代码保存为 draw_chessboard.py。执行以下命令可以运行 draw_chessboard.py

python3 draw_chessboard.py

运行中的效果如下图所示

image.png

最终的效果如下图所示

image.png

用 Pillow 来绘制国际象棋棋盘

我们也可以用 Pillow\text{Pillow} 来绘制国际象棋棋盘,代码逻辑比较直观,就不多啰嗦了 ⬇️ ((trae 提供了一些帮助))

from PIL import Image


# ===================== 常量定义 =====================
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

PIXEL_CNT = 40

WIDTH = 8 * PIXEL_CNT
HEIGHT = 8 * PIXEL_CNT


def main():
    img = Image.new('RGB', (WIDTH, HEIGHT))
    pixels = img.load()

    for x in range(WIDTH):
        for y in range(HEIGHT):
            row = x // PIXEL_CNT
            col = y // PIXEL_CNT
            if (row + col) % 2 == 0:
                pixels[x, y] = WHITE
            else:
                pixels[x, y] = BLACK

    img.show()
    img.save('chessboard.png')


if __name__ == "__main__":
    main()

请将以上代码保存为 draw_chessboard_v2.py。执行以下命令可以运行 draw_chessboard_v2.py

python3 draw_chessboard_v2.py

运行完 draw_chessboard_v2.py 之后,会在当前目录看到一个名为 chessboard.png\text{chessboard.png} 的文件。示例效果如下图所示 ⬇️

chessboard.png

参考资料