如何在游戏中创建搜索树的可视化效果,我不想只看到节点,而是想看到每一步的棋盘配置?例如,如果能提供关于此图像的任何代码帮助,我将不胜感激。
[编辑]:不幸的是,到现在为止我还没有太多信息:我知道如何生成这样的矩阵,但我不知道如何在一张图片中创建边缘和其余矩阵。
\begin{figure}
\centering
\begin{tikzpicture}[rotate=270]
\centering
\draw[-, very thick] (0,0) grid +(3,3);
\draw (0.5, 0.5) node {3};
\draw (0.5, 1.5) node {};
\draw (0.5, 2.5) node {};
\draw (1.5, 0.5) node {5};
\draw (1.5, 1.5) node {};
\draw (1.5, 2.5) node {2};
\draw (2.5, 0.5) node {1};
\draw (2.5, 1.5) node {6};
\draw (2.5, 2.5) node {4};
\end{tikzpicture}
\caption{Example}
\label{fig:example}
\end{figure}
答案1
您可以绘制一棵树,tikz
并在节点内插入表。
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
level distance=25mm,
level 1/.style={sibling distance=50mm},
level 2/.style={sibling distance=30mm},
level 3/.style={sibling distance=30mm},
every node/.style = {shape=rectangle, align=center}
]
\node{
$U = 4$\\[1mm]
\begin{tabular}{|c|c|c|}
\hline
6 & & \\ \hline
1 & 5 & \\ \hline
4 & 2 & 3\\ \hline
\end{tabular}\hfill\\[1mm]
$L = 2$
} [grow=right]
child{
node{
$U = 4$\\[1mm]
\begin{tabular}{|c|c|c|}
\hline
& & \\ \hline
1 & 5 & 6\\ \hline
4 & 2 & 3\\ \hline
\end{tabular}\hfill\\[1mm]
$L = 3$
}
}
child{
node{
$U = 5$\\[1mm]
\begin{tabular}{|c|c|c|}
\hline
& 6 & \\ \hline
1 & 5 & \\ \hline
4 & 2 & 3\\ \hline
\end{tabular}\hfill\\[1mm]
$L = 3$
}
child{
node{
\begin{tabular}{|c|c|c|}
\hline
& & \\ \hline
6 & 5 & \\ \hline
4 & 2 & 3\\ \hline
\end{tabular}\hfill\\[1mm]
$U = 5$, $L = 3$
}
}
child{
node{
\begin{tabular}{|c|c|c|}
\hline
& & \\ \hline
& 5 & 6 \\ \hline
4 & 2 & 3\\ \hline
\end{tabular}\hfill\\[1mm]
$U = 5$, $L = 3$
}
}
};
\end{tikzpicture}
\end{document}
答案2
我从中获取了表格定义dexteritas 的回答为了避免必须输入图像中的所有内容,添加了该答案中省略的矩阵的定义,并将结果包装在环境中forest
。使用 Forest 的优点是树规范更加简洁,并且格式可以自动化,从而获得更大的灵活性和一致性。也就是说,这意味着更少的输入和更易于维护的代码。
我们创建U
和L
作为标记列表来保存相关值。然后可以将它们指定为树中的键值选项。
\forestset{
declare toks={U}{},
declare toks={L}{},
}
我们不需要明确的tabular
环境或类似的东西。我们可以使用 Forest 的环境align
,这样我们就可以进行tabular
设置。我们可以自动添加顶部和底部的规则,而不是指定所有水平规则。我们将生长方向设置为0
(东/右),覆盖默认值。
\begin{forest}
for tree={
grow'=0,
align=|c|c|c|,
delay={content/.wrap value=\hline #1\\\hline},
child anchor=parent,
l sep'+=20pt,
},
我们添加代码来处理U
和L
。对于终端节点,我们将它们作为 添加label
到右侧。在其他情况下,我们tabular
使用将其添加到 中\multicolumn
。这意味着我们不必担心间距:Forest 会自动计算出来。当我们处理终端节点时,我们还将圆添加到从父节点绘制的边的末端。
before typesetting nodes={
where n children=0{
label/.process={OOw2 {U}{L} {right:{U=#1, L=#2}}},
edge+={-Circle},
}{
content/.process={ OOOw3 {content}{U}{L} {\multicolumn{3}{c}{U=#2}\\#1\multicolumn{3}{c}{L=#3} } },
},
}
现在来看看树的规范。这是根,其值为U
和L
。
[6 & & \\ \hline 1 & 5 & \\ \hline 4 & 2 & 3, U=4, L=2
我们按照同样的方式继续。
[& 6 & \\ \hline 1 & 5 & \\ \hline 4 & 2 & 3, U=5, L=3
[& & \\ \hline & 5 & 6 \\ \hline 4 & 2 & 3, U=5, L=4
]
[& & \\ \hline 6 & 5 & \\ \hline 4 & 2 & 3, U=5, L=4
]
]
[& & \\ \hline 1 & 5 & 6\\ \hline 4 & 2 & 3, U=4, L=3
[& & \\ \hline 5 && 6 \\ \hline 4 & 2 & 3, U=4, L=4
]
[& & 5 \\ \hline && 6 \\ \hline 4 & 2 & 3, U=5, L=4
]
]
]
\end{forest}
完整代码:
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}
\forestset{
declare toks={U}{},
declare toks={L}{},
}
\begin{forest}
for tree={
grow'=0,
align=|c|c|c|,
delay={content/.wrap value=\hline #1\\\hline},
child anchor=parent,
l sep'+=20pt,
},
before typesetting nodes={
where n children=0{
label/.process={OOw2 {U}{L} {right:{U=#1, L=#2}}},
edge+={-Circle},
}{
content/.process={ OOOw3 {content}{U}{L} {\multicolumn{3}{c}{U=#2}\\#1\multicolumn{3}{c}{L=#3} } },
},
}
[6 & & \\ \hline 1 & 5 & \\ \hline 4 & 2 & 3, U=4, L=2
[& 6 & \\ \hline 1 & 5 & \\ \hline 4 & 2 & 3, U=5, L=3
[& & \\ \hline & 5 & 6 \\ \hline 4 & 2 & 3, U=5, L=4
]
[& & \\ \hline 6 & 5 & \\ \hline 4 & 2 & 3, U=5, L=4
]
]
[& & \\ \hline 1 & 5 & 6\\ \hline 4 & 2 & 3, U=4, L=3
[& & \\ \hline 5 && 6 \\ \hline 4 & 2 & 3, U=4, L=4
]
[& & 5 \\ \hline && 6 \\ \hline 4 & 2 & 3, U=5, L=4
]
]
]
\end{forest}
\end{document}