[Tex/LaTex] Chinese checkers board using TikZ

tikz-pgf

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:

enter image description here

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?

Best Answer

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}