使用 TikZ 的中国跳棋棋盘

使用 TikZ 的中国跳棋棋盘

有人在这里询问了有关使用 TikZ 绘制棋子和棋盘的问题之前我知道棋盘包。但是我想画一个中国跳棋棋盘:

在此处输入图片描述

我想绘制它而不是使用图像,因为我希望能够编辑棋子的位置。问题是我将如何绘制棋盘。我看到的两个选项是:

  1. 将板子画成一排排的圆圈,然后画出与上图类似的轮廓。

  2. 把棋盘画成一排排等边三角形,如图所示这里

两种方式都可以,但画出来对我来说都是个难题。有什么建议吗?

答案1

您可以使用\foreach循环,将每行的位置数作为循环列表。对于标准中国跳棋棋盘,它可能看起来像\foreach \m [count=\count] in {1,...,4,13,12,...,9,10,11,...,13,4,3,...,1}

如果您系统地命名在此循环中创建的节点,那么您将获得一个非常好的框架来绘制中国跳棋的设置和移动。我为此编写了几个宏和样式。

该命令\checkerboard[checkerboard labels]将绘制一个空白板,其字段标有<row>-<column>

然后可以使用

\placepieces[<colour>]{<comma separated list of positions>}

并展示使用

 \showmove{<sequential list of positions>}

例如,

\checkerboard
\placepieces[red!75!yellow]{1-1,2-1,2-2,3-1,3-2,3-3,4-1,4-2,5-8,7-7}
\placepieces[blue!75]{17-1,16-2,15-1,15-2,15-3,14-3,14-4,13-6,11-6,10-6}
\showmove{2-1,4-3,6-8,8-6}
\showmove{17-1,16-1}


完整代码如下:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds,decorations}

\begin{document}

\begin{tikzpicture}

\newif\ifcheckerboardlabels
\tikzset{
    pieces/.style={
        fill,
        circle,
        minimum size=0.5cm
    },
    positions/.style={
        fill=black!5, draw=gray,
        solid,
        circle,
        minimum size=0.6cm,
        inner sep=0pt,
    },
    checkerboard labels/.is if=checkerboardlabels,
    checkerboard labels/.default=true,
    move/.style={
        -latex,
        densely dashed,
        very thick,
        bend right=45
    }
}

\newcommand{\checkerboard}[1][]{
    \begin{scope}[#1]
        \foreach \m [count=\count] in {1,...,4,13,12,...,9,10,11,...,13,4,3,...,1}{
            \foreach \n in {1,...,\m}
                \node at (\n-\m/2,\count) [
                    positions,
                    name=pos-\count-\n,
                    outer sep=0.5cm,
                    label=center:{\ifcheckerboardlabels \count-\n\fi}] {};
        }

        \begin{pgfonlayer}{background}
            \draw [gray,thick,rounded corners=0.4cm,fill=yellow!30] (pos-1-1.240) -- (pos-5-5.240) -- (pos-5-1.240) --
                (pos-5-1.180) -- (pos-9-1.180) -- (pos-13-1.180) --
                (pos-13-1.120) -- (pos-13-5.120) -- (pos-17-1.120) --
                (pos-17-1.60) -- (pos-13-9.60) -- (pos-13-13.60) --
                (pos-13-13.0) -- (pos-9-9.0) -- (pos-5-13.0) --
                (pos-5-13.300) -- (pos-5-9.300) -- (pos-1-1.300) -- cycle;
        \end{pgfonlayer}
    \end{scope}
}

\newcommand{\placepieces}[2][]{
\begin{scope}[#1]
    \foreach \checker in {#2} {
        \node [pieces,#1] at (pos-\checker) {};
    }
\end{scope}
}

\newcommand{\showmove}[2][]{
\begin{scope}[#1]
\foreach \position [remember = \position as \previousposition,count=\count] in {#2}{
    \ifnum \count=1
        \node at (pos-\position.center) [positions,black,ultra thick,fill=none] {};
    \else   
        \draw [move] (pos-\previousposition.center) to (pos-\position.center);
    \fi
}
;
\end{scope}
}

\checkerboard
\placepieces[red!75!yellow]{1-1,2-1,2-2,3-1,3-2,3-3,4-1,4-2,5-8,7-7}
\placepieces[blue!75]{17-1,16-2,15-1,15-2,15-3,14-3,14-4,13-6,11-6,10-6}

\showmove{2-1,4-3,6-8,8-6}
\showmove{17-1,16-1}

\end{tikzpicture}
\end{document}

相关内容