TikZ 中的棋盘。

TikZ 中的棋盘。

在 tikz 中绘制棋盘的最佳方法是什么?我对在棋盘上绘制许多圆形棋子的最佳方法感兴趣。(棋盘背景并不重要)

答案1

我建议使用matrix of nodes来自 tikz 矩阵库的。

一个小例子,使用在其他主题

\documentclass{article} 
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\tikzstyle{ball} = [circle, shading=ball,
    ball color=black!80!white, minimum size=1cm]
\begin{tikzpicture}
\matrix (m) [matrix of nodes,nodes=ball] {
 {} &    & {} &    & {} &    & {} & \\
    & {} &    & {} &    & {} &    & {} \\
 {} &    & {} &    & {} &    & {} & \\};
\end{tikzpicture}
\end{document}

输出:

替代文本

答案2

Caramdir 的方法的难点在于规则,因此很难在实际游戏中显示棋盘的布局。Stefan 的方法在这方面做得更好,但没有网格。但是,网格非常规则,因此 Caramdir 的方法可以适应这种情况。

以下是我的版本,是两者的融合。首先,结果如下:

棋盘

需要注意的事项:

  1. 毕竟,这些都是跳棋棋子!
  2. 使用矩阵间距中的“原点之间”选项意味着棋盘格(又名节点)非常精确地放置在方格上。
  3. 正如 Stefan 的回答一样,将棋子实际放置在方格上的语法非常直观。
  4. 剩下的只是用于改变碎片颜色的简单语法!
\documentclass{article} 
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{matrix,shapes.geometric}

\begin{document}
\tikzstyle{checker} = [cylinder, minimum width=.8cm, 
 shape border rotate=90,cylinder end fill=gray!50!white,
 cylinder body fill=gray, cylinder uses custom fill]
\begin{tikzpicture}
\draw[ultra thick] (0,0) rectangle (8,-8);
    \foreach \row in {0,1, ..., 7} {
        \foreach \column in {0, ..., 3} {
    \fill ({2*\column + mod(\row,2)}, -\row) rectangle +(1,-1);
        }
    }
\matrix (m) at (0,0) [matrix of nodes,nodes=checker,
  anchor=north west,column sep={1cm,between origins},
  row sep={1cm,between origins}] {
 {} & {} & {} &    & {} &    & {} & \\
    &    &    & {} & {} & {} &    & {} \\
    & {} & {} &    &    &    & {} & \\
    & {} &    & {} &    & {} &    & {} \\
 {} &    &    & {} & {} &    & {} & \\
    & {} &    & {} &    & {} &    & {} \\
    &    & {} &    &    &    & {} & \\
    &    &    & {} & {} & {} &    & {} \\
};
\end{tikzpicture}
\end{document}

更新2012-03-09:由于这篇文章刚刚回到头版,我决定看看能否修复颜色和“国王”。感谢 Ryan Reich 的跟踪-pgfkeys包,我找到了一种设置颜色和尺寸的方法。

这是新代码;我稍微整理了一下原来的代码,并添加了颜色检查。其中比较复杂的部分(Ryan 的代码非常有用)是弄清楚如何根据可能设置的任何环境颜色来设置颜色。

