用Tikz绘制数独游戏

数独,是源自18世纪瑞士的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。数独盘面是个九宫,每一宫又分为九个小格。在这八十一格中给出一定的已知数字和解题条件,利用逻辑和推理,在其他的空格上填入1-9的数字。使1-9每个数字在每一行、每一列和每一宫中都只出现一次,所以又称“九宫格”。(选自:这里) 在我们LaTeX里面如何进行绘制数独的游戏呢?

下面我们看一个绘制好的例子:sudokugrid-1sudokugrid2-1代码实现如下:

\documentclass{standalone}
    \usepackage{tikz}
    \usetikzlibrary{backgrounds}
    \usepackage{graphicx}

    \pagenumbering{gobble}
    
% Some customizable styles
    \tikzset {
        highlight/.style = {gray, opacity=0.3},
        digit/.style = {minimum height = 5mm, minimum width=5mm, anchor=center },
        circle/.style = {draw=black!80!black, dotted, very thick},
        cross/.style = {red, opacity=.5, shorten >=1mm, shorten <=1mm, very thick, line cap=round},
        hint/.style={black, font=\sf, minimum width=3mm, minimum height=3mm}
    }

% Original code-----------------------------------------------------------
% Modified the \node to give a unique name to each one, which is the
% row number, a dash and the column number. E.g: 1-1, 4-5, etc.
    \newcounter{row}
    \newcounter{col}

    \newcommand\setrow[9]{
        \setcounter{col}{1}
        \foreach \n in {#1, #2, #3, #4, #5, #6, #7, #8, #9} {
            \edef\x{\value{col} - 0.5}
            \edef\y{9.5 - \value{row}}
            \node[digit,name={\arabic{row}-\arabic{col}}] at (\x, \y) {\n};
            \stepcounter{col}
        }
        \stepcounter{row}
    }

% New code -------------------------------------------------------------
    \def\highlightcell#1#2{
        \fill[highlight] (#1-#2.north west) rectangle (#1-#2.south east);
    }

    \def\circlecell#1#2{
        \draw[circle] (#1-#2) circle(4mm);
    }

    \def\crosscell#1#2{
        \draw[cross] (#1-#2.north west) -- (#1-#2.south east);
        \draw[cross] (#1-#2.north east) -- (#1-#2.south west);
    }

    \def\highlightrow#1{
       \fill[highlight] (#1-1.north west) rectangle (#1-9.south east);
    }

    \def\highlighcolumn#1{
        \fill[highlight] (1-#1.north west) rectangle (9-#1.south east);
    }

    \def\hintcell#1#2#3{
        \node at (#1-#2) {\hintbox{#3}};
    }

    \def\highlightrectangle#1#2#3#4{
        \begin{pgfonlayer}{background}
        \fill[highlight] (#1-#2.north west) rectangle (#3-#4.south east);
        \end{pgfonlayer}
    }

% UGLY code. Do not read :-)
\def\hintbox#1{
    \resizebox{4.5mm}{4.5mm}{%
        \tikz[scale=0.3]{%
            \def\auxc{0}
            \foreach \m in {1,...,9} {
                \pgfmathparse{mod(\auxc,3)}
                \xdef\x{\pgfmathresult}
                \pgfmathparse{-floor(\auxc/3)}
                \xdef\y{\pgfmathresult}
                \xdef\hintprinted{0}
                \foreach \n in {#1} {
                    \ifnum\n=\m
                        \node[hint] at (\x,\y) {\n};
                        \xdef\hintprinted{1}
                    \fi
                }
                \ifnum\hintprinted=0
                      \node[hint, opacity=0] at (\x,\y) {\m};
                \fi
                \pgfmathparse{\auxc+1}
                \xdef\auxc{\pgfmathresult}
            }
        }%
    }
}


\begin{document}

    \begin{tikzpicture}[scale=.5]
        \begin{scope}
            \draw (0, 0) grid (9, 9);
            \draw[very thick, scale=3] (0, 0) grid (3, 3);
            \setcounter{row}{1}

    % Single entries
            \setrow { }{ }{9}  { }{ }{ }  {2}{6}{ }
            \setrow {2}{ }{ }  { }{8}{4}  { }{ }{ }
            \setrow {5}{ }{ }  {2}{ }{ }  { }{ }{1}

            \setrow { }{6}{ }  {1}{ }{9}  {7}{ }{ }
            \setrow { }{9}{ }  { }{7}{ }  { }{4}{ }
            \setrow { }{ }{7}  {4}{ }{3}  { }{9}{ }

            \setrow {3}{ }{ }  { }{ }{6}  { }{ }{5}
            \setrow { }{ }{ }  {5}{3}{ }  { }{ }{8}
            \setrow { }{2}{5}  { }{ }{ }  {3}{ }{ }

            \highlightrectangle{1}{4}{3}{6}

            \highlightrectangle{4}{1}{6}{3}
            \highlightrectangle{4}{7}{6}{9}
            
            \highlightrectangle{7}{4}{9}{6}

        \end{scope}
\end{tikzpicture}

\end{document}

代码摘自一个关于数独的报告,https://github.com/ithanium/sudoku_report。 当然还有一个宏包也可以绘制数独游戏的,http://www.ctan.org/pkg/sudoku,这一个宏包的输入比较可视化、直观,不过要花点时间填写内容。有这类兴趣的用户可以自己测试下。sudoku

下载区

本站下载:sudoku_report-master

分享到:
未经允许不得转载:用Tikz绘制数独游戏
已有 条意见

    最新文章

    加载中...
      本站提供专业LaTeX排版、咨询、定制服务,请点击下图咨询详情


      全国首个精品的LaTeX视频教程,大牛带着你入门,让LaTeX学习不再纠结,请点击下图咨询详情

      热门评论

        联系我们

        交流QQ群:91940767
        本站QQ号:343083553
        邮箱联系latexstudio@qq.com
        淘宝店铺latexstudio.taobao.com 提供排版,模板定制,培训,图片处理,视频教程等LaTeX服务。

        关注微信公众号: latex2015

        如果您投稿或者希望加入我们团队,请发送您的简历到latexstudio@qq.com。

        科技艺术的完美融合,专业精致的排版体验

        联系我们联系我们