# Chinese checkers board using TikZ

A question regarding drawing checkers pieces and boards using TikZ has been asked here previously and I'm aware of the chessboard package. However I want to draw a Chinese checkers board:

I want to draw it as opposed to using an image because I want to be able to edit the locations of pieces. The question is how I would go about drawing the board. Two options I see are:

1. Draw the board as rows of circles and then draw the outline similar to the above.

2. Draw the board as rows of equilateral triangles as seen here.

Either way is fine, but drawing either one is a mystery to me. Any tips?

-
I imagine that another approach people might take is draw a square array of circles, and then clip it to the desired shape. –  cmhughes Oct 22 '11 at 0:32
@cmhughes: I don't think that would really work. The circles are not in the corners/vertices of a square matrix, they are aligned along triangles. –  Count Zero Oct 22 '11 at 9:47

You can use a \foreach loop that takes the number of positions in each row as the loop list. For the standard chinese checkers boards, that could look like \foreach \m [count=\count] in {1,...,4,13,12,...,9,10,11,...,13,4,3,...,1}.

If you systematically name the nodes you create in this loop, you've got a very nice framework for drawing Chinese Checkers setups and moves. I've written a couple of macros and styles for this.

The command \checkerboard[checkerboard labels] will draw a blank board with the fields labeled <row>-<column>:

You can then place pieces using

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

and show moves using

 \showmove{<sequential list of positions>}


For example,

\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}


Here's the full code:

\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}

-
That is fantastic. Thanks! –  Mike Wierzbicki Oct 22 '11 at 13:39
That's a great answer to an interesting question. –  DJP Oct 22 '11 at 14:52
@Jake: Very nice! Can I add this example to the TikZ examples gallery? If yes, perhaps mail your author details to me. –  Stefan Kottwitz Dec 22 '11 at 19:51