<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
%%
%% æ–‡ä»¶ï¼šweiqi.dtx
%%
%% ç‰ˆæƒ (C) 2023-2024 By Ms_yam
%%
%% å®ƒå¯ä»¥åœ¨ LaTeX é¡¹ç›®å…¬å…±è®¸å¯ï¼ˆLPPLï¼‰1.3c åŠä¹‹åŽçš„ä»»æ„ç‰ˆæœ¬ï¼ˆéšä½&nbsp;çš„æ„è§ï¼‰ä¸‹åˆ†å‘æˆ–ä¿®æ”¹ã€‚
%% è¿™ä¸ªè®¸å¯çš„æœ€æ–°ç‰ˆæœ¬åœ¨å¦‚ä¸‹æ–‡ä»¶ä¸­ï¼š
%%
%%   https://www.latex-project.org/lppl.txt
%%
%% æœ¬å®åŒ…ä¸ºä½œè€…ç»ƒä¹&nbsp; epxl3 å’Œç¼–å†™ dtx æ–‡ä»¶æ‰€ç¼–å†™ï¼Œé‡Œé¢çš„æŽ¥å£åŠæ–¹æ³•å¹¶ä¸æ˜¯æœ€ä¼˜çš„ã€‚
%% ä»…ä¾›å‚è€ƒã€‚
%%
% \fi
%
% \iffalse
%&lt;*driver&gt;
\documentclass[full]{l3doc}

\usepackage{weiqi}

