我正在尝试创建多个 8x8 网格,每个网格上都有一个随机阴影框。这是用于课堂活动的,我想要一堆不同的网格,并且不想为每个网格硬编码随机框。我使用以下代码:
\begin{tikzpicture}[x=2.54cm, y=2.54cm]
\foreach \y in {1,2,...,8}
{
\foreach \x in {1,2,...,8}
{
\ifthenelse{\x= \pgfmathparse{random(8)}\pgfmathresult \AND \y=\pgfmathparse{random(8)}\pgfmathresult}
{\filldraw[draw=black,fill=lightgray] (\x,\y) rectangle (\x,\y) rectangle (1+\x,1+\y);}
{\draw[black] (\x,\y) rectangle (\x,\y) rectangle (1+\x,1+\y);}
}
}
\end{tikzpicture}
我得到了错误
不完整 \iffalse;第 51 行之后的所有文本均被忽略”
其中第 51 行是 之前的那个右花括号\end{tikzpicture}
。我已经四处寻找解决方法,但尚未找到。
答案1
只是充实了大卫的评论。
\documentclass{standalone}
\usepackage{ifthen}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[x=2.54cm, y=2.54cm]
\pgfmathtruncatemacro{\RandomX}{random(8)}
\pgfmathtruncatemacro{\RandomY}{random(8)}
\foreach \y in {1,2,...,8}
{
\foreach \x in {1,2,...,8}
{
\ifthenelse{\x=\RandomX \AND \y=\RandomY}
{\filldraw[draw=black,fill=lightgray] (\x,\y) rectangle (\x,\y) rectangle (1+\x,1+\y);}
{\draw[black] (\x,\y) rectangle (\x,\y) rectangle (1+\x,1+\y);}
}
}
\end{tikzpicture}
\end{document}
并且@cfr 是正确的,但是这也有效。
答案2
先绘制网格,然后对随机框进行着色似乎更容易,因为这样就不需要条件语句了。以下代码定义了一个宏\RandomSquareInGrid
,用于对方形网格中的随机正方形进行着色。默认情况下,8x8
会绘制网格,但有一个可选参数可以更改网格大小。当我运行下面的 MWE 时,我得到了
但由于阴影方块是随机选择的,因此输出应该会发生变化。
以下是代码:
\documentclass{article}
\usepackage{tikz}
\parindent=0pt
\newcommand\RandomSquareInGrid[1][8]{%
\begin{tikzpicture}[scale=0.2,x=2.54cm, y=2.54cm]
\foreach \x in {0,...,#1} {% draw the grid
\draw(\x,0) -- ++(0,#1);
\draw(0,\x) -- ++(#1,0);
}
\pgfmathsetmacro\xrnd{random(#1)}% choose a random square to shade
\pgfmathsetmacro\yrnd{random(#1)}
\draw[fill=lightgray](\xrnd,\yrnd) rectangle ++ (-1,-1);
\end{tikzpicture}%
}
\begin{document}
\RandomSquareInGrid \quad
\RandomSquareInGrid \quad
\RandomSquareInGrid
\RandomSquareInGrid[4] \quad
\RandomSquareInGrid[10]
\end{document}
实际上,与其像我一样“手工”绘制网格,不如使用tikz
grid 命令。请注意,我添加scale=0.2
只是为了更轻松地查看输出。