答案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}