% åˆ›å»ºä»£ç&nbsp;ç¤ºä¾‹
\usepackage{listings}
\ExplSyntaxOn
\makeatletter
\lst@RequireAspects{writefile}
\box_new:N \l__demo_box
\lstnewenvironment{demo}[1][code and example]
  {
    \use:c { demo_#1: }
  }
  { \use:c { demo_#1_end: } }
\cs_new:Nn \__demo_common:
  {
    \setkeys{lst}
      {
        basicstyle   = \ttfamily,
        gobble       = 2,
        language     = [LaTeX]{TeX},
      }
  }
\cs_new:Nn \__demo_input:
  {
    \catcode`\^^M = 10\relax
    \catcode`\% = 14\relax
    \input{\jobname.tmp}
  }  
\cs_new:Npn \__demo_init:nnn #1#2#3
  {
    \cs_set:cn {demo_#1:} { #2 }
    \cs_set:cn {demo_#1_end:} { #3 }
  }
   
\__demo_init:nnn{code and example}
  {%
    \hbox_set:Nw \l__demo_box
      \__demo_common:
      \lst@BeginAlsoWriteFile{\jobname.tmp}%
  }
  {%
      \lst@EndWriteFile    
    \hbox_set_end:    
    %\begin{center}
      \fp_compare:nNnTF
        { \box_wd:N \l__demo_box  } &gt; {  0.6 * \linewidth }
        {
          \begin{minipage}{\linewidth}
            \box_use:N \l__demo_box
          \end{minipage}%
          \par
          \begin{minipage}{\linewidth}
            \__demo_input:
          \end{minipage}
      }
      {
          \begin{minipage}{0.40\linewidth}
            \__demo_input:
          \end{minipage}%
          %\hfil
          \begin{minipage}{0.54\linewidth}
            \box_use:N \l__demo_box
          \end{minipage}%
      }
    %\end{center}
  }
\makeatother
\ExplSyntaxOff
 
% ^^A æ·»åŠ&nbsp;ä¸­æ–‡æ”¯æŒåŠè®¾ç½®è¶…çº§é“¾æŽ¥
\usepackage[UTF8,hyperref]{ctex} 
\hypersetup{ 
  colorlinks,
  linkcolor=blue,
  hyperindex,
  pdfstartview=FitH,
  plainpages=false,
  backref,
}

% ^^A å¼•ç”¨å¾…åŠžåŒ…
\usepackage{todo}

% ^^A æ±‰åŒ– l3doc çš„éƒ¨åˆ†å®šä¹‰
\NewDocumentEnvironment { texnote } { }% ä¸èƒ½ç”¨ Renew...ï¼ŒåŽŸå›&nbsp;æœªçŸ¥
{
  \endgraf
  \vspace{0.5em}% 3mm =&gt; 0.5em
  \small\textbf{\TeX{} é»‘å®¢ç¬”è®°ï¼š}% \TeX~hackers~note:
}
{
  \vspace{0.5em}% 3mm =&gt; 0.5em
}

\begin{document}
  \DocInput{\jobname.dtx}
  \todos % ^^A åˆ—å‡ºå¾…åŠžäº‹å®œ
\end{document}
%&lt;/driver&gt;
% \fi
%
% \title{^^A
%   \pkg{weiqi}å®åŒ…ï¼šç»˜åˆ¶å›´æ£‹æ£‹è°±^^A
% }
%
% \author{Ms\_yam\thanks
%     {^^A
%       æœ¬å®åŒ…æ˜¯ä½œè€…ç»ƒä¹&nbsp; \LaTeX3 å’Œç¼–å†™ dtx æ–‡ä»¶çš„ä½œå“ï¼Œé‡Œé¢çš„æŽ¥å£åŠæ–¹æ³•å¹¶æœªä¼˜åŒ–ï¼›ä½†å®åŒ…æ¼æ´žä¼šå°½åŠ›ä¿®å¤ã€‚
%     }^^A
%   \  ï¼ˆ\href{mailto:Ms_yam@163.com}{Ms\_yam@163.com}ï¼‰^^A
% }
% \date{\zhdigits*{2024}å¹´\zhnumber{02}æœˆ\zhnumber{22}æ—¥}
%
% \maketitle
%
% \DoNotIndex{\[,\\,\]}
% \DoNotIndex{\Large, \meta, \noindent, \textbf, \texttt}
% \DoNotIndex{\ExplSyntaxOn, \ExplSyntaxOff, \NeedsTeXFormat, \RequirePackage, \ProvidesExplPackage, \NewDocumentCommand}
% \DoNotIndex{\IfBooleanT, \IfBooleanF, \IfNoValueTF}
% \DoNotIndex{\bool_new:N, \bool_set_eq:NN, \bool_set_false:N, \bool_set_inverse:N, \bool_set_true:N, \bool_to_str:N}
% \DoNotIndex{\bool_gset_eq:NN, \bool_gset_false:N, \bool_gset_true:N}
% \DoNotIndex{\bool_if:nT, \bool_if:NT, \bool_if:nTF, \bool_if:NTF}
% \DoNotIndex{\bool_lazy_all:nT, \bool_lazy_all:nTF, \bool_lazy_and:nnT, \bool_lazy_and:nnTF}
% \DoNotIndex{\bool_lazy_any:nTF, \bool_lazy_or:nnT, \bool_lazy_or:nnF, \bool_lazy_or:nnTF}
% \DoNotIndex{\box_ht:N, \box_wd:N}
% \DoNotIndex{\clist_new:N, \clist_const:Nn, \clist_clear:N, \clist_set:Nn, \clist_set_eq:NN, \clist_set_from_seq:NN, \clist_pop:NN, \clist_use:Nn}
% \DoNotIndex{\clist_gclear:N, \clist_gput_right:Nn, \clist_set_eq:Nc, \clist_gset_eq:NN, \clist_gset_eq:cN}
% \DoNotIndex{\clist_if_empty:NTF, \clist_map_function:NN, \clist_map_inline:Nn}
% \DoNotIndex{\color_fill:n, \color_select:n}
% \DoNotIndex{\cs_new:Nn, \cs_new:Npn, \cs_generate_variant:Nn, \cs_if_free:cT, \cs_if_free:cTF}
% \DoNotIndex{\draw_begin:, \draw_end:, \draw_linewidth:n, \draw_path_circle:nn, \draw_path_lineto:n, \draw_path_moveto:n}
% \DoNotIndex{\draw_box_use:Nn, \draw_path_use_clear:n, \draw_transform_scale:n}
% \DoNotIndex{\fp_new:N, \fp_set_eq:NN, \fp_set:Nn, \fp_add:Nn,\fp_sub:Nn, \fp_compare:nNnT, \fp_compare:nNnTF, \fp_gset:Nn, \fp_use:N}
% \DoNotIndex{\group_begin:, \group_end:}
% \DoNotIndex{\hbox_set:Nn}
% \DoNotIndex{\int_new:N, \int_new:c, \int_const:Nn, \int_set_eq:NN, \int_set_eq:Nc, \int_set:Nn, \int_set:Ne, \int_add:Nn, \int_incr:N, \int_use:N} 
% \DoNotIndex{\int_gset:Nn, \int_gset:Ne, \int_gincr:N, \int_gset_eq:NN, \int_gset_eq:Nc, \int_gset_eq:cN}
% \DoNotIndex{\int_max:nn, \int_min:nn,  \int_sign:n, \int_abs:n, \int_from_alph:n, \int_from_alph:e, \int_to_alph:n, \int_to_Alph:n}
% \DoNotIndex{\int_case:nn, \int_compare_p:n, \int_compare_p:nNn, \int_compare:nNnT, \int_compare:nNnF, \int_compare:nNnTF}
% \DoNotIndex{\int_if_zero:nF, \int_if_zero:nTF, \int_step_inline:nn, \int_step_inline:nnnn}
% \DoNotIndex{\intarray_new:Nn, \intarray_new:cn, \intarray_gset:Nnn, \intarray_gset:cnn, \intarray_gzero:N, \intarray_item:Nn, \intarray_item:cn}
% \DoNotIndex{\ior_open:Nn, \ior_close:N, \ior_str_map_inline:Nn}
% \DoNotIndex{\prg_set_conditional:Npnn, \prg_return_false:, \prg_return_true:, \prg_generate_conditional_variant:Nnn, \prg_break_point:, \prg_break:}
% \DoNotIndex{\regex_match:nn, \regex_match:nnTF, \regex_match:nVTF, \regex_extract_all:nnN}
% \DoNotIndex{\regex_extract_once:nnN, \regex_extract_once:nVN, \regex_extract_once:nnNTF, \regex_extract_once:nVNTF}
% \DoNotIndex{\seq_new:N, \seq_new:c, \seq_put_right:Nn, \seq_item:Nn, \seq_gclear:N, \seq_gset_item:Nnn, \seq_gset_item:NnV}
% \DoNotIndex{\seq_if_in:NnT, \seq_if_in:NnF, \seq_if_in:NnTF}
% \DoNotIndex{\str_new:N, \str_const:Nn, \str_set:Nn, \str_set:NV, \str_set:Nx, \str_set_eq:NN}
% \DoNotIndex{\str_put_right:Nn, \str_put_right:NV, \str_put_right:Nx}
% \DoNotIndex{\str_gset_eq:NN}
% \DoNotIndex{\str_head:N, \str_item:Nn, \str_range:Nnn, \str_range:nnn, \str_tail:N, \str_lowercase:n}
% \DoNotIndex{\str_if_empty_p:N, \str_if_empty:NTF, \str_if_empty:nTF, \str_if_eq_p:nn, \str_if_eq_p:Vn, \str_if_eq:nnTF}
% \DoNotIndex{\str_case:nn, \str_case_e:nn, \str_compare:eNeT, \str_compare:nNnTF, \str_compare:eNeTF}
%
% \begin{documentation}
%
% \section{\pkg{weiqi} æ–‡æ¡£}
%
% æœ¬å®åŒ…æä¾›äº†ç»˜åˆ¶å›´æ£‹æ£‹è°±åŠŸèƒ½ã€‚æœ¬å®åŒ…å‚è€ƒï¼ˆæˆ–å»¶ç”¨ï¼‰äº† \pkg{igo} å®åŒ…çš„éƒ¨åˆ†å‘½ä»¤ï¼Œ
% ä½†æœ¬å®åŒ…çš„å®žçŽ°å®Œå…¨é‡‡ç”¨ \pkg{expl3} æ–¹å¼ã€‚
%
% æœ¬å®åŒ…çš„ç»˜å›¾é‡‡ç”¨ \pkg{l3draw} å®åŒ…ï¼ˆ2024-01-04 ç‰ˆï¼‰å®žçŽ°ï¼Œå›&nbsp;å‰è€…å…·æœ‰\emph{é«˜åº¦}å®žéªŒæ€§ï¼Œå›&nbsp;äº›æœ¬
% å®åŒ…ä¹ŸåŒæ&nbsp;·å…·ä½“\emph{é«˜åº¦}å®žéªŒæ€§ã€‚
%
%
% \subsection{ç›¸å…³æ¦‚å¿µ}^^A
%
%
% \subsubsection{å°ºå¯¸}
%
% æœ¬å®åŒ…ä¸­çš„ \meta{å°ºå¯¸} ç‰¹æŒ‡æ£‹ç›˜å°ºå¯¸ï¼ˆå³ä¸€ä¸ªæ–¹å‘åŒ…å«å‡&nbsp;è·¯ï¼‰ï¼Œæ£‹ç›˜å¤§å°ä¸º \meta{å°ºå¯¸} x \meta{å°ºå¯¸}ã€‚
% æœ¬å®åŒ…æ”¯æŒçš„ \meta{å°ºå¯¸} å–å€¼ä¸º $2$\~{}$26$ï¼Œä½†é€šå¸¸å»ºè®®ä½¿ç”¨ $9$ã€$13$ å’Œ $19$ ä¸‰ç§å°ºå¯¸ã€‚
% å…¶ä¸­ï¼Œ$19$x$19$ ä¸ºæ&nbsp;‡å‡†æ£‹ç›˜å¤§å°ï¼ˆä¹Ÿæ˜¯é»˜è®¤å¤§å°ï¼‰ã€‚
%
%
% \subsubsection{åæ&nbsp;‡}
% 
% ä¸ºæ–¹ä¾¿æè¿°è½å­ä½ç½®ï¼Œæœ¬å®åŒ…ä¾æƒ¯ä¾‹é‡‡ç”¨ \meta{åæ&nbsp;‡} çš„æ¦‚å¿µã€‚
% æœ¬å®åŒ…æ”¯æŒä¸¤ç§å½¢å¼çš„ \meta{åæ&nbsp;‡}ï¼šä»¥å·¦ä¸‹è§’ä¸ºèµ·ç‚¹ï¼ˆå¸¸è§„æ¨¡å¼ï¼‰å’Œå·¦ä¸Šè§’ä¸ºèµ·ç‚¹ï¼ˆ$SGF$ æ¨¡å¼ï¼‰ã€‚
%
% ä¸¤ç§å½¢å¼çš„æ¨ªåæ&nbsp;‡ç›¸åŒï¼Œä»Žå·¦å¾€å³ä¾æ¬¡ä¸º $a$ã€$b$ã€\dotsã€‚å®ƒä»¬çš„åŒºåˆ«åœ¨äºŽï¼š
% å‰è€…çºµåæ&nbsp;‡ä»Žä¸‹å¾€ä¸Šä¾æ¬¡ä¸º $1$ã€$2$ã€\dotsï¼›è€ŒåŽè€…çš„çºµåæ&nbsp;‡ä»Žä¸Šå¾€ä¸‹ä¾æ¬¡ä¸º $a$ã€$b$ã€\dotsã€‚
% å‰è€…æ˜¯ä¸ºä¾¿äºŽäººå‘˜äº¤äº’è®¾è®¡ï¼ŒåŽè€…æ˜¯ä¸ºæ”¯æŒ $sgf$ æ£‹è°±åæ&nbsp;‡è€Œè®¾è®¡ã€‚
%
% æ¨ªåæ&nbsp;‡ä¸Žçºµåæ&nbsp;‡ç»„åˆå½¢æˆ \meta{åæ&nbsp;‡}ï¼Œå¦‚ |a1|ã€|dp| ç­‰ã€‚
% é€šå¸¸éœ€è¦ \meta{åæ&nbsp;‡} çš„åœ°æ–¹ï¼Œä¹Ÿæ”¯æŒé€—å·åˆ—è¡¨å½¢å¼çš„ \meta{åæ&nbsp;‡} é›†åˆï¼Œå¦‚ â€œ|a2, b2, dp|â€ã€‚
%
% \begin{minipage}{0.45\linewidth}
%   \newweiqi
%   \showweiqi[a1,e4]
% \end{minipage}%
% \begin{minipage}{0.45\linewidth}
%   \sgflocmode
%   \showweiqi[aa,ed]
% \end{minipage}\\
%
%
% \subsubsection{è™šç€}
%
% å›´æ£‹æœ‰ä¸€ä¸ªæ¯”è¾ƒç‰¹æ®Šçš„è§„åˆ™ï¼šå®ƒå…è®¸ä¸€æ–¹åœä¸€æ‰‹ï¼ˆä¹Ÿå«è™šç€ï¼‰ï¼Œå¦ä¸€æ–¹ç»§ç»­ä¸‹ã€‚
% ä¸ºäº†ä»¥ç»Ÿä¸€çš„æ–¹å¼è®°å½•æ¯ä¸€æ‰‹æ£‹ï¼Œç‰¹å°†è™šç€çš„ \meta{åæ&nbsp;‡} å®šä¹‰ä¸º |-| æˆ– |pass|ã€‚
%
% \subsection{åŸºæœ¬å‘½ä»¤}^^A 
%
%
% \begin{function}{\newweiqi}
%   \begin{syntax}
%     \cs{newweiqi} [\meta{å°ºå¯¸}]
%   \end{syntax}
%   åˆå§‹åŒ–æ–°å¯¹å±€ï¼Œ\meta{å°ºå¯¸}ç”¨äºŽæŒ‡å®šæ£‹ç›˜å¤§å°ï¼ˆé»˜è®¤ä¸º $19$ï¼‰ã€‚
%   å¸¦æ˜Ÿå·ç‰ˆæœ¬åŒæ—¶æ›´æ”¹ \meta{å°ºå¯¸} çš„é»˜è®¤å€¼ã€‚
% \end{function}
%
%
% \begin{function}{\weiqisize}
%   \begin{syntax}
%     \cs{weiqisize} \Arg{å°ºå¯¸}
%   \end{syntax}
%   ä¿®æ”¹æ£‹ç›˜å¤§å°ä¸º \meta{å°ºå¯¸}ã€‚
%   å¸¦æ˜Ÿå·ç‰ˆæœ¬åŒæ—¶æ›´æ”¹ \meta{å°ºå¯¸} çš„é»˜è®¤å€¼ã€‚
%   \begin{texnote}
%     ä¿®æ”¹æ£‹ç›˜å°ºå¯¸ä¸ä¼šæ£€æŸ¥å·²æœ‰æ£‹å­æ˜¯å¦è¶Šç•Œã€‚
%     åŒæ—¶è¿˜ä¼šå¼•å‘å·²æœ‰çš„ \meta{åæ&nbsp;‡}ä¸º $SGF$ æ¨¡å¼çš„æ£‹å­çš„ä½ç½®é”™ä¹±ã€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{function}{\weiqiblack, \weiqiwhite}
%   \begin{syntax}
%     \cs{weiqiblack} [\meta{æ&nbsp;‡ç­¾}] \Arg{åæ&nbsp;‡}
%   \end{syntax}
%   å‘å½“å‰å¯¹å±€ä¸­æ·»åŠ&nbsp;æ£‹å­ã€‚
%   å…¶ä¸­ï¼Œå¦‚æžœ \meta{æ&nbsp;‡ç­¾} ä¸ºæ‰‹æ•°ï¼Œåˆ™ä¼šè‡ªåŠ¨é€’å¢žä¸”åˆ‡æ¢é»‘ç™½æ–¹ã€‚
%   å¦‚æžœ \meta{æ&nbsp;‡ç­¾} ä¸º $0$ï¼Œåˆ™ä¸æ˜¾ç¤ºæ&nbsp;‡ç­¾ä½†ä»åˆ‡æ¢é»‘ç™½æ–¹ã€‚
%   \meta{åæ&nbsp;‡} æ˜¯ä¸€ç»„è¡¨ç¤ºæ£‹å­ä½ç½®çš„é€—å·åˆ†éš”åˆ—è¡¨ï¼Œæ¯ä¸€é¡¹è¡¨ç¤ºä¸€æ‰‹æ£‹ï¼›
%   é»˜è®¤ä»¥å·¦ä¸‹è§’çš„ \meta{åæ&nbsp;‡} ä¸º $a1$ï¼›è™šç€è¯·ä½¿ç”¨ $-$ã€|pass| æˆ–ç•™ç©ºã€‚
% \end{function}
%
%
% \begin{function}{\weiqidie}
%   \begin{syntax}
%     \cs{weiqidie} \Arg{åæ&nbsp;‡}
%   \end{syntax}
%   è®¾ç½®æŒ‡å®šä½ç½®çš„æ£‹å­ä¸ºæ­»å­ã€‚
%   \meta{åæ&nbsp;‡} æ˜¯ä¸€ç»„è¡¨ç¤ºæ£‹å­ä½ç½®çš„é€—å·åˆ†éš”åˆ—è¡¨ï¼Œæ¯ä¸€é¡¹è¡¨ç¤ºä¸€ä¸ªä½ç½®ã€‚
%   \begin{texnote}
%     æ­»å­æ˜¯ä¹‹å‰å·²ç»ä¸‹è¿‡çš„æ£‹å­ï¼Œå›&nbsp;ä¸ºæ²¡æœ‰æ°”ï¼Œæ‰€ä»¥éœ€è¦ä»Žæ£‹ç›˜æ‹¿èµ°ã€‚
%     å°†æ²¡æœ‰æ&nbsp;‡ç­¾çš„æ£‹å­æ&nbsp;‡è®°ä¸ºæ­»å­æ˜¯æ²¡æœ‰æ„ä¹‰çš„ã€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{function}{\showweiqi}
%   \begin{syntax}
%     \cs{showweiqi} [\meta{åŒºé—´}] 
%   \end{syntax}
%   ç»˜åˆ¶å¯¹å±€ã€‚å¦‚æžœæŒ‡å®š \meta{åŒºé—´}ï¼Œåˆ™ \meta{åŒºé—´} åº”ç”±ä¸¤ä¸ªè§’ç‚¹åæ&nbsp;‡æˆ– |full| ç»„æˆï¼Œä»¥ç¤ºæŒ‡å®šåŒºé—´å†…çš„ä¿¡æ¯ï¼›
%   å¦‚æœªæŒ‡å®šåŒºé—´ï¼Œåˆ™ä¼šè‡ªåŠ¨è®¡ç®—èŒƒå›´ï¼Œè¯¥èŒƒå›´å¯ä¿è¯è‡³å°‘åŒ…å«ä¸€ä¸ªè§’ï¼Œå…¶ä½™è¾¹è‡³å°‘ä½™ä¸€è·¯ã€‚
%   é»˜è®¤æƒ…å†µæ˜¾ç¤ºå®ŒæˆåŽä¼šæ¸…é™¤å¯¹å±€ï¼Œä½¿ç”¨æ˜Ÿå·å‘½ä»¤å¯ä¿ç•™å¯¹å±€ã€‚
%   \begin{texnote}
%     è‡ªåŠ¨è®¡ç®—çš„èŒƒå›´ä¼šè€ƒè™‘æœ€å°æ˜¾ç¤ºå¤§å°ï¼›å¦‚æžœæŒ‡å®šåŒºé—´ï¼Œåˆ™ä¸å—æ­¤é™åˆ¶ã€‚åŒºé—´å¤–å†…å®¹ä¸ä¼šæ˜¾ç¤ºã€‚
%   \end{texnote}
% \end{function}
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack[0]{bq,dq,-}
%   \weiqiwhite[1]{b2,c2,c3,a2,d2,b1}
%   \weiqiwhite[7]{-,b2}
%   \weiqidie{b2}
%   \showweiqi
% \end{demo}\\
%
%
% æ­»å­å’Œå¸¦æ&nbsp;‡ç­¾ï¼ˆé€šå¸¸ä¸ºæ‰‹æ•°ï¼‰è™šç€ä¼šç»˜åˆ¶åœ¨æ£‹ç›˜ä¸‹æ–¹ï¼›ä¸å¸¦æ&nbsp;‡ç­¾çš„è™šç€åˆ™ä¸ä¼šç»˜åˆ¶ï¼ˆå›&nbsp;ä¸ºå®ƒæ²¡æœ‰ä»»æ„å®žé™…æ„ä¹‰ï¼‰ã€‚
%
% \subsection{æ&nbsp;‡ç­¾ä¸ŽæŒ‡ç¤ºç‚¹}^^A 
%
%
% \begin{function}{\weiqilabel, \clearlabel}
%   \begin{syntax}
%     \cs{weiqilabel} [\meta{æ&nbsp;‡ç­¾}] \Arg{åæ&nbsp;‡}\\
%     \cs{clearlabel}
%   \end{syntax}
%   å‘å½“å‰å¯¹å±€ä¸­æ·»åŠ&nbsp;æ&nbsp;‡ç­¾ï¼Œæˆ–æ¸…é™¤å¯¹å±€ä¸­çš„æ‰€æœ‰æ&nbsp;‡ç­¾ã€‚
%   å…¶ä¸­ï¼Œå¦‚æžœ \meta{æ&nbsp;‡ç­¾} ä¸ºæ‰‹æ•°ï¼Œåˆ™ä¼šè‡ªåŠ¨é€’å¢žã€‚\meta{æ&nbsp;‡ç­¾} é»˜è®¤ä¸º $a$ã€‚
%   \meta{åæ&nbsp;‡} æ˜¯ä¸€ç»„è¡¨ç¤ºæ£‹å­ä½ç½®çš„é€—å·åˆ†éš”åˆ—è¡¨ï¼Œæ¯ä¸€é¡¹è¡¨ç¤ºä¸€ä¸ªæ&nbsp;‡ç­¾ã€‚
%   å¸¦æ˜Ÿå·ç‰ˆæœ¬åœ¨æ·»åŠ&nbsp;æ&nbsp;‡ç­¾çš„åŒæ—¶ä¼šåˆ&nbsp;é™¤æ—§çš„æ&nbsp;‡ç­¾ã€‚
%   \begin{texnote}
%     å¦‚æžœ \meta{æ&nbsp;‡ç­¾} ä¸º $0$ æˆ–ä¸ºç©ºï¼ˆ|[]|ï¼‰ï¼Œåˆ™æ˜¾ç¤ºå®žå¿ƒç©ºç™½åœ†ã€‚
%     \meta{åæ&nbsp;‡} è§„åˆ™ä¸Žæ£‹å­ä¸€è‡´ï¼Œæœ¬è§„åˆ™åœ¨æ‰€æœ‰ \meta{åæ&nbsp;‡} ä¸­ç”Ÿæ•ˆã€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{function}{\weiqired, \weiqigreen, \weiqiblue, \clearpoint}
%   \begin{syntax}
%     \cs{weiqired} \Arg{åæ&nbsp;‡}\\
%     \cs{clearpoint} 
%   \end{syntax}
%   å‘å½“å‰å¯¹å±€ä¸­æ·»åŠ&nbsp;æŒ‡ç¤ºç‚¹ï¼Œæˆ–æ¸…é™¤æ‰€æœ‰æŒ‡ç¤ºç‚¹ã€‚
%   \meta{åæ&nbsp;‡} æ˜¯ä¸€ç»„è¡¨ç¤ºæ£‹å­ä½ç½®çš„é€—å·åˆ†éš”åˆ—è¡¨ï¼Œæ¯ä¸€é¡¹è¡¨ç¤ºä¸€ä¸ªç‚¹ã€‚
%   å¸¦æ˜Ÿå·ç‰ˆæœ¬åœ¨æ·»åŠ&nbsp;æ&nbsp;‡ç­¾çš„åŒæ—¶ä¼šåˆ&nbsp;é™¤æ—§çš„æŒ‡ç¤ºç‚¹ï¼ˆå«å…¶å®ƒé¢œè‰²ï¼‰ã€‚
% \end{function}
%
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack{a2,-,b1,cq}
%   \weiqilabel[1]{c2,dq,-}
%   \weiqired{d2,e3,-}
%   \weiqigreen{b3}
%   \showweiqi[a1,e3]
% \end{demo}
%
%
% \subsection{æ£‹ç›˜è®¾ç½®}^^A 
%  
%
% \begin{function}{\weiqirotate, \weiqimirror, \weiqiposition}
%   \begin{syntax}
%     \cs{weiqirotate} [\meta{è§’åº¦}]\\
%     \cs{weiqimirror} [\meta{é•œåƒè½´}]\\
%     \cs{weiqiposition} [\meta{è§’åº¦}]
%   \end{syntax}
%   è¿™ä¸‰ä¸ªå‘½ä»¤ç”¨äºŽè®¾ç½®æ£‹ç›˜çš„æ–¹ä½ï¼ˆæ—‹è½¬ã€é•œåƒåŠæŒ‡å®šæ–¹å‘ï¼‰ã€‚
%   å…¶ä¸­ï¼Œå‰ä¸¤ä¸ªå‘½ä»¤æ˜¯åŸºäºŽå·²æœ‰æ–¹ä½çš„ï¼Œæœ€åŽä¸€ä¸ªåˆ™ä¸è€ƒè™‘å½“å‰æ–¹ä½ã€‚\\
%   \meta{è§’åº¦}ä»¥åº¦ä¸ºå•ä½ï¼ˆé€†æ—¶é’ˆæ–¹å‘ï¼‰ï¼Œå¦‚æœªæŒ‡å®šï¼Œé»˜è®¤åˆ†åˆ«ä¸º $90$ åº¦ï¼ˆæ—‹è½¬ï¼‰å’Œ $0$ åº¦ï¼ˆæŒ‡å®šæ–¹å‘ï¼‰ã€‚
%   \meta{é•œåƒè½´} åº”å½“ä¸º $x$ã€$y$ æˆ– $xy$ï¼ˆé»˜è®¤ï¼‰ ä¸‰è€…ä¹‹ä¸€ã€‚\\
%   ä½¿ç”¨æ˜Ÿå·å‘½ä»¤å¯ä½¿å½“å‰æ£‹ç›˜æ–¹ä½ä¸ºé»˜è®¤æ–¹ä½ã€‚
% \end{function}
%
%
% \begin{function}{\weiqiscale}
%   \begin{syntax}
%     \cs{weiqiscale} [\meta{æ¯”ä¾‹}] 
%   \end{syntax}
%   æŒ‰ \meta{æ¯”ä¾‹} ç¼©æ”¾æ£‹ç›˜ã€‚ å¦‚æœªæŒ‡å®šï¼Œåˆ™æ¢å¤é»˜è®¤æ¯”ä¾‹ã€‚
%   ä½¿ç”¨æ˜Ÿå·å‘½ä»¤å¯ä½¿å½“å‰ç¼©æ”¾æ¯”ä¾‹ä¸ºé»˜è®¤ç¼©æ”¾æ¯”ä¾‹ã€‚ç¼©æ”¾æ˜¯åŸºäºŽåŽŸæœ‰æ¯”ä¾‹çš„ã€‚
% \end{function}
%
%
% \begin{function}{\weiqiminsize}
%   \begin{syntax}
%     \cs{weiqiminsize} \meta{å®½åº¦} \meta{é«˜åº¦} 
%   \end{syntax}
%   æ£‹ç›˜æœ€å°æ˜¾ç¤ºå¤§å°ï¼ˆä»¥æ&nbsp;¼å­è®¡ï¼‰ï¼Œä½¿ç”¨æ˜Ÿå·å‘½ä»¤å¯ä½¿å½“å‰å¤§å°ä¸ºé»˜è®¤å€¼ã€‚
% \end{function}
%
%
% \begin{function}{\nonelocmode, \normallocmode, \sgflocmode}
%   \begin{syntax}
%     \cs{nonelocmode}
%   \end{syntax}
%   å°†æ£‹ç›˜åæ&nbsp;‡æ˜¾ç¤ºæ–¹å¼è®¾ç½®ä¸ºï¼šä¸æ˜¾ç¤ºåæ&nbsp;‡ã€å¸¸è§„æ¨¡å¼åæ&nbsp;‡å’Œ $SGF$ æ¨¡å¼åæ&nbsp;‡ä¹‹ä¸€ã€‚
%   å…¶ä¸­ï¼Œé»˜è®¤ä¸ºå¸¸è§„æ¨¡å¼ï¼Œä½¿ç”¨æ˜Ÿå·å‘½ä»¤å¯ä½¿å½“å‰è®¾ç½®ä¸ºé»˜è®¤å€¼ã€‚ 
% \end{function}
%
% ~\\
% \begin{demo}
%   \newweiqi
%   \weiqiblack[1]{a2,b2,c3,-,dr}
%   \weiqilabel[A]{dq}
%   \weiqirotate[180]
%   \weiqiscale[0.8]
%   \weiqiminsize{6}{5}
%   \sgflocmode
%   \showweiqi
% \end{demo}
%
%
% \subsection{æ£‹å±€å¤ç”¨}^^A 
%
% \begin{function}{\saveweiqi, \useweiqi}
%   \begin{syntax}
%     \cs{saveweiqi} [\meta{åºå·}] 
%   \end{syntax}
%   ä¿å­˜/ä½¿ç”¨å¯¹å±€ï¼ˆåªä¿ç•™å¯¹å±€ä¿¡æ¯ï¼Œæ£‹ç›˜æ–¹ä½ç­‰ä¿¡æ¯ä¸ä¿å­˜ï¼‰ã€‚
%   \meta{åºå·} æ˜¯ä¿å­˜çš„ä½ç½®åºå·ï¼ˆè‡ªç„¶æ•°ï¼ŒæŽ¨è $0$\~{}$26$ï¼‰ã€‚
%   æ˜Ÿå·ç‰ˆä½¿ç”¨å¯¹å±€ä¼šåˆ&nbsp;é™¤æ‰€æœ‰æ£‹å­æ&nbsp;‡ç­¾åŠæ&nbsp;‡ç­¾ã€‚
% \end{function}
%
%
% \begin{function}{\weiqichange}
%   \begin{syntax}
%     \cs{weiqichange} \Arg{åæ&nbsp;‡}
%   \end{syntax}
%   åˆ‡æ¢æŒ‡å®šä½ç½®çš„æ£‹å­çš„æ‰€å±žæ–¹ï¼ˆé»‘ç™½æ–¹ï¼‰ã€‚
%   \meta{åæ&nbsp;‡} æ˜¯ä¸€ç»„è¡¨ç¤ºæ£‹å­ä½ç½®çš„é€—å·åˆ†éš”åˆ—è¡¨ï¼Œæ¯ä¸€é¡¹è¡¨ç¤ºä¸€ä¸ªä½ç½®ã€‚
% \end{function}
%
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack[1]{a2,b2,c3,-,dr}
%   \weiqilabel[A]{dq}
%   \saveweiqi[1]
%   \newweiqi
%   \useweiqi*[1]
%   \weiqichange{dr}
%   \showweiqi
% \end{demo}
%
%
% \begin{function}{\weiqiremove}
%   \begin{syntax}
%     \cs{weiqiremove} \Arg{åæ&nbsp;‡}
%   \end{syntax}
%   ç§»é™¤æŒ‡å®šä½ç½®çš„æ‰€æœ‰æ£‹å­ï¼Œç§»é™¤åŽç›¸å½“äºŽæ²¡æœ‰è¿™ä¸€æ‰‹æ£‹ã€‚
%   \meta{åæ&nbsp;‡} æ˜¯ä¸€ç»„è¡¨ç¤ºæ£‹å­ä½ç½®çš„é€—å·åˆ†éš”åˆ—è¡¨ï¼Œæ¯ä¸€é¡¹è¡¨ç¤ºä¸€ä¸ªä½ç½®ã€‚
%   \begin{texnote}
%     è¿™ä¸Ž \cs{weiqidie} æœ‰æœ¬è´¨çš„åŒºåˆ«ï¼š\cs{weiqidie} æ—¨åœ¨æ&nbsp;‡è®°æ­»å­ï¼ˆè¿™æ‰‹æ£‹æ˜¯çœŸå®žå­˜åœ¨çš„ï¼‰ï¼›
%     è€Œæœ¬å‘½ä»¤æ˜¯ç›´æŽ¥ç§»é™¤è¿™æ‰‹æ£‹ï¼Œä¸»è¦æ˜¯ä»¥å¤ç”¨æ£‹å±€è€Œè®¾ç½®ã€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack[0]{bq,dq,-}
%   \weiqiwhite[1]{b2,c2,c3,a2,d2,b1}
%   \weiqidie{b2}
%   \weiqiremove{d2}
%   \weiqiwhite[5]{b4}
%   \sgflocmode
%   \showweiqi
% \end{demo}
%
%
% \begin{function}{\resetnumber}
%   \begin{syntax}
%     \cs{resetnumber} [\meta{èµ·ç‚¹}]
%   \end{syntax}
%   é‡ç½®å›´æ£‹æ‰‹æ•°ï¼Œ\meta{èµ·ç‚¹} æ‰€åœ¨ä½ç½®çš„æ&nbsp;‡ç­¾è®¾ç½®ä¸º $1$ï¼Œä¹‹åŽæ&nbsp;‡ç­¾ä¾æ¬¡é€’å¢žï¼Œä¹‹å‰æ—&nbsp;æ&nbsp;‡ç­¾ï¼›é»˜è®¤ä»¥ç¬¬ $1$ æ‰‹ä¸ºèµ·ç‚¹ã€‚
% \end{function}
%
%
% \begin{demo}
%   \useweiqi*[1]
%   \resetnumber[2]
%   \showweiqi
% \end{demo}
% 
% \subsection{sgf æ£‹è°±æ”¯æŒ}^^A 
%
%
% \begin{function}{\weiqisgf}
%   \begin{syntax}
%     \cs{weiqisgf} [\meta{æ&nbsp;‡ç­¾}] \Arg{æ–‡æœ¬}
%   \end{syntax}
%   ä½¿ç”¨ |sgf| æ£‹è°± \Arg{æ–‡æœ¬} æ¥æŒ‡å®šæ£‹å­ã€‚å¦‚æžœ \meta{æ&nbsp;‡ç­¾} ä¸ºæ‰‹æ•°ï¼Œåˆ™ä¼šè‡ªåŠ¨é€’å¢žã€‚
% \end{function}
%
% ~\\
% \begin{demo}
%   \newweiqi
%   \weiqisgf{;B[cc];W[dd]}
%   \weiqisgf[1]{;B[cd];W[dc];B[cb]}
%   \showweiqi
% \end{demo}
%
% \begin{function}{\inputsgf}
%   \begin{syntax}
%     \cs{weiqisgf} [\meta{èµ·ç‚¹}] \Arg{æ–‡ä»¶}
%   \end{syntax}
%   æ–°å»ºå¯¹å±€å¹¶è¾“å…¥æŒ‡å®šæ£‹è°±ã€‚\meta{èµ·ç‚¹} æ‰€åœ¨ä½ç½®çš„æ&nbsp;‡ç­¾è®¾ç½®ä¸º $1$ï¼Œä¹‹åŽæ&nbsp;‡ç­¾ä¾æ¬¡é€’å¢žï¼Œä¹‹å‰æ—&nbsp;æ&nbsp;‡ç­¾ï¼›é»˜è®¤ä»¥ç¬¬ $1$ æ‰‹ä¸ºèµ·ç‚¹ã€‚
% \end{function}
%
%
% \subsection{è°ƒè¯•æ”¯æŒ}^^A
%
% \begin{function}{\weiqidata}
%   \begin{syntax}
%     \cs{weiqidata} 
%   \end{syntax}
%   æ&nbsp;¼å¼åŒ–è¾“å‡ºå†…éƒ¨å˜é‡æ•°æ®ã€‚å¸¦æ˜Ÿå·ç‰ˆæœ¬ä¼šé¢å¤–è¾“å‡ºè¾¹ç•Œå˜é‡ä¿¡æ¯ã€‚
% \end{function}
%
% \newweiqi
% \weiqiblack[0]{bq,dq,-}
% \weiqiwhite[1]{b2,c2,c3,a2,d2,b1}
% \weiqidie{b2}
% \weiqiremove{d2}
% \weiqiwhite[5]{b4}
% \weiqidata*
%
% \subsection{ä¸‹ä¸€æ­¥è®¡åˆ’}^^A 
%
% ä¸­æ–‡æ&nbsp;‡ç­¾çš„æ”¯æŒã€‚
%
% \end{documentation}
%
% \begin{implementation}
%
% \newpage
%
% \section{\pkg{weiqi}å®žçŽ°}
%
% \subsection{åˆå§‹åŒ–ä¿¡æ¯}
%
%    \begin{macrocode}
%&lt;*package&gt;
%&lt;@@=weiqi&gt;
%    \end{macrocode}
%
% å®åŒ…åŸºæœ¬ä¿¡æ¯ï¼š
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{weiqi}{2024-02-22}{0.1}
  {drawing weiqi using expl3}
%    \end{macrocode}
%
% éœ€è¦ l3draw å®åŒ…ï¼Œä»¥æ”¯æŒç»˜å›¾ï¼š
%    \begin{macrocode}
\RequirePackage{l3draw}[2024-01-04]
%    \end{macrocode}
%
% å¼€å¯ expl3 æ¨¡å¼ï¼š
%    \begin{macrocode}
\ExplSyntaxOn
%    \end{macrocode}
%
%
% \subsection{å£°æ˜Žç³»ç»Ÿå‡½æ•°çš„å˜ä½“}
%
%    \begin{macrocode}
\cs_generate_variant:Nn \int_set:Nn { Ne }
\cs_generate_variant:Nn \int_gset:Nn { Ne }
\cs_generate_variant:Nn \int_from_alph:n { e }
\cs_generate_variant:Nn \seq_gset_item:Nnn { NnV }
\cs_generate_variant:Nn \regex_extract_once:nnN { nVN }
\prg_generate_conditional_variant:Nnn \regex_match:nn { nV } { T, F, TF }
\prg_generate_conditional_variant:Nnn \regex_extract_once:nnN { nVN } { T, F, TF }
%    \end{macrocode}
%
% \subsection{å£°æ˜Žé€‰é¡¹}
% 
%    \begin{macrocode}
% å¾…å®žçŽ°
%    \end{macrocode}
%
%
% \subsection{å®šä¹‰å¸¸é‡}
%
% \begin{variable}{\c_@@_normal_size_int, \c_@@_mid_size_int, \c_@@_small_size_int, \c_@@_normal_star_clist, 
%    \c_@@_mid_star_clist, \c_@@_small_star_clist }
% æ£‹ç›˜å°ºå¯¸åŠå¯¹åº”æ˜Ÿä½åæ&nbsp;‡ï¼š
%    \begin{macrocode}
\int_const:Nn \c_@@_normal_size_int { 19 }
\int_const:Nn \c_@@_mid_size_int { 13 }
\int_const:Nn \c_@@_small_size_int { 9 }
\clist_const:Nn \c_@@_normal_star_clist 
  { d4, j4, p4, d10, j10, p10, d16, j16, p16 }
\clist_const:Nn \c_@@_mid_star_clist 
  { c3, g3, k3, c7, g7, k7, c11, g11, k11 }
\clist_const:Nn \c_@@_small_star_clist { c3, k3, c7, k7 }
%    \end{macrocode}
% \end{variable}
%
%
% \begin{variable}{\c_@@_max_step_int, \c_@@_normal_mode_str, \c_@@_sgf_mode_str }
% æ”¯æŒçš„æœ€å¤§æ­¥æ•°åŠåæ&nbsp;‡æ˜¾ç¤ºæ¨¡å¼ï¼š
%    \begin{macrocode}
\int_const:Nn \c_@@_max_step_int { 500 }
\str_const:Nn \c_@@_normal_mode_str { normal }
\str_const:Nn \c_@@_sgf_mode_str { sgf }
%    \end{macrocode}
% \end{variable}
%
%
% \subsection{å®šä¹‰å˜é‡}
%
% \subsubsection{æ£‹ç›˜ä¿¡æ¯}
%
% æ£‹ç›˜ä¿¡æ¯åŒ…å«æ–¹ä½ï¼ˆ$x/y$æ–¹å‘åŠæ˜¯å¦äº’æ¢ä¸‰è€…å†³å®šï¼‰ã€æ¯”ä¾‹ã€æœ€å°æ˜¾ç¤ºå¤§å°ï¼ˆé•¿ä¸Žå®½ï¼‰åŠåæ&nbsp;‡æŽ§åˆ¶ï¼ˆæ˜¯å¦æ˜¾ç¤ºåŠåæ&nbsp;‡æ¨¡å¼ï¼‰ã€‚
% å…±æœ‰ $8$ ä¸ªå˜é‡æŽ§åˆ¶ï¼Œä¸”å‡å…·æœ‰å…¨å±€åŠæœ¬åœ°ä¹‹åˆ†ã€‚å…¨å±€å˜é‡ä¸ºé»˜è®¤å€¼ï¼Œæœ¬åœ°ä¸ºå½“å‰å¯¹å±€çš„è®¾ç½®ã€‚
%
% \begin{variable}{\g_@@_x_direction_int, \g_@@_y_direction_int, \g_@@_swap_xy_bool, 
%    \g_@@_scale_fp, \g_@@_min_width_int, \g_@@_min_hight_int, \g_@@_show_loc_bool,
%    \g_@@_loc_mode_str}
% å…¨å±€æ£‹ç›˜ä¿¡æ¯ï¼š
%    \begin{macrocode}
\int_new:N \g_@@_x_direction_int
\int_new:N \g_@@_y_direction_int
\bool_new:N \g_@@_swap_xy_bool
\fp_new:N \g_@@_scale_fp
\int_new:N \g_@@_min_width_int
\int_new:N \g_@@_min_hight_int
\bool_new:N \g_@@_show_loc_bool
\str_new:N \g_@@_loc_mode_str
%    \end{macrocode}
%    \begin{macrocode}
\int_gset:Nn \g_@@_x_direction_int { 1 }
\int_gset:Nn \g_@@_y_direction_int { 1 }
\bool_gset_false:N \g_@@_swap_xy_bool
\fp_gset:Nn \g_@@_scale_fp { 1 }
\int_gset:Nn \g_@@_min_width_int { 3 }
\int_gset:Nn \g_@@_min_hight_int { 2 }
\bool_gset_true:N \g_@@_show_loc_bool
\str_gset_eq:NN \g_@@_loc_mode_str \c_@@_normal_mode_str
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_x_direction_int, \l_@@_y_direction_int, \l_@@_swap_xy_bool, 
%    \l_@@_scale_fp, \l_@@_min_width_int, \l_@@_min_hight_int, \l_@@_show_loc_bool,
%    \l_@@_loc_mode_str}
% æœ¬åœ°æ£‹ç›˜ä¿¡æ¯ï¼š
%    \begin{macrocode}
\int_new:N \l_@@_x_direction_int
\int_new:N \l_@@_y_direction_int
\bool_new:N \l_@@_swap_xy_bool
\fp_new:N \l_@@_scale_fp
\int_new:N \l_@@_min_width_int
\int_new:N \l_@@_min_hight_int
\bool_new:N \l_@@_show_loc_bool
\str_new:N \l_@@_loc_mode_str
%    \end{macrocode}
% \end{variable}
%
%
% \subsubsection{å¯¹å±€ä¿¡æ¯}
%
% å¯¹å±€ä¿¡æ¯åŒ…æ‹¬æ£‹ç›˜å¤§å°ã€æ­¥æ•°ã€æ£‹å­/æ&nbsp;‡ç­¾çš„ä¿¡æ¯é›†ï¼ˆ$x/y$ åæ&nbsp;‡ï¼Œæ£‹æ‰‹ï¼Œæ&nbsp;‡ç­¾ï¼‰ã€æ­»å­é›†ï¼ˆç´¢å¼•ï¼‰åŠæŒ‡ç¤ºç‚¹é›†ï¼ˆä¸‰è‰²ï¼‰ç»„æˆã€‚
% å…± $10$ ä¸ªå˜é‡ï¼Œå¦åŠ&nbsp;ä¸€ä¸ªé»˜è®¤æ£‹ç›˜å¤§å°ã€‚æœ¬å°èŠ‚çš„å˜é‡çš„å–å€¼å‡ä¸ºåŽŸå§‹æ–¹ä½çš„å–å€¼ã€‚
%
% \begin{variable}{\g_@@_default_size_int}
% é»˜è®¤å¯¹å±€å¤§å°ï¼š
%    \begin{macrocode}
\int_new:N \g_@@_default_size_int
\int_gset_eq:NN \g_@@_default_size_int \c_@@_normal_size_int
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_size_int, \g_@@_step_count_int, \g_@@_x_intarray, 
%   \g_@@_y_intarray, \g_@@_player_intarray, \g_@@_label_seq, \g_@@_die_seq}
% å¯¹å±€å†…å®¹ï¼š
%    \begin{macrocode}
\int_new:N \g_@@_size_int
\int_new:N \g_@@_step_count_int
\intarray_new:Nn \g_@@_x_intarray { \c_@@_max_step_int }
\intarray_new:Nn \g_@@_y_intarray { \c_@@_max_step_int }
\intarray_new:Nn \g_@@_player_intarray { \c_@@_max_step_int }
\seq_new:N \g_@@_label_seq
\seq_new:N \g_@@_die_seq
%    \end{macrocode}
% \end{variable}
%
%
% \begin{variable}{\g_@@_red_point_clist, \g_@@_green_point_clist,\g_@@_blue_point_clist}
% å¯¹å±€è¾…åŠ©æŒ‡ç¤ºç‚¹ï¼š
%    \begin{macrocode}
\clist_new:N \g_@@_red_point_clist
\clist_new:N \g_@@_green_point_clist
\clist_new:N \g_@@_blue_point_clist
%    \end{macrocode}
% \end{variable}
%
%
% \subsubsection{è¾¹ç•Œä¿¡æ¯}
%
% æœ¬å°èŠ‚çš„å˜é‡ä¸ºç»˜å›¾è¿‡ç¨‹ä¸­ä½¿ç”¨çš„è¾¹ç•Œä¿¡æ¯å˜é‡ã€‚å…¶æ˜¯åæ&nbsp;‡æ˜¯è€ƒè™‘æ–¹ä½ä¿¡æ¯çš„ï¼Œä½†å·¦å³ã€ä¸Šä¸‹åŠå¤§å°ä¸è€ƒè™‘ã€‚
%
% æ£‹å­åŒºé—´ï¼ˆä¸è€ƒè™‘å»¶ä¼¸çš„ä¿¡æ¯ï¼‰ï¼š
%    \begin{macrocode}
\int_new:N \l_@@_x_min_int
\int_new:N \l_@@_x_max_int
\int_new:N \l_@@_y_min_int
\int_new:N \l_@@_y_max_int
%    \end{macrocode}
%
% æ£‹ç›˜è¾¹ç•Œï¼ˆè€ƒè™‘å»¶ä¼¸çš„ä¿¡æ¯ï¼‰ï¼š
%    \begin{macrocode}
\bool_new:N \l_@@_left_bool
\bool_new:N \l_@@_right_bool
\bool_new:N \l_@@_up_bool
\bool_new:N \l_@@_down_bool
\fp_new:N \l_@@_x_min_fp
\fp_new:N \l_@@_x_max_fp
\fp_new:N \l_@@_y_min_fp
\fp_new:N \l_@@_y_max_fp
%    \end{macrocode}
%
% \subsubsection{å…¶å®ƒå˜é‡}
% 
% é€šç”¨ä¿¡æ¯å˜é‡ï¼š
%    \begin{macrocode}
\str_new:N \l_@@_label_str
\int_new:N \l_@@_x_int
\int_new:N \l_@@_y_int
\int_new:N \l_@@_player_int
\fp_new:N \l_@@_x_fp
\fp_new:N \l_@@_y_fp
\clist_new:N \l_@@_point_clist
%    \end{macrocode}
%
% å…¶å®ƒä¸´æ—¶å˜é‡ï¼š
%    \begin{macrocode}
\int_new:N \l_@@_tmp_int
\str_new:N \l_@@_tmp_str
\bool_new:N \l_@@_tmp_bool
\seq_new:N \l_@@_tmp_seq
%    \end{macrocode}
%
%
% \subsection{è®¾ç½®æ£‹å±€çš„å‡½æ•°}
%
% \subsubsection{å¯¹å±€å‡†å¤‡}
%
% æŒ‡å®šå›´æ£‹å¤§å°ã€åˆå§‹åŒ–å¯¹å±€çš„å…¶ä½™ $9$ ä¸ªå˜é‡ï¼ˆæ¸…ç©ºå¯¹å±€æ‰€æœ‰å¯¹å±€ä¿¡æ¯ï¼‰åŠæ£‹ç›˜ä¿¡æ¯çš„ $8$ ä¸ªå˜é‡ï¼ˆä½¿ç”¨é»˜è®¤å€¼[å…¨å±€å˜é‡]ï¼‰ã€‚
%
% \begin{macro}{\@@_new_game:n}
% åˆå§‹åŒ–å¯¹å±€ä¿¡æ¯ï¼ˆ|#1| æ£‹ç›˜å¤§å°ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_new_game:n #1 
  { 
    \int_set_eq:NN \l_@@_x_direction_int \g_@@_x_direction_int
    \int_set_eq:NN \l_@@_y_direction_int \g_@@_y_direction_int
    \bool_set_eq:NN \l_@@_swap_xy_bool \g_@@_swap_xy_bool
    \fp_set_eq:NN \l_@@_scale_fp \g_@@_scale_fp
    \int_set_eq:NN \l_@@_min_width_int \g_@@_min_width_int
    \int_set_eq:NN \l_@@_min_hight_int \g_@@_min_hight_int
    \bool_set_eq:NN \l_@@_show_loc_bool \g_@@_show_loc_bool
    \str_set_eq:NN \l_@@_loc_mode_str \g_@@_loc_mode_str 
%    \end{macrocode}
%    \begin{macrocode}    
    \int_gset:Ne \g_@@_size_int { #1 }
    \int_gset:Nn \g_@@_step_count_int { 0 }
    \intarray_gzero:N \g_@@_x_intarray 
    \intarray_gzero:N \g_@@_y_intarray 
    \intarray_gzero:N \g_@@_player_intarray
    \seq_gclear:N \g_@@_label_seq  
    \seq_gclear:N \g_@@_die_seq 
%    \end{macrocode}
%    \begin{macrocode}   
    \clist_gclear:N \g_@@_red_point_clist
    \clist_gclear:N \g_@@_green_point_clist
    \clist_gclear:N \g_@@_blue_point_clist
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{åæ&nbsp;‡è½¬æ¢å‡½æ•°}
%
% å®žçŽ°æ£‹å­åæ&nbsp;‡çš„åæ&nbsp;‡å¯¹å½¢å¼ä¸Žå­—ç¬¦ä¸²å½¢å¼ï¼ˆè™šç€ä½¿ç”¨ |-| ï¼‰ä¸¤è€…ä¹‹é—´çš„è½¬æ¢ã€‚
%
% \begin{macro}{\@@_loc_to_xy:n, \@@_loc_to_xy:V}
% è®¾ç½® $x$ã€$y$ åæ&nbsp;‡å˜é‡ï¼ˆ|#1| åæ&nbsp;‡ï¼Œæ”¯æŒä¸¤ç§æ¨¡å¼ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_loc_to_xy:n #1
  { 
    \str_set:Nx \l_tmpa_str { \str_lowercase:n { #1 } }
    \bool_lazy_any:nTF
      {
        { \str_if_empty_p:N \l_tmpa_str }
        { \str_if_eq_p:Vn { \l_tmpa_str } { - } }
        { \str_if_eq_p:Vn { \l_tmpa_str } { pass } }
      }
      {
        \int_set:Nn \l_@@_x_int { 0 }
        \int_set:Nn \l_@@_y_int { 0 }
      }
      {      
        \int_set:Ne \l_@@_x_int 
          { \int_from_alph:e { \str_head:N \l_tmpa_str } }
        \regex_match:nVTF { [a-z]{2} } { \l_tmpa_str }
          { 
            \int_set:Ne \l_tmpa_int 
              { \int_from_alph:e { \str_tail:N \l_tmpa_str } } 
            \int_set:Nn \l_@@_y_int { \g_@@_size_int - \l_tmpa_int + 1 }
          } 
          { 
            \int_set:Ne \l_@@_y_int 
              { \str_range:Nnn \l_tmpa_str { 2 } { 5 } } 
          }
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\cs_generate_variant:Nn \@@_loc_to_xy:n { V }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_xy_to_loc:N}
% å°†æŒ‡å®šå˜é‡è®¾ç½®ä¸ºå½“å‰åæ&nbsp;‡çš„å­—ç¬¦ä¸²å½¢å¼ï¼ˆ|#1| æŒ‡å®šçš„å­˜å‚¨å˜é‡ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_xy_to_loc:N #1
  { 
    \int_compare:nNnTF { \l_@@_x_int } = { 0 }
      { \str_set:Nn #1 { - } }
      {
        \str_set:Nx \l_tmpa_str 
          { \int_to_alph:n { \l_@@_x_int } }
        \str_compare:eNeTF 
          { \l_@@_loc_mode_str } = { \c_@@_sgf_mode_str }
          { 
            \int_set:Nn \l_tmpa_int 
              { \g_@@_size_int - \l_@@_y_int + 1 } 
            \str_set:Nx \l_tmpb_str 
              { \int_to_alph:n { \l_tmpa_int } }   
            \str_put_right:NV \l_tmpa_str { \l_tmpb_str } 
          }
          { \str_put_right:NV \l_tmpa_str { \l_@@_y_int } }
        \str_set_eq:NN #1 \l_tmpa_str 
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{æ·»åŠ&nbsp;æ£‹å­æˆ–çº¯æ&nbsp;‡ç­¾}
%
% å‘å¯¹å±€ä¸­æ·»åŠ&nbsp;æ£‹å­æˆ–çº¯æ&nbsp;‡ç­¾ï¼Œå®ƒä»¬ä½¿ç”¨ç›¸åŒçš„ç»“æž„å­˜å‚¨ã€‚é™¤äº†æ‰€å±žæ–¹ä¸ä¸€æ&nbsp;·å¤–ï¼Œå®ƒä»¬å†…éƒ¨æ·»åŠ&nbsp;æ–¹å¼å®Œå…¨ç›¸åŒã€‚
% å…¶ä¸­ï¼Œæ‰€å±žæ–¹ç”¨ $0$ è¡¨ç¤ºæœªä½¿ç”¨\footnote{æ–°å±€å¼€å§‹ï¼Œæ‰€å±žæ–¹å‡åˆå§‹åŒ–ä¸º $0$ï¼›ç§»é™¤çŠ¶æ€çš„æ£‹å­ï¼Œä¹Ÿä¼šè®¾ç½®ä¸ºé›¶ï¼ˆåŒæ—¶åæ&nbsp;‡ä¹Ÿä¸ºé›¶ï¼‰ã€‚}ï¼Œ
% $1$ è¡¨ç¤ºé»‘æ–¹ï¼Œ$2$ è¡¨ç¤ºç™½æ–¹ï¼Œ$3$ è¡¨ç¤ºçº¯æ&nbsp;‡ç­¾ã€‚
%
% æ£‹å­å¯ä»¥å«æ&nbsp;‡ç­¾ï¼ˆå¦‚æ‰‹æ•°æˆ–ç‰¹æ®Šå­—ç¬¦ç­‰ï¼‰ï¼Œæ£‹å­|+| çº¯æ&nbsp;‡ç­¾ä¸ç­‰äºŽå¸¦æ&nbsp;‡ç­¾çš„æ£‹å­ã€‚
% å›&nbsp;ä¸ºå‰è€…æ˜¯ä¸¤æ¡è®°å½•ï¼ŒåŽè€…æ˜¯ä¸€æ¡è®°å½•ï¼ŒåŽç»­å¤„ç†ä¹Ÿä¸ä¸€æ&nbsp;·ã€‚
%
% \begin{macro}{\@@_add_stone:nnn, \@@_add_stone:nnV,  \@@_add_stone:nVV}
% å‘å¯¹å±€ä¸­æ·»åŠ&nbsp;ä¸€æ­¥æ£‹ï¼ˆ|#1| é»‘ç™½æ–¹ ï¼›|#2| åæ&nbsp;‡ï¼›|#3| æ&nbsp;‡ç­¾ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_stone:nnn #1#2#3
  {     
    \int_gincr:N \g_@@_step_count_int
    \intarray_gset:Nnn \g_@@_player_intarray 
      \g_@@_step_count_int { #1 }
%    \end{macrocode}
%    \begin{macrocode}
    \@@_loc_to_xy:n { #2 }
    \intarray_gset:Nnn \g_@@_x_intarray 
      \g_@@_step_count_int \l_@@_x_int 
    \intarray_gset:Nnn \g_@@_y_intarray 
      \g_@@_step_count_int \l_@@_y_int
%    \end{macrocode}
%    \begin{macrocode}
    \str_if_eq:nnTF { #3 } { 0 }  
      { \seq_put_right:Nn \g_@@_label_seq {} }
      { \seq_put_right:Nn \g_@@_label_seq { #3 } }
  }
%    \end{macrocode}
%    \begin{macrocode}
\cs_generate_variant:Nn \@@_add_stone:nnn {nnV, nVV}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_add_stones:nnn}
% æ‰¹é‡å‘å¯¹å±€ä¸­æ·»åŠ&nbsp;æ£‹å­ï¼ˆ|#1| é»‘ç™½æ–¹ ï¼›|#2| åæ&nbsp;‡åºåˆ—ï¼›|#3| æ&nbsp;‡ç­¾ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_stones:nnn #1#2#3
  { 
    \int_set:Nn \l_@@_player_int { #1 }
    \clist_set:Nn \l_@@_position_clsit { #2 }
    \bool_set_false:N \l_@@_tmp_bool
    \str_if_empty:nTF { #3 }
      { \str_set:Nn \l_@@_tmp_str {} } 
      {
        \regex_match:nnTF { [^0-9]+ } { #3 } 
          { \str_set:Nx \l_@@_tmp_str { #3 } } 
          { 
            \bool_set_true:N \l_@@_tmp_bool
            \int_set:Nn \l_@@_tmp_int { #3 }
          }
      }
    \clist_map_inline:Nn \l_@@_position_clsit
      {
        \bool_if:nTF \l_@@_tmp_bool
          {
            \@@_add_stone:nnV 
              { \l_@@_player_int } 
              { ##1 }
              { \l_@@_tmp_int }
            \int_case:nn { \l_@@_player_int } 
              {
                { 1 } { \int_set:Nn \l_@@_player_int { 2 } }
                { 2 } { \int_set:Nn \l_@@_player_int { 1 } }
                { 3 } { \int_set:Nn \l_@@_player_int { 3 } }
              }
            \int_compare:nNnT { \l_@@_tmp_int } &gt; { 0 }
              { \int_incr:N \l_@@_tmp_int }
          }
          { \@@_add_stone:nnV { #1 } { ##1 } { \l_@@_tmp_str } }    
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_add_sgf_stones:nn, \@@_add_sgf_stones:VV}
% æ‰¹é‡å‘å¯¹å±€ä¸­æ·»åŠ&nbsp; sgf æ&nbsp;¼å¼æ£‹å­ï¼ˆ|#1| å¸¦é»‘ç™½æ–¹çš„åæ&nbsp;‡åºåˆ—ï¼›|#2| æ&nbsp;‡ç­¾ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_sgf_stones:nn #1#2
  { 
    \regex_extract_all:nnN { ;[BW]\[[a-z]{2}\] } { #1 } \l_@@_tmp_seq
    \clist_set_from_seq:NN \l_@@_point_clist \l_@@_tmp_seq
    \bool_set_false:N \l_@@_tmp_bool
    \str_if_empty:nTF { #2 }
      { \str_set:Nn \l_@@_tmp_str {} } 
      {
        \regex_match:nnTF { [^0-9]+ } { #2 } 
          { \str_set:Nx \l_@@_tmp_str { #2 } } 
          { 
            \bool_set_true:N \l_@@_tmp_bool
            \int_set:Nn \l_@@_tmp_int { #2 }
          }
      }
    \clist_map_inline:Nn \l_@@_point_clist
      {
        \str_set:Nx \l_tmpa_str { \str_item:Nn { ##1 } { 2 } }
        \str_set:Nx \l_tmpb_str { \str_range:nnn { ##1 } { 4 } { -2 } }
        \str_case_e:nn { \l_tmpa_str }
        {
          { B } { \int_set:Nn \l_@@_player_int { 1 } }
          { W } { \int_set:Nn \l_@@_player_int { 2 } }
        }
        \bool_if:nTF \l_@@_tmp_bool
          {
            \@@_add_stone:nVV { \l_@@_player_int } 
              { \l_tmpb_str } { \l_@@_tmp_int }
            \int_compare:nNnT { \l_@@_tmp_int } &gt; { 0 }
              { \int_incr:N \l_@@_tmp_int }
          }
          { 
            \@@_add_stone:nVV { \l_@@_player_int } 
              { \l_tmpb_str } { \l_@@_tmp_str } 
          }    
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\cs_generate_variant:Nn  \@@_add_sgf_stones:nn { VV }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{ä¿®æ”¹å¯¹å±€}
%
% ä¿®æ”¹å¯¹å±€ä¸­çš„æ£‹å­ä¿¡æ¯ï¼ˆæ‰€æœ‰æ–¹ã€æ&nbsp;‡ç­¾ç­‰ï¼‰ã€ç§»é™¤æ£‹å­ æˆ–è®¾ç½®æ­»å­ç­‰ã€‚
% å…¶ä¸­ï¼Œç§»é™¤æ£‹å­ç›¸å½“äºŽæ²¡æœ‰è¾“å…¥è¿™ä¸ªæ£‹å­\footnote{
% ç§»é™¤æ£‹å­æ˜¯é€šè¿‡æŠŠè¯¥æ‰‹æ£‹å…¨éƒ¨è®¾ç½®ä¸ºé›¶æ¥å®žçŽ°ï¼›è¿™ä¸Žè™šç€ä¸ä¸€æ&nbsp;·ï¼ŒåŽè€…ä»æœ‰æ‰€å±žæ–¹ã€‚}ï¼›
% è€Œè®¾ç½®æ­»å­åˆ™ç”¨äºŽæ£‹å­è¢«åƒçš„æƒ…å†µ\footnote{
% è®¾ç½®æ­»å­æ˜¯é€šè¿‡å°†æ£‹åŠ&nbsp;å…¥æ­»å­åˆ—è¡¨ä¸­æ¥å®žçŽ°ï¼Œå…¶åæ&nbsp;‡ä¿¡æ¯å…¨éƒ¨ä¸å˜ã€‚}ã€‚
%
% \begin{macro}{\@@_reset_stone_number:n}
% é‡ç½®æ‰€æœ‰æ£‹å­çš„æ&nbsp;‡ç­¾ï¼Œç§»é™¤æ‰€æœ‰æ£‹å­æ&nbsp;‡ç­¾ï¼ˆä¸å«çº¯æ&nbsp;‡ç­¾ï¼‰å¹¶æŒ‰æ‰‹æ•°ï¼ˆä»¥ |#1| èµ·ä¸ºç¬¬ $1$ æ‰‹ï¼‰è®¾ç½®æ–°æ&nbsp;‡ç­¾ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_reset_stone_number:n #1
  { 
    \int_set:Ne \l_@@_tmp_int { 1 - #1 }
    \int_step_inline:nn { \c_@@_max_step_int } 
      {
        \bool_lazy_or:nnF
          {
            \int_compare_p:nNn
              { \intarray_item:Nn \g_@@_player_intarray { ##1 } } = { 0 }
          }
          {
            \int_compare_p:nNn
              { \intarray_item:Nn \g_@@_player_intarray { ##1 } } = { 3 }
          }          
          {            
            \int_incr:N \l_@@_tmp_int 
            \int_compare:nNnTF { \l_@@_tmp_int } &gt; { 0 }
              { \seq_gset_item:NnV \g_@@_label_seq { ##1 } { \l_@@_tmp_int } }
              { \seq_gset_item:Nnn \g_@@_label_seq { ##1 } {} }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_change_stone:n}
% åˆ‡æ¢æŒ‡å®šç´¢å¼•çš„æ£‹å­çš„é»‘ç™½æ–¹ï¼ˆ|#1| ç´¢å¼•ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_change_stone:n #1
  { 
    \int_case:nn 
      { \intarray_item:Nn \g_@@_player_intarray { #1 } }
      {
        { 1 } { \intarray_gset:Nnn \g_@@_player_intarray { #1 } { 2 } }
        { 2 } { \intarray_gset:Nnn \g_@@_player_intarray { #1 } { 1 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_remove_stone:n}
% åˆ&nbsp;é™¤æŒ‡å®šç´¢å¼•çš„æ£‹å­ï¼ˆ|#1| ç´¢å¼•ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_remove_stone:n #1
  { 
    \intarray_gset:Nnn \g_@@_x_intarray  { #1 } { 0 }
    \intarray_gset:Nnn \g_@@_y_intarray  { #1 } { 0 }
    \intarray_gset:Nnn \g_@@_player_intarray  { #1 } { 0 }
    \seq_gset_item:Nnn \g_@@_label_seq { #1} { }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_die_stone:n}
% è®¾ç½®æŒ‡å®šç´¢å¼•çš„æ£‹å­ä¸ºæ­»å­ï¼ˆ|#1| ç´¢å¼•ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_die_stone:n #1
  { 
    \seq_if_in:NnF \g_@@_die_seq { #1 }
      {
        \seq_put_right:Nn \g_@@_die_seq { #1 }
        \prg_break:
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_modify_stone:N}
% ä½¿ç”¨æŒ‡å®šå‡½æ•°ï¼ˆ|#1|ï¼‰ä¿®æ”¹æŒ‡å®šä½ç½®çš„æ£‹å­ï¼ˆç”± $x$, $y$ åæ&nbsp;‡æŒ‡å®šï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_modify_stone:N #1
  { 
    \int_step_inline:nn { \c_@@_max_step_int } 
      {
        \bool_lazy_and:nnT
        { 
          \int_compare_p:n 
            { \intarray_item:Nn \g_@@_x_intarray { ##1 } = \l_@@_x_int } 
        }
        {
          \int_compare_p:n 
            { \intarray_item:Nn \g_@@_y_intarray { ##1 } = \l_@@_y_int } 
        }
        { #1 { ##1 } }
      }
      \prg_break_point:
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_modify_stones:nN}
% æ‰¹é‡ä¿®æ”¹å½“å‰å¯¹å±€ä¸­çš„æ£‹å­ï¼ˆ|#1| åæ&nbsp;‡åºåˆ—ï¼Œ|#2| ä¿®æ”¹å‡½æ•°ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_modify_stones:nN #1#2
  { 
    \clist_set:Nn \l_@@_position_clsit { #1 }
    \clist_map_inline:Nn \l_@@_position_clsit
      {
        \@@_loc_to_xy:n { ##1 }
        \int_compare:nNnF { \l_@@_x_int } = { 0 }
          { \@@_modify_stone:N { #2 } }
      } 
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_clear_labels:}
% æ¸…é™¤æ‰€æœ‰çº¯æ&nbsp;‡ç­¾ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_clear_labels:
  { 
    \int_step_inline:nn { \c_@@_max_step_int } 
      {
        \int_compare:nNnT
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } } = { 3 }
          {
            \intarray_gset:Nnn \g_@@_x_intarray  { ##1 } { 0 }
            \intarray_gset:Nnn \g_@@_y_intarray  { ##1 } { 0 }
            \intarray_gset:Nnn \g_@@_player_intarray  { ##1 } { 0 }
            \seq_gset_item:Nnn \g_@@_label_seq { ##1 } {}
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% 
% \subsubsection{æŒ‡ç¤ºç‚¹}
%
% æŒ‡ç¤ºç‚¹æ˜¯æ£‹ç›˜ä¸Šçš„ç‰¹æ®Šåœ†ç‚¹ï¼Œå®ƒæ”¯æŒçº¢ç»¿è“ä¸‰ç§é¢œè‰²ã€‚æ—¨åœ¨ç”¨äºŽåœ¨æŸä¸ªç‰¹å®šæƒ…å†µä¸‹çš„ç‰¹æ®ŠæŒ‡ç¤ºã€‚
% æŒ‡ç¤ºç‚¹çš„å®žçŽ°åŽŸç†ä¸Žçº¯æ&nbsp;‡ç­¾å®Œå…¨ä¸ä¸€æ&nbsp;·ï¼Œä¾§é‡ç‚¹ä¹Ÿä¸ä¸€æ&nbsp;·ã€‚
%
% \begin{macro}{\@@_add_points:nn}
% æ‰¹é‡å‘å¯¹å±€ä¸­æ·»åŠ&nbsp;æŒ‡ç¤ºç‚¹ï¼ˆ|#1| é¢œè‰² ï¼›|#2| åæ&nbsp;‡åºåˆ—ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_points:nn #1#2
  { 
    \str_case:nn { #1 }
      {
        { red }   
        { \clist_gput_right:Nn \g_@@_red_point_clist { #2 } }
        { green } 
        { \clist_gput_right:Nn \g_@@_green_point_clist { #2 } }
        { blue }  
        { \clist_gput_right:Nn \g_@@_blue_point_clist { #2 } }
      }  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_clear_points:}
% æ¸…é™¤æ‰€æœ‰æŒ‡ç¤ºç‚¹ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_clear_points:
  { 
    \clist_clear:N \g_@@_red_point_clist 
    \clist_clear:N \g_@@_green_point_clist
    \clist_clear:N \g_@@_blue_point_clist
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{ç»˜åˆ¶æ£‹å±€çš„å‡½æ•°}
%
% \subsubsection{åæ&nbsp;‡å˜æ¢}
%
% ç”±äºŽå¯¹å±€ä¸­çš„åæ&nbsp;‡ä»¥åŽŸå§‹æ–¹ä½è¾“å…¥ä¸Žä¿å­˜ï¼Œè€Œæ˜¾ç¤ºæ—¶éœ€è¦æŒ‰æŒ‡å®šçš„æ–¹ä½æ¥æ˜¾ç¤ºï¼Œ
% å›&nbsp;æ­¤åœ¨æ˜¾ç¤ºï¼ˆç»˜å›¾ï¼‰å‰éœ€è¦æ&nbsp;¹æ®æ£‹ç›˜æ–¹ä½ä¿¡æ¯æ¥è¿›è¡Œåæ&nbsp;‡å˜æ¢ã€‚
%
% \begin{macro}{\@@_transform_xy:NN}
% è½¬æ¢åæ&nbsp;‡ï¼ˆ|#1|ã€|#2| åˆ†åˆ«ä¸º $x,y$ åæ&nbsp;‡ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_transform_xy:NN #1#2
  {
    \int_set:Ne \l_tmpa_int { #1 * \l_@@_x_direction_int }
    \int_set:Ne \l_tmpb_int { #2 * \l_@@_y_direction_int }
    \bool_if:NTF \l_@@_swap_xy_bool
      {
        \int_set_eq:NN #1 \l_tmpb_int
        \int_set_eq:NN #2 \l_tmpa_int
      }
      {
        \int_set_eq:NN #1 \l_tmpa_int
        \int_set_eq:NN #2 \l_tmpb_int
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{è¾¹ç•Œå‡½æ•°}
%
% ç»˜åˆ¶æ£‹å±€æ—¶ï¼Œéœ€è¦ç¡®è®¤è¦æ˜¾ç¤ºçš„åŒºåŸŸï¼ˆæ˜¾ç¤ºæ•´ä¸ªæ£‹ç›˜é€šå¸¸ä¸æ˜¯æœ€ä¼˜æ–¹æ¡ˆï¼‰ï¼Œ
% æœ¬å°èŠ‚æä¾›ä¸€ç³»åˆ—å‡½æ•°ï¼Œç”¨äºŽç¡®è®¤æ˜¾ç¤ºè¾¹ç•Œã€‚
%
% \begin{macro}{\@@_calc_range:}
% è®¡ç®—æ£‹å­æ‰€åœ¨åŒºé—´è¾¹ç•Œã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_calc_range:
  {
    \int_set:Nn \l_@@_x_min_int { 99 }
    \int_set:Nn \l_@@_y_min_int { 99 }
    \int_set:Nn \l_@@_x_max_int { 0 }
    \int_set:Nn \l_@@_y_max_int { 0 }
%    \end{macrocode} 
% éåŽ†ç”Ÿæˆè‡ªç„¶è¾¹ç•Œï¼š
%    \begin{macrocode}
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_compare:nNnF
          { \l_@@_x_int } = { 0 }
          {
            \int_compare:nNnT  
              \l_@@_x_min_int &gt; \l_@@_x_int 
              { \int_set_eq:NN \l_@@_x_min_int \l_@@_x_int } 
            \int_compare:nNnT
              \l_@@_x_max_int &lt; \l_@@_x_int 
              { \int_set_eq:NN \l_@@_x_max_int \l_@@_x_int } 
            \int_compare:nNnT
              \l_@@_y_min_int &gt; \l_@@_y_int 
              { \int_set_eq:NN \l_@@_y_min_int \l_@@_y_int } 
            \int_compare:nNnT
              \l_@@_y_max_int &lt; \l_@@_y_int 
              { \int_set_eq:NN \l_@@_y_max_int \l_@@_y_int }
          }
      }
%    \end{macrocode} 
% æ—&nbsp;æœ‰æ•ˆæ£‹å­çš„æƒ…å†µä¸‹ï¼Œæ˜¾ç¤ºæ•´ä¸ªæ£‹ç›˜ï¼š
%    \begin{macrocode}
  \int_compare:nNnT
    { \l_@@_x_min_int } = { 99 }
    {
      \int_set:Nn \l_@@_x_min_int { 1 }
      \int_set:Nn \l_@@_y_min_int { 1 }
      \int_set_eq:NN \l_@@_x_max_int \g_@@_size_int
      \int_set_eq:NN \l_@@_y_max_int \g_@@_size_int  
    }
%    \end{macrocode} 
% å‘å¤–å»¶ä¼¸ï¼Œä»¥ä¿è¯è‡³å°‘æœ‰ä¸€ä¸ªè§’ï¼š
%    \begin{macrocode}
    \int_set:Ne \l_tmpa_int 
      { \int_min:nn { \g_@@_size_int } { \l_@@_min_width_int } }
    \int_compare:nNnTF
      { \g_@@_size_int - \l_@@_x_max_int } &gt; { \l_@@_x_min_int - 1 } 
      { 
        \int_set:Nn \l_@@_x_min_int { 1 }
        \int_set:Ne \l_@@_x_max_int
          { \int_max:nn { \l_@@_x_max_int + 1 } { \l_tmpa_int } }
      } 
      { 
        \int_set_eq:NN \l_@@_x_max_int \g_@@_size_int 
        \int_compare:nNnF
          { \l_@@_x_min_int } = { 1 }
          {
            \int_set:Ne \l_@@_x_min_int 
              { 
                \int_min:nn 
                  { \l_@@_x_min_int - 1 } 
                  { \g_@@_size_int -  \l_tmpa_int + 1 }
              }
          }
      } 
    \int_set:Ne \l_tmpa_int 
      { \int_min:nn { \g_@@_size_int } { \l_@@_min_hight_int } }
    \int_compare:nNnTF
      { \g_@@_size_int - \l_@@_y_max_int } &gt; { \l_@@_y_min_int - 1 }  
      { 
        \int_set:Nn \l_@@_y_min_int { 1 } 
        \int_set:Ne \l_@@_y_max_int
          { \int_max:nn { \l_@@_y_max_int + 1 } { \l_tmpa_int } }
      } 
      { 
        \int_set_eq:NN \l_@@_y_max_int \g_@@_size_int 
        \int_compare:nNnF
          { \l_@@_y_min_int } = { 1 }
          {
            \int_set:Ne \l_@@_y_min_int 
              { 
                \int_min:nn 
                  { \l_@@_y_min_int - 1 } 
                  { \g_@@_size_int - \l_tmpa_int + 1 } 
              }
          }
      } 
%    \end{macrocode} 
% å˜æ¢åæ&nbsp;‡ï¼š
%    \begin{macrocode}
    \@@_transform_xy:NN \l_@@_x_min_int \l_@@_y_min_int
    \@@_transform_xy:NN \l_@@_x_max_int \l_@@_y_max_int      
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_set_range:n}
% æŒ‡å®šæ£‹å­åŒºé—´è¾¹ç•Œï¼ˆè¾¹ç•Œå¤–æ£‹å­ä¸æ˜¾ç¤ºï¼‰ï¼Œæ”¯æŒ |full|ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_set_range:n #1
  {
    \str_compare:eNeTF
      { \str_lowercase:n { #1 } } = { full }
      {
        \int_set:Nn \l_@@_x_min_int { 1 }
        \int_set:Nn \l_@@_y_min_int { 1 }
        \int_set_eq:NN \l_@@_x_max_int \g_@@_size_int
        \int_set_eq:NN \l_@@_y_max_int \g_@@_size_int
      }
      {
        \clist_set:Nn \l_@@_position_clsit { #1 }    
        \clist_pop:NN \l_@@_position_clsit \l_tmpa_tl
        \@@_loc_to_xy:V { \l_tmpa_tl }
        \int_set_eq:NN \l_@@_x_min_int \l_@@_x_int
        \int_set_eq:NN \l_@@_y_min_int \l_@@_y_int
        \clist_pop:NN \l_@@_position_clsit \l_tmpa_tl
        \@@_loc_to_xy:V { \l_tmpa_tl }
        \int_set_eq:NN \l_@@_x_max_int \l_@@_x_int
        \int_set_eq:NN \l_@@_y_max_int \l_@@_y_int      
      }
%    \end{macrocode}
% ç”Ÿæˆæ&nbsp;‡å‡†å¯¹è§’ç‚¹ï¼Œå˜æ¢åæ&nbsp;‡ï¼š
%    \begin{macrocode}
    \int_compare:nNnT { \l_@@_x_min_int } &gt; { \l_@@_x_max_int }
    {
      \int_set_eq:NN \l_tmpa_int \l_@@_x_min_int
      \int_set_eq:NN \l_@@_x_min_int \l_@@_x_max_int
      \int_set_eq:NN \l_@@_x_max_int \l_tmpa_int
    }
    \int_compare:nNnT { \l_@@_y_min_int } &gt; { \l_@@_y_max_int }
    {
      \int_set_eq:NN \l_tmpa_int \l_@@_y_min_int
      \int_set_eq:NN \l_@@_y_min_int \l_@@_y_max_int
      \int_set_eq:NN \l_@@_y_max_int \l_tmpa_int
    }
    \@@_transform_xy:NN \l_@@_x_min_int \l_@@_y_min_int
    \@@_transform_xy:NN \l_@@_x_max_int \l_@@_y_max_int      
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_calc_board_border:}
% è®¡ç®—æ£‹ç›˜çš„æ˜¾ç¤ºè¾¹ç•Œã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_calc_board_border:
  {    
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_x_min_int } } = { 1 }
      {
        \bool_set_true:N \l_@@_left_bool
        \fp_set:Nn \l_@@_x_min_fp 
          { \l_@@_x_min_int }
      }
      { 
        \bool_set_false:N \l_@@_left_bool
        \fp_set:Nn \l_@@_x_min_fp 
          { \l_@@_x_min_int - 0.3 * \int_sign:n { \l_@@_x_min_int } }           
      } 
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_x_max_int } } = { \g_@@_size_int }
      {
        \bool_set_true:N \l_@@_right_bool
        \fp_set:Nn \l_@@_x_max_fp 
          { \l_@@_x_max_int }
      }
      { 
        \bool_set_false:N \l_@@_right_bool
        \fp_set:Nn \l_@@_x_max_fp 
          { \l_@@_x_max_int + 0.3 * \int_sign:n { \l_@@_x_max_int } }
      }     
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_y_min_int } } = { 1 }
      {
        \bool_set_true:N \l_@@_down_bool
        \fp_set:Nn \l_@@_y_min_fp 
          { \l_@@_y_min_int }
      }
      { 
        \bool_set_false:N \l_@@_down_bool
        \fp_set:Nn \l_@@_y_min_fp 
          { \l_@@_y_min_int - 0.3 * \int_sign:n { \l_@@_y_min_int } }           
      } 
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_y_max_int } } = { \g_@@_size_int }
      {
        \bool_set_true:N \l_@@_up_bool
        \fp_set:Nn \l_@@_y_max_fp 
          { \l_@@_y_max_int }
      }
      { 
        \bool_set_false:N \l_@@_up_bool
        \fp_set:Nn \l_@@_y_max_fp 
          { \l_@@_y_max_int + 0.3 * \int_sign:n { \l_@@_y_max_int } }           
      }
  }  
%    \end{macrocode}
% \end{macro} 
%
%
% \begin{macro}{\@@_within_range_p:nn, \@@_within_range:nnT}
% åˆ¤å®šç‚¹æ˜¯å¦åœ¨èŒƒå›´å†…ï¼ˆ|#1| $x$åæ&nbsp;‡ï¼›|#2| $y$ åæ&nbsp;‡ï¼‰ã€‚
% åæ&nbsp;‡æ˜¯å˜æ¢åŽçš„åæ&nbsp;‡ã€‚
%    \begin{macrocode}
\prg_set_conditional:Npnn \@@_within_range:nn #1#2 { p, T }
  {
    \fp_set:Nn \l_tmpa_fp { abs( \l_@@_x_min_fp - #1 ) }
    \fp_add:Nn \l_tmpa_fp { abs( \l_@@_x_max_fp - #1 ) }
    \fp_sub:Nn \l_tmpa_fp { abs( \l_@@_x_max_fp - \l_@@_x_min_fp ) }
    \fp_add:Nn \l_tmpa_fp { abs( \l_@@_y_min_fp - #2 ) }
    \fp_add:Nn \l_tmpa_fp { abs( \l_@@_y_max_fp - #2 ) }
    \fp_sub:Nn \l_tmpa_fp { abs( \l_@@_y_max_fp - \l_@@_y_min_fp ) }
    \fp_compare:nNnTF
      { \l_tmpa_fp } &lt; { 0.1 }
      { \prg_return_true: }
      { \prg_return_false: }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{ç»˜åˆ¶å‡½æ•°}
%
% ç»˜åˆ¶å¯¹å±€åŒ…æ‹¬ç»˜åˆ¶æ£‹ç›˜ã€æ£‹å­ä¸Žçº¯æ&nbsp;‡ç­¾ã€æ&nbsp;‡è®°ç‚¹åŠæ­»å­å‡&nbsp;ä¸ªæ­¥éª¤ã€‚
% å…¶ä¸­ï¼Œæ£‹ç›˜åŒ…æ‹¬ç½‘æ&nbsp;¼çº¿ã€è¾¹ç•Œçº¿ã€è§’ã€æ˜Ÿä½åŠåæ&nbsp;‡æ&nbsp;‡ç­¾ã€‚
% ç»˜åˆ¶å‰éœ€è¦è®¾ç½®å¥½æ£‹å­åŒºé—´è¾¹ç•Œ\footnote{æ£‹ç›˜è¾¹ç•Œåœ¨ç»˜åˆ¶æ£‹ç›˜æ—¶å†…éƒ¨è°ƒç”¨ï¼Œå›&nbsp;æ­¤ä¸éœ€è¦é¢å¤–è®¾ç½®ã€‚}ã€‚
%
%
% \begin{macro}{\@@_draw_board_grid:}
% ç»˜åˆ¶æ£‹ç›˜çš„ç½‘æ&nbsp;¼çº¿ï¼ˆè·¯å¾„ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_grid:
  {
    \int_set:Ne \l_@@_tmp_int 
      { \int_sign:n { \l_@@_x_max_int - \l_@@_x_min_int } }
    \int_step_inline:nnnn
      { \l_@@_x_min_int } { \l_@@_tmp_int } { \l_@@_x_max_int }
      {
        \draw_path_moveto:n { ##1 cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { ##1 cm, \l_@@_y_max_fp cm }
      }      
    \int_set:Ne \l_@@_tmp_int 
      { \int_sign:n { \l_@@_y_max_int - \l_@@_y_min_int } }
    \int_step_inline:nnnn 
      { \l_@@_y_min_int } { \l_@@_tmp_int } { \l_@@_y_max_int }
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, ##1 cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, ##1 cm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_border:}
% ç»˜åˆ¶æ£‹ç›˜çš„è¾¹ç•Œçº¿ï¼ˆè·¯å¾„ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_border:
  {
    \bool_if:nT { \l_@@_left_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
      }
    \bool_if:nT { \l_@@_right_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
      }
    \bool_if:nT { \l_@@_down_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
      }
    \bool_if:nT { \l_@@_up_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_corner:}
% ç»˜åˆ¶æ£‹ç›˜çš„è§’ï¼ˆè·¯å¾„ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_corner:
  {
    \bool_if:nT { \l_@@_left_bool &amp;&amp; \l_@@_down_bool }     
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
      }
    \bool_if:nT { \l_@@_right_bool &amp;&amp; \l_@@_down_bool }         
      {
        \draw_path_moveto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
      }
    \bool_if:nT { \l_@@_right_bool &amp;&amp; \l_@@_up_bool }      
      {
        \draw_path_moveto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
      }
    \bool_if:nT { \l_@@_left_bool &amp;&amp; \l_@@_up_bool }           
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_draw_point:n}
% ç»˜åˆ¶å•ä¸ªç‚¹ï¼ˆè·¯å¾„ï¼‰ï¼ˆ|#1| åæ&nbsp;‡ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Npn \@@_draw_point:n #1
  {
    \__weiqi_loc_to_xy:n { #1 }
    \@@_transform_xy:NN \l_@@_x_int \l_@@_y_int 
    \@@_within_range:nnT { \l_@@_x_int } { \l_@@_y_int } 
      { 
        \draw_path_circle:nn 
          { \l_@@_x_int  cm, \l_@@_y_int cm } { 1mm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_star:}
% ç»˜åˆ¶æ£‹ç›˜çš„æ˜Ÿä½ï¼ˆè·¯å¾„ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_star:
  {
    \clist_clear:N \l_@@_point_clist
    \int_case:nn { \g_@@_size_int }
      {
        { \c_@@_normal_size_int }
        { \clist_set_eq:NN \l_@@_point_clist \c_@@_normal_star_clist }
        { \c_@@_mid_size_int }
        { \clist_set_eq:NN \l_@@_point_clist \c_@@_mid_star_clist }
        { \c_@@_small_size_int }
        { \clist_set_eq:NN \l_@@_point_clist \c_@@_small_star_clist }
      }
    \clist_map_function:NN \l_@@_point_clist \@@_draw_point:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_set_loc_label:nn}
% è®¾ç½®åæ&nbsp;‡æ&nbsp;‡ç­¾ï¼ˆ|#1| æ&nbsp;‡ç­¾æ–¹æ¡ˆï¼›|#2| å•è½´åæ&nbsp;‡ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Npn \@@_set_loc_label:nn #1#2
  {
    \str_case_e:nn { #1 }
    {
      { A }
      { \str_set:Nx \l_@@_label_str { \int_to_Alph:n { #2 } } }
      { \c_@@_normal_mode_str }
      { \str_set:NV \l_@@_label_str { #2 } }      
      { \c_@@_sgf_mode_str }
      { 
        \int_set:Nn \l_tmpa_int { \g_@@_size_int - #2 + 1 }
        \str_set:Nx\l_@@_label_str { \int_to_alph:n { \l_tmpa_int } } 
      }
    }    
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_loc:}
% ç»˜åˆ¶æ£‹ç›˜çš„åæ&nbsp;‡ï¼ˆè·¯å¾„ï¼‰ã€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_loc:
  {
    \int_gset:Nn \g_tmpa_int 
      { \int_sign:n { \l_@@_x_max_int - \l_@@_x_min_int } }   
    \int_gset:Nn \g_tmpb_int 
      { \int_sign:n { \l_@@_y_max_int - \l_@@_y_min_int } }       
    \int_step_inline:nnnn
      { \l_@@_x_min_int } { \g_tmpa_int } { \l_@@_x_max_int }
      {
        \int_set:Ne \l_@@_tmp_int { \int_abs:n { ##1 } }
        \bool_if:NTF \l_@@_swap_xy_bool
          { \@@_set_loc_label:nn { \l_@@_loc_mode_str } { \l_@@_tmp_int } }
          { \@@_set_loc_label:nn { A } { \l_@@_tmp_int } }        
        \hbox_set:Nn \l_tmpa_box { \l_@@_label_str } 
        \fp_set:Nn \l_tmpa_fp { 0.2 * \g_tmpb_int }
        \fp_set:Nn \l_tmpb_fp { 0.5 * { \box_ht:N \l_tmpa_box } * \g_tmpb_int }
        \bool_if:NT \l_@@_up_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {
                ##1 cm - 0.5 * { \box_wd:N \l_tmpa_box },
                (\l_@@_y_max_fp + \l_tmpa_fp ) cm - abs(\l_tmpb_fp) + \l_tmpb_fp
              } 
          }
        \bool_if:NT \l_@@_down_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {
                ##1 cm - 0.5 * { \box_wd:N \l_tmpa_box },
                (\l_@@_y_min_fp - \l_tmpa_fp ) cm - abs(\l_tmpb_fp) - \l_tmpb_fp 
              } 
          } 
      }
    \int_step_inline:nnnn
      { \l_@@_y_min_int } { \g_tmpb_int } { \l_@@_y_max_int }
      {
        \int_set:Ne \l_@@_tmp_int { \int_abs:n { ##1 } }
        \bool_if:NTF \l_@@_swap_xy_bool
          { \@@_set_loc_label:nn { A } { \l_@@_tmp_int } }
          { \@@_set_loc_label:nn { \l_@@_loc_mode_str } { \l_@@_tmp_int } }    
        \hbox_set:Nn \l_tmpa_box { \l_@@_label_str } 
        \fp_set:Nn \l_tmpa_fp { 0.2 * \g_tmpa_int }
        \fp_set:Nn \l_tmpb_fp { 0.5 * { \box_wd:N \l_tmpa_box } * \g_tmpa_int }
        \bool_if:NT \l_@@_left_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {               
                (\l_@@_x_min_fp - \l_tmpa_fp) cm  - abs(\l_tmpb_fp) - \l_tmpb_fp,
                 ##1 cm - 0.5 * { \box_ht:N \l_tmpa_box }
              } 
          } 
        \bool_if:NT \l_@@_right_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {                
                (\l_@@_y_max_fp + \l_tmpa_fp) cm  - abs(\l_tmpb_fp) + \l_tmpb_fp,
                ##1 cm - 0.5 * { \box_ht:N \l_tmpa_box }
              } 
          }   
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board:}
% ç»˜åˆ¶å®Œæ•´çš„æ£‹ç›˜å…ƒç´&nbsp;ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_board:
  {
    \@@_calc_board_border:
%    \end{macrocode} 
%
%    \begin{macrocode}     
    \draw_linewidth:n { 0.7 }
    \color_select:n { black }
    \@@_draw_board_grid:
    \draw_path_use_clear:n { stroke }
%    \end{macrocode} 
%
%    \begin{macrocode} 
    \draw_linewidth:n { 2 }
    \@@_draw_board_border:
    \draw_path_use_clear:n { stroke }
    \@@_draw_board_corner:
    \draw_path_use_clear:n { stroke }
%    \end{macrocode} 
%
%    \begin{macrocode}     
    \color_select:n { black }
    \@@_draw_board_star:
    \draw_path_use_clear:n { draw, fill }
%    \end{macrocode} 
%
%    \begin{macrocode} 
    \color_select:n { black!50 }
    \bool_if:NT \l_@@_show_loc_bool
      { \@@_draw_board_loc: }
    \draw_path_use_clear:n { stroke }  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_points:}
% ç»˜åˆ¶å®Œæ•´çš„æŒ‡ç¤ºç‚¹ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_draw_points:
  {
    \color_select:n { red }
    \clist_map_function:NN \g_@@_red_point_clist \@@_draw_point:n
    \draw_path_use_clear:n { draw, fill }
    \color_select:n { green }
    \clist_map_function:NN \g_@@_green_point_clist \@@_draw_point:n
    \draw_path_use_clear:n { draw, fill }
    \color_select:n { blue }
    \clist_map_function:NN \g_@@_blue_point_clist \@@_draw_point:n
    \draw_path_use_clear:n { draw, fill }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_draw_stone:nnnn}
% ç»˜åˆ¶ä¸€æ‰‹æ£‹æˆ–çº¯æ&nbsp;‡ç­¾ï¼ˆ|#1| é»‘ç™½æ–¹ï¼›|#2| $x$åæ&nbsp;‡ï¼›|#3| $y$ åæ&nbsp;‡ï¼›|#4| æ&nbsp;‡ç­¾ï¼‰ã€‚\\
% åæ&nbsp;‡æ˜¯å˜æ¢åŽçš„åæ&nbsp;‡ã€‚
%    \begin{macrocode}
\cs_new:Npn \@@_draw_stone:nnnn #1#2#3#4
  {
%    \end{macrocode}
% ç»˜åˆ¶å¤–å›´ç©ºç™½ï¼Œå¦‚æžœæ˜¯çº¯æ&nbsp;‡ç­¾åˆ™ä¸ç»˜åˆ¶ï¼š
%    \begin{macrocode}
    \int_compare:nNnF { #1 } = { 3 }
      {
        \color_fill:n { white }
        \draw_path_circle:nn { #2cm, #3cm } { 4.4mm }
        \draw_path_use_clear:n { fill }
      }
%    \end{macrocode}
% ç»˜åˆ¶æ£‹å­ï¼ˆä¸å«æ&nbsp;‡ç­¾ï¼‰ï¼›å¦‚æžœä¸ºçº¯æ&nbsp;‡ç­¾ï¼Œåˆ™ç»˜åˆ¶ç©ºç™½ï¼š
%    \begin{macrocode}
    \color_select:n { black }
    \int_case:nn { #1 }
      {
        { 1 } { \color_fill:n { black } } 
        { 2 } { \color_fill:n { white } }
        { 3 } { \color_select:n { white } }
      }
    \draw_path_circle:nn{ #2cm, #3cm } { 4mm }
    \draw_path_use_clear:n { draw, fill }
%    \end{macrocode}
% ç»˜åˆ¶æ£‹å­æ&nbsp;‡ç­¾ï¼š
%    \begin{macrocode}
    \int_case:nn { #1 }
      {
        { 1 } { \color_select:n { white } } 
        { 2 } { \color_select:n { black } }
        { 3 } { \color_select:n { blue } }
      }
    \hbox_set:Nn \l_tmpa_box { \Large \textbf{ #4 } } 
    \draw_box_use:Nn \l_tmpa_box 
      {
        #2cm - 0.5 * { \box_wd:N \l_tmpa_box },
        #3cm - 0.5 * { \box_ht:N \l_tmpa_box }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_stones:}
% ç»˜åˆ¶å®Œæ•´çš„å¸¸è§„æ£‹å­ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_stones:
  {
    \draw_linewidth:n { 1 }
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_set:Ne \l_@@_player_int
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } }
        \str_set:Nx \l_@@_tmp_str 
          { \seq_item:Nn \g_@@_label_seq { ##1 } }
        \seq_if_in:NnT \g_@@_die_seq { ##1 } 
          { \int_set:Nn \l_@@_x_int { 0 } }
        \int_if_zero:nF { \l_@@_x_int }
          {
            \@@_transform_xy:NN \l_@@_x_int \l_@@_y_int 
            \@@_within_range:nnT 
              { \l_@@_x_int } { \l_@@_y_int }
              {
                \@@_draw_stone:nnnn { \l_@@_player_int }
                  { \l_@@_x_int } { \l_@@_y_int } { \l_@@_tmp_str }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_specific_stone:}
% ç»˜åˆ¶æŒ‡å®šçš„ä¸€ä¸ªç‰¹æ®Šçš„æ£‹å­ï¼ˆæ­»å­ã€è™šç€ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_specific_stone:
  {
    \color_select:n { black }
    \int_case:nn { \l_@@_player_int }
      {
        { 1 } { \color_fill:n { black } } 
        { 2 } { \color_fill:n { white } }
      }
    \draw_path_circle:nn{ \l_@@_x_fp cm, \l_@@_y_fp cm } { 4mm }
    \draw_path_use_clear:n { draw, fill }
%    \end{macrocode}
%    \begin{macrocode}
    \int_case:nn { \l_@@_player_int }
      {
        { 1 } { \color_select:n { white } } 
        { 2 } { \color_select:n { black } }
      }  
    \@@_xy_to_loc:N \l_tmpa_str
    \hbox_set:Nn \l_tmpa_box { \Large \textbf{ \l_@@_tmp_str } } 
    \hbox_set:Nn \l_tmpb_box { \Large \texttt{ \l_tmpa_str } } 
    \draw_box_use:Nn \l_tmpa_box 
      {
        \l_@@_x_fp cm - 0.5 * { \box_wd:N \l_tmpa_box },
        \l_@@_y_fp cm - 0.5 * { \box_ht:N \l_tmpa_box }
      }
    \color_select:n { black }
    \draw_box_use:Nn \l_tmpb_box 
      {
        \l_@@_x_fp cm + 6mm,
        \l_@@_y_fp cm - 0.5 * { \box_ht:N \l_tmpa_box }
      }
%    \end{macrocode}
%    \begin{macrocode}
    \fp_set:Nn \l_tmpa_fp { min(\l_@@_x_min_fp, \l_@@_x_max_fp) }
    \fp_set:Nn \l_tmpb_fp { max(\l_@@_x_min_fp, \l_@@_x_max_fp) }
    \fp_add:Nn \l_@@_x_fp { 2 }
    \fp_compare:nNnT { \l_@@_x_fp } &gt; { \l_tmpb_fp }
      {
        \fp_set_eq:NN \l_@@_x_fp \l_tmpa_fp
        \fp_sub:Nn \l_@@_y_fp { 1 }
      }
  } 
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_specific_stones:}
% ç»˜åˆ¶å®Œæ•´çš„ç‰¹æ®Šæ£‹å­ï¼ˆæ­»å­ã€è™šç€ï¼‰ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_specific_stones:
  {
    \draw_linewidth:n { 1 }
    \fp_set:Nn \l_@@_x_fp { min(\l_@@_x_min_int, \l_@@_x_max_int) }
    \fp_set:Nn \l_@@_y_fp { min(\l_@@_y_min_int, \l_@@_y_max_int) - 1.2}
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_set:Ne \l_@@_player_int
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } }
        \str_set:Nx \l_@@_tmp_str 
          { \seq_item:Nn \g_@@_label_seq { ##1 } }
%    \end{macrocode}     
%    \begin{macrocode}     
        \seq_if_in:NnTF \g_@@_die_seq { ##1 } 
          { \int_set:Nn \l_tmpa_int { 0 } }
          { \int_set_eq:NN \l_tmpa_int \l_@@_x_int }
        \str_compare:eNeT { \l_@@_tmp_str } = {}
          { \int_set:Nn \l_tmpa_int { 1 } }
        \bool_lazy_all:nT
          {
            { \int_compare_p:nNn { \l_tmpa_int } = { 0 } }
            { \int_compare_p:nNn { \l_@@_player_int } &gt; { 0 } }
            { \int_compare_p:nNn { \l_@@_player_int } &lt; { 3 } }
          }
          { \@@_draw_specific_stone: }
      } 
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_show:}
% æ˜¾ç¤ºå®Œæ•´å¯¹å±€ã€‚
%    \begin{macrocode}
\cs_new:Nn \@@_show:
  {
    \draw_begin:
      \group_begin:
        \draw_transform_scale:n { \l_@@_scale_fp }
        \@@_draw_board:   
        \@@_draw_points:   
        \@@_draw_stones:
        \@@_draw_specific_stones:
      \group_end:
    \draw_end:
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{å®šä¹‰æ–‡æ¡£å‘½ä»¤}
%
% æœ¬èŠ‚å®šä¹‰äº†ä¸€äº›ä¾›å®åŒ…å¤–ä½¿ç”¨çš„æ–‡æ¡£å‘½ä»¤ã€‚
%
% \begin{macro}{\newweiqi}
% å¼€å§‹æ–°å¯¹å±€ã€‚
%    \begin{macrocode}
\NewDocumentCommand \newweiqi { s o }
  {
     \IfNoValueTF { #2 }
       { \@@_new_game:n { \g_@@_default_size_int } }
       { 
         \IfBooleanT { #1 } { \int_gset:Nn \g_@@_default_size_int { #2 } }
         \@@_new_game:n { #2 } 
       }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqisize}
% æ›´æ”¹æ£‹ç›˜å¤§å°ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqisize { s m }
  {
    \IfBooleanT{ #1 }
      { \int_gset:Nn \g_@@_default_size_int { #2 } }
    \int_set:Nn \g_@@_size_int { #2 }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiblack, \weiqiwhite}
% æ·»åŠ&nbsp;é»‘/ç™½æ£‹å­ã€‚æ˜Ÿå·ç‰ˆæœ¬å‘½ä»¤æ—&nbsp;åŒºåˆ«ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiblack { s o m }
  { 
    \IfNoValueTF { #2 }
      { \@@_add_stones:nnn { 1 } { #3 } { } }
      { \@@_add_stones:nnn { 1 } { #3 } { #2 } }
  }
%    \end{macrocode}
%    \begin{macrocode}
\NewDocumentCommand \weiqiwhite { s o m }
  { 
    \IfNoValueTF { #2 }
      { \@@_add_stones:nnn { 2 } { #3 } { } }
      { \@@_add_stones:nnn { 2 } { #3 } { #2 } }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqisgf}
% ä½¿ç”¨ sgf æ–‡æœ¬æ·»åŠ&nbsp;é»‘/ç™½æ£‹å­ã€‚æ˜Ÿå·ç‰ˆæœ¬å‘½ä»¤æ—&nbsp;åŒºåˆ«ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqisgf { s o m }
  { 
    \IfNoValueTF { #2 }
      { \@@_add_sgf_stones:nn { #3 } { } }
      { \@@_add_sgf_stones:nn { #3 } { #2 } }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\inputsgf}
% è¯»å– sgf æ£‹è°±ã€‚æ˜Ÿå·ç‰ˆæœ¬å‘½ä»¤æ—&nbsp;åŒºåˆ«ã€‚
%    \begin{macrocode}
\NewDocumentCommand \inputsgf { s o m }
  { 
    \ior_open:Nn \g_tmpa_ior { #3 }
    \str_set:Nn \l_@@_tmp_str {}
    \ior_str_map_inline:Nn \g_tmpa_ior 
      {
        \str_put_right:Nx \l_@@_tmp_str { ##1 }
      }
    \ior_close:N \g_tmpa_ior
%    \end{macrocode}  
%    \begin{macrocode}  
    \regex_extract_once:nVNTF { ;GM\[1\] } { \l_@@_tmp_str } \l_tmpa_seq
      {
        \regex_extract_once:nVNTF { SZ\[[0-9]+\] } { \l_@@_tmp_str } \l_tmpa_seq
          {
            \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { 1 } }
            \str_set:Nx \l_tmpa_str { \str_range:Nnn \l_tmpa_str { 4 } { -2 } }
            \int_set:Ne \l_tmpa_int { \l_tmpa_str }
            \newweiqi [ \l_tmpa_int ]
            \regex_extract_once:nVN { HA\[[0-9]+\] } { \l_@@_tmp_str } \l_tmpa_seq
            \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { 1 } }
            \str_set:Nx \l_tmpa_str {\str_range:Nnn \l_tmpa_str { 4 } { -2 } }
            \int_set:Ne \l_tmpa_int { \l_tmpa_str }
            \IfNoValueTF { #2 } 
              { \int_add:Nn \l_tmpa_int { 1 } }
              { \int_add:Nn \l_tmpa_int { #2 } }
            \@@_add_sgf_stones:VV { \l_@@_tmp_str } { \l_tmpa_int }  
          }
          { è§£æžæ£‹ç›˜å¤§å°å¤±è´¥ }
      }
      { ä¸æ”¯æŒçš„æ£‹è°± }  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\resetnumber}
% é‡æ–°ä¿®æ”¹æ£‹å­æ‰‹æ•°ã€‚æ˜Ÿå·ç‰ˆæœ¬å‘½ä»¤æ—&nbsp;åŒºåˆ«ã€‚
%    \begin{macrocode}
\NewDocumentCommand \resetnumber { s o }
  { 
    \IfNoValueTF { #2 }
      { \@@_reset_stone_number:n { 1 } }
      { \@@_reset_stone_number:n { #2 } }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqilabel, \clearlabel}
% æ·»åŠ&nbsp;/åˆ&nbsp;é™¤æ&nbsp;‡ç­¾ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqilabel { s o m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_labels: } 
    \IfNoValueTF { #2 }
      { \@@_add_stones:nnn { 3 } { #3 } { a } }
      { \@@_add_stones:nnn { 3 } { #3 } { #2 } }
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \clearlabel { }
  { \@@_clear_labels: }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqired, \weiqigreen, \weiqiblue, \clearpoint}
% æ·»åŠ&nbsp;çº¢ç»¿è“ç‚¹ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqired { s m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_points: } 
    \@@_add_points:nn { red } { #2 } 
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \weiqigreen { s m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_points: } 
    \@@_add_points:nn { green } { #2 } 
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \weiqiblue { s m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_points: } 
    \@@_add_points:nn { blue } { #2 } 
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \clearpoint { }
  { \@@_clear_points: }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqidie}
% æ&nbsp;‡è®°æ­»å­ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqidie { s m }
  {
    \@@_modify_stones:nN { #2 } \@@_die_stone:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiremove}
% ç§»é™¤æ£‹å­ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiremove { s m }
  {
    \@@_modify_stones:nN { #2 } \@@_remove_stone:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqichange}
% åˆ‡æ¢æ£‹å­é»‘ç™½æ–¹ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqichange { s m }
  {
    \@@_modify_stones:nN { #2 } \@@_change_stone:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\showweiqi}
% æ˜¾ç¤ºæ£‹ç›˜ã€‚
%    \begin{macrocode}
\NewDocumentCommand \showweiqi { s o }
  {
    \IfNoValueTF { #2 }
      { \@@_calc_range: }
      { \@@_set_range:n { #2 } }
    \@@_show:
    \IfBooleanF { #1 } { \newweiqi }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\nonelocmode, \normallocmode, \sgflocmode}
% è®¾ç½®å›´æ£‹åæ&nbsp;‡æ˜¾ç¤ºæ¨¡å¼ã€‚
%    \begin{macrocode}
\NewDocumentCommand \nonelocmode { s }
  {
    \bool_set_false:N \l_@@_show_loc_bool
    \IfBooleanT { #1 } { \bool_gset_false:N \g_@@_show_loc_bool }
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \normallocmode { s }
  {
    \bool_set_true:N \l_@@_show_loc_bool
    \str_set_eq:NN \l_@@_loc_mode_str \c_@@_normal_mode_str   
    \IfBooleanT { #1 } 
      {
        \bool_gset_true:N \g_@@_show_loc_bool
        \str_gset_eq:NN \g_@@_loc_mode_str \c_@@_normal_mode_str
      }  
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \sgflocmode { s } 
  { 
    \bool_set_true:N \l_@@_show_loc_bool
    \str_set_eq:NN \l_@@_loc_mode_str \c_@@_sgf_mode_str
    \IfBooleanT { #1 } 
      {
        \bool_gset_true:N \g_@@_show_loc_bool
        \str_gset_eq:NN \g_@@_loc_mode_str \c_@@_sgf_mode_str
      }  
  }
%    \end{macrocode}
% \end{macro}
%

%
% \begin{macro}{\weiqirotate, \weiqimirror, \weiqiposition}
% æ—‹è½¬æ£‹ç›˜ã€é•œåƒæ£‹ç›˜æˆ–æŒ‡å®šæ£‹ç›˜æ–¹ä½ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqirotate { s o }
  {    
    \IfNoValueTF { #2 }
      { \int_set:Nn \l_tmpa_int { 90 } }
      { \int_set:Ne \l_tmpa_int { #2 } }
    \int_compare:nNnT { \l_tmpa_int } &lt; { 0 }
      { \int_add:Nn \l_tmpa_int { 360 } }
    \int_case:nn { \l_tmpa_int }
      {
        { 90 }  
        { 
          \bool_set_inverse:N \l_@@_swap_xy_bool
          \int_set:Ne \l_tmpb_int { \l_@@_x_direction_int }
          \int_set:Ne \l_@@_x_direction_int { \l_@@_y_direction_int }
          \int_set:Ne \l_@@_y_direction_int { 0 - \l_tmpb_int }
        }  
        { 180 } 
        {
          \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_x_direction_int }
          \int_set:Ne \l_@@_y_direction_int { 0 - \l_@@_y_direction_int }
        }
        { 270 } 
        { 
          \bool_set_inverse:N \l_@@_swap_xy_bool
          \int_set:Ne \l_tmpb_int { \l_@@_x_direction_int }
          \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_y_direction_int }
          \int_set:Ne \l_@@_y_direction_int { \l_tmpb_int }
        } 
      }
    \IfBooleanT{ #1 }
      { 
        \bool_gset_eq:NN \g_@@_swap_xy_bool \l_@@_swap_xy_bool
        \int_gset_eq:NN \g_@@_x_direction_int \l_@@_x_direction_int
        \int_gset_eq:NN \g_@@_y_direction_int \l_@@_y_direction_int
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\NewDocumentCommand \weiqimirror { s o }
  {    
    \IfNoValueTF { #2 }
      { \str_set:Nn \l_tmpa_str { xy } }
      { \str_set:Nx \l_tmpa_str { #2 } }
    \str_case_e:nn { \l_tmpa_str }
    {
      { x }
      {
        \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_x_direction_int }
      }
      { y }
      {
        \int_set:Ne \l_@@_y_direction_int { 0 - \l_@@_y_direction_int }
      }
      { xy }
      {
        \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_x_direction_int }
        \int_set:Ne \l_@@_y_direction_int { 0 - \l_@@_y_direction_int }
      }
    
    }
    \IfBooleanT{ #1 }
      { 
        \bool_set_eq:NN \g_@@_swap_xy_bool \l_@@_swap_xy_bool
        \int_set_eq:NN \g_@@_x_direction_int \l_@@_x_direction_int
        \int_set_eq:NN \g_@@_y_direction_int \l_@@_y_direction_int
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\NewDocumentCommand \weiqiposition { s o }
  {    
    \IfNoValueTF { #2 }
      { \int_set:Nn \l_tmpa_int { 0 } }
      { \int_set:Ne \l_tmpa_int { #2 } }
    \int_compare:nNnT { \l_tmpa_int } &lt; { 0 }
      { \int_add:Nn \l_tmpa_int { 360 } }
    \int_case:nn { \l_tmpa_int }
      {
        { 0 }
        {
          \bool_set_false:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { 1 }
          \int_set:Nn \l_@@_y_direction_int { 1 }
        }
        { 90 }  
        { 
          \bool_set_true:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { 1 }
          \int_set:Nn \l_@@_y_direction_int { -1 }
        }  
        { 180 } 
        {
          \bool_set_false:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { -1 }
          \int_set:Nn \l_@@_y_direction_int { -1 }
        }
        { 270 } 
        { 
          \bool_set_true:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { -1 }
          \int_set:Nn \l_@@_y_direction_int { 1 }
        } 
      }
    \IfBooleanT{ #1 }
      { 
        \bool_gset_eq:NN \g_@@_swap_xy_bool \l_@@_swap_xy_bool
        \int_gset_eq:NN \g_@@_x_direction_int \l_@@_x_direction_int
        \int_gset_eq:NN \g_@@_y_direction_int \l_@@_y_direction_int
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiscale}
% ç¼©æ”¾æ£‹ç›˜ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiscale { s o }
  {
    \IfNoValueTF { #2 }
      { \fp_set:Nn \l_@@_scale_fp { 1.0 } }
      { \fp_set:Nn \l_@@_scale_fp { #2 * \l_@@_scale_fp } }
    \IfBooleanT{ #1 }
      { \fp_set_eq:NN \g_@@_scale_fp \l_@@_scale_fp }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiminsize}
% æœ€å°æ˜¾ç¤ºå°ºå¯¸ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiminsize { s m m }
  {
    \int_set:Nn \l_@@_min_width_int { #2 }
    \int_set:Nn \l_@@_min_hight_int { #3 }
    \IfBooleanT{ #1 }
      {
        \int_gset:Nn \g_@@_min_width_int { #2 }
        \int_gset:Nn \g_@@_min_hight_int { #3 }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\saveweiqi}
% ä¿å­˜å¯¹å±€ã€‚
%    \begin{macrocode}
\NewDocumentCommand \saveweiqi { s o }
  {
    \IfNoValueTF { #2 }
      { \str_set:Nx \l_tmpa_str { Default } }
      { \str_set:Nx \l_tmpa_str { \int_to_alph:n { #2 } } }
    \cs_if_free:cT { g_@@_size_int_\l_tmpa_str }
      {
        \int_new:c { g_@@_size_int_\l_tmpa_str }
        \int_new:c { g_@@_step_count_int_\l_tmpa_str }
        \intarray_new:cn { g_@@_x_intarray_\l_tmpa_str } 
          { \c_@@_max_step_int }
        \intarray_new:cn { g_@@_y_intarray_\l_tmpa_str } 
          { \c_@@_max_step_int }
        \intarray_new:cn { g_@@_player_intarray_\l_tmpa_str }
          { \c_@@_max_step_int }
        \seq_new:c { g_@@_label_seq_\l_tmpa_str }
        \seq_new:c { g_@@_die_seq_\l_tmpa_str }
      }    
    \int_gset_eq:cN { g_@@_size_int_\l_tmpa_str } \g_@@_size_int
    \int_gset_eq:cN 
      { g_@@_step_count_int_\l_tmpa_str } \g_@@_step_count_int 
    \int_step_inline:nn { \c_@@_max_step_int }
      { 
        \intarray_gset:cnn { g_@@_x_intarray_\l_tmpa_str } { ##1 }
          { \intarray_item:Nn \g_@@_x_intarray  { ##1 } }
        \intarray_gset:cnn { g_@@_y_intarray_\l_tmpa_str } { ##1 }
          { \intarray_item:Nn \g_@@_y_intarray  { ##1 } }
        \intarray_gset:cnn { g_@@_player_intarray_\l_tmpa_str } { ##1 }
          { \intarray_item:Nn \g_@@_player_intarray  { ##1 } }
      }
    \clist_gset_eq:cN { g_@@_label_seq_\l_tmpa_str } \g_@@_label_seq  
    \clist_gset_eq:cN { g_@@_die_seq_\l_tmpa_str } \g_@@_die_seq  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\useweiqi}
% ä½¿ç”¨å¯¹å±€ã€‚
%    \begin{macrocode}
\NewDocumentCommand \useweiqi { s o }
  {
    \IfNoValueTF { #2 }
      { \str_set:Nx \l_tmpa_str { Default } }
      { \str_set:Nx \l_tmpa_str { \int_to_alph:n { #2 } } }
    \cs_if_free:cTF { g_@@_size_int_\l_tmpa_str }
      { \@@_new_game:n { \g_@@_default_size_int } }  
      {
        \int_set_eq:Nc \l_tmpa_int { g_@@_size_int_\l_tmpa_str }
        \@@_new_game:n { \l_tmpa_int }
        \int_gset_eq:Nc \g_@@_step_count_int 
          { g_@@_step_count_int_\l_tmpa_str }
        \int_step_inline:nn { \c_@@_max_step_int }
          { 
            \intarray_gset:Nnn \g_@@_x_intarray { ##1 }
              { \intarray_item:cn { g_@@_x_intarray_\l_tmpa_str }  { ##1 } }
            \intarray_gset:Nnn \g_@@_y_intarray { ##1 }
              { \intarray_item:cn { g_@@_y_intarray_\l_tmpa_str }  { ##1 } }
            \intarray_gset:Nnn \g_@@_player_intarray { ##1 }
              { 
                \intarray_item:cn 
                  { g_@@_player_intarray_\l_tmpa_str }  { ##1 } 
              }
          }
        \clist_set_eq:Nc \g_@@_label_seq { g_@@_label_seq_\l_tmpa_str }
        \clist_set_eq:Nc \g_@@_die_seq { g_@@_die_seq_\l_tmpa_str }
      }
    \IfBooleanT{ #1 }
      {
        \@@_clear_labels:
        \int_step_inline:nn { \g_@@_step_count_int } 
          {
            \seq_gset_item:Nnn \g_@@_label_seq { ##1 } {}
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqidata}
% æŸ¥è¯¢å†…éƒ¨æ•°æ®ã€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqidata { s }
  {
    \noindent æ£‹ç›˜å¤§å°ï¼š\int_use:N \g_@@_size_int~
    ï¼ˆé»˜è®¤ï¼š\int_use:N \g_@@_default_size_intï¼‰\\
    å½“å‰å¯¹å±€æ­¥æ•°ï¼š\int_use:N \g_@@_step_count_int~ï¼ˆå«çº¯æ&nbsp;‡ç­¾åŠç§»é™¤æ£‹å­ï¼‰\\
    \int_compare:nNnT { \g_@@_step_count_int } &gt; { 0 }
      { åºå·ï¼š($x$,~$y$)ï¼Œæ‰€å±žæ–¹ï¼Œæ&nbsp;‡ç­¾ï¼Œå¤‡æ³¨\\ }
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_set:Ne \l_@@_player_int
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } }
        \str_set:Nx \l_@@_tmp_str 
          { \seq_item:Nn \g_@@_label_seq { ##1 } }          
        ##1ï¼š
        (\int_use:N \l_@@_x_int,~\int_use:N \l_@@_y_int)ï¼Œ
        \int_case:nn { \l_@@_player_int }
          {
            { 1 } { B }
            { 2 } { W }
            { 3 } { L }
            { 0 } { - }
          }ï¼Œ
        \str_if_empty:NTF \l_@@_tmp_str  
          { \meta{ç©º} }  
          { \l_@@_tmp_str }ï¼Œ
        \int_compare:nNnTF 
          { \l_@@_player_int } = { 0 }
          { \meta{æ—&nbsp;æ•ˆ} }
          {
            \seq_if_in:NnT \g_@@_die_seq { ##1 } 
              {  \meta{æ­»å­} }
              { 
                \int_compare:nNnT
                  { \l_@@_x_int } = { 0 }
                  {  \meta{è™šç€} }
              }
          }\\
      } 
    çº¢è‰²æŒ‡ç¤ºç‚¹ï¼š
      \clist_if_empty:NTF \g_@@_red_point_clist
        { \meta{ç©º} }
        { \clist_use:Nn \g_@@_red_point_clist {,~} }\\
    ç»¿è‰²æŒ‡ç¤ºç‚¹ï¼š
      \clist_if_empty:NTF \g_@@_green_point_clist
        { \meta{ç©º} }
        { \clist_use:Nn \g_@@_green_point_clist {,~} }\\
    è“è‰²æŒ‡ç¤ºç‚¹ï¼š
      \clist_if_empty:NTF \g_@@_blue_point_clist
        { \meta{ç©º} }
        { \clist_use:Nn \g_@@_blue_point_clist {,~} }\\
    æ–¹ä½ä¿¡æ¯ï¼š
      \int_use:N \l_@@_x_direction_int,~
      \int_use:N \l_@@_x_direction_int,~ 
      \bool_to_str:N \l_@@_swap_xy_boolï¼›~
    ï¼ˆå…¨å±€ï¼š
      \int_use:N \g_@@_x_direction_int,~ 
      \int_use:N \g_@@_x_direction_int,~ 
      \bool_to_str:N \g_@@_swap_xy_bool
    ï¼‰\\
    ç¼©æ”¾æ¯”ä¾‹ï¼š\fp_use:N \l_@@_scale_fp~
    ï¼ˆå…¨å±€ï¼š\fp_use:N \g_@@_scale_fpï¼‰\\
    åæ&nbsp;‡åˆ»åº¦ï¼š\l_@@_loc_mode_str,~\bool_to_str:N \l_@@_show_loc_bool
    ï¼ˆå…¨å±€ï¼š\g_@@_loc_mode_str,~\bool_to_str:N \g_@@_show_loc_boolï¼‰\\
    æœ€å°æ˜¾ç¤ºå°ºå¯¸ï¼š
      \int_use:N \l_@@_min_width_int,~
      \int_use:N \l_@@_min_hight_int~
    ï¼ˆå…¨å±€ï¼š
      \int_use:N \g_@@_min_width_int,~
      \int_use:N \g_@@_min_hight_int
    ï¼‰\\
    \IfBooleanT{ #1 }
      {
        æ£‹å­åŒºé—´ï¼š
        (\int_use:N \l_@@_x_min_int,~\int_use:N \l_@@_y_max_int)ï¼Œ
        (\int_use:N \l_@@_x_max_int,~\int_use:N \l_@@_y_min_int)\\
        æ£‹ç›˜è¾¹ç•Œï¼š
        (\fp_use:N \l_@@_x_min_fp,~\fp_use:N \l_@@_x_max_fp)ï¼Œ
        (\fp_use:N \l_@@_y_min_fp,~\fp_use:N \l_@@_y_max_fp)\\
        æ˜¯å¦è¾¹è·¯ï¼š
        \bool_to_str:N \l_@@_up_boolï¼Œ
        \bool_to_str:N \l_@@_down_boolï¼Œ
        \bool_to_str:N \l_@@_left_boolï¼Œ
        \bool_to_str:N \l_@@_right_boolï¼ˆä¸Šä¸‹å·¦å³ï¼‰\\
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{æ‰«å°¾}
%
% åˆå§‹æ–°å¯¹å±€
%    \begin{macrocode}
\newweiqi
%    \end{macrocode}
%
% å…³é—­ expl3 æ¨¡å¼
%    \begin{macrocode}
\ExplSyntaxOff
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/package&gt;
%    \end{macrocode}
%
% \end{implementation}
%
% \PrintIndex
</pre></body></html>