\documentclass{article} 
%\url{https://tex.stackexchange.com/a/1911/86}
\usepackage{tikz}
%\usepackage{trace-pgfkeys}
\usetikzlibrary{matrix,shapes.geometric}

\makeatletter
\colorlet{checkertint}{gray!70!white}
\tikzset{
  checker/.style={
    draw,
    cylinder,
    minimum width=.8cm, 
    shape border rotate=90,
    set checker colour=#1,
    cylinder uses custom fill,
  },
  king/.style={
    minimum height=.8cm,
  },
  checker default colour/.initial=gray!50!white,
  set checker colour/.code={%
    \tikz@addoption{%
      \def\ch@color{#1}%
      \def\@tempa{\pgfkeysnovalue}%
      \ifx\ch@color\@tempa
       \ifx\tikz@fillcolor\pgfutil@empty
        \ifx\tikz@strokecolor\pgfutil@empty
         \ifx\tikz@textcolor\pgfutil@empty
          \pgfkeysgetvalue{/tikz/checker default colour}{\ch@color}%
         \else
          \let\ch@color\tikz@textcolor
         \fi
        \else
         \let\ch@color\tikz@strokecolor
        \fi
       \else
        \let\ch@color\tikz@fillcolor
       \fi
      \fi
      \pgfsetstrokecolor{\ch@color!50!checkertint}%
      \pgfkeys{
       /tikz/cylinder end fill=\ch@color!80!checkertint,
       /tikz/cylinder body fill=\ch@color!50!checkertint
      }
    }
  }
}
\makeatother
\begin{document}

\begin{tikzpicture}
\draw[ultra thick] (0,0) rectangle (8,-8);
    \foreach \row in {0,1, ..., 7} {
        \foreach \column in {0, ..., 3} {
    \fill ({2*\column + mod(\row,2)}, -\row) rectangle +(1,-1);
        }
    }
\matrix (m) at (0,0) [
  matrix of nodes,
  checker default colour=white,
  nodes=checker,
  anchor=north west,
  column sep={1cm,between origins},
  row sep={1cm,between origins}
] {
 |[black]| {} & {} & {} &    & {} &    & {} & \\
    &    &    & {} & {} & {} &    & {} \\
    &|[black,king]| {} & {} &    &    &    & {} & \\
    & {} &    & {} &    & {} &    & {} \\
|[king]| {} &    &    & {} & {} &    & {} & \\
    & {} &    & {} &    & {} &    & {} \\
    &    & {} &    &    &    & {} & \\
    &    &    & {} & {} & {} &    & {} \\
};
\end{tikzpicture}
\end{document}

这是一张新图片。

带有颜色和国王的跳棋

答案3

TikZ 通常有多种方法来产生结果。Stefan 的解决方案非常好,但还有另一种方法:TikZ 有一些编程结构和许多内置的数学函数,可用于快速生成各种图表:

\begin{tikzpicture}
    \foreach \row in {0, 1, 2} {
        \foreach \column in {0, 1, ..., 3} {
            \fill[shading=ball, ball color=black!80]
                ({2*\column+mod(\row,2)}, -\row) circle (0.5cm);
        }
    }
\end{tikzpicture}

这会产生与 Stefan 的解决方案完全相同的图片(除了由于矩阵填充而略微改变的边界框)。优点是您可以通过更改几个数字轻松更改大小,并且可以在 foreach 循环中放入任何您喜欢的内容。

答案4

这是一个较晚的解决方案,使用矩阵.骨架。其优点是可以轻松绘制棋盘,而无需牺牲放置棋子的语法。

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix.skeleton}
\begin{document}
\tikzstyle{ball} = [circle, shading=ball, minimum size=1cm]

\newcommand{\bl}{\node [ball, ball color=black!80!white, draw=black!65!white, thin]{};}
\newcommand{\wh}{\node [ball, ball color=white] {};}
\begin{tikzpicture}
\matrix (m) [matrix of nodes, nodes in empty cells, label skeleton, nodes={minimum size = 1.2cm}] {
\bl &     & \bl &     & \bl &     & \bl &     \\
    & \bl &     & \bl &     & \bl &     & \bl \\
\bl &     & \bl &     &     &     & \bl &     \\
    &     &     & \bl &     &     &     &     \\
\wh &     &     &     &     &     &     &     \\
    &     &     & \wh &     & \wh &     & \wh \\
\wh &     & \wh &     & \wh &     & \wh &     \\
    & \wh &     & \wh &     & \wh &     & \wh \\
};

\foreach \row in {1, ..., 8} {
  \foreach \col in {1, ..., 8} {
    \pgfmathparse{Mod(\row + \col, 2) ? "white" : "black"}
    \colorlet{squarebg}{\pgfmathresult}
    \fitandstyle[background]{(m-cell-\row-\col)}{fill = squarebg}
  }
}
\end{tikzpicture}
\end{document}

输出

相关内容