비머: 삼목

비머: 삼목

LaTeX에서 삼목 게임을 구축하는 더 좋은 방법이 있습니까? 현재 다음 코드가 있습니다.

\documentclass{beamer}
\mode<presentation>

\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amsthm}
\usepackage{array}
\usepackage{graphicx}

\begin{document}
\begin{frame}
    \frametitle{A game of noughts and crosses}

    Here is a game of noughts and crosses. On the left we have the game, and on the right the commentary.\\

    \begin{columns}

        \begin{column}{0.1\textwidth}

            \vspace{1.75cm}

            \begin{tabular}{c|c|c}
                & & \\      \hline
                & & \\      \hline
                & &
            \end{tabular}
        \end{column} \pause

        \begin{column}{0.70\textwidth}

            \begin{itemize}
                \item crosses goes first, makes optimal move. A good player will never lose from this start.
            \end{itemize}

        \end{column}

    \end{columns}

\end{frame}
\end{document}

이렇게 하면 슬라이드가 한쪽에는 게임이 있고 다른 한쪽에는 해설이 있는 두 부분으로 나뉩니다. 나는 그리드에 Os와 X를 추가하고 슬라이드별로 슬라이드하면서 동시에 설명을 추가하여 게임을 플레이할 수 있기를 원합니다. 분명히 첫 번째 조치는 다음과 같습니다.

\begin{tabular}{c|c|c}
                & & \\      \hline
                & X & \\      \hline
                & &
\end{tabular}

이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 슬라이드별로 게임을 채우려면 어떻게 해야 합니까(예: X가 슬라이드 1에서 재생되고, O가 슬라이드 2에서 재생되고, 해설을 추가하고, X가 슬라이드 3에서 재생되는 등).

답변1

반복되는 코드가 많을 경우(이 경우에는 다른 게임에 대해) 라텍스 파일을 단순화하고 필요한 경우 나중에 쉽게 변경할 수 있도록 매크로를 작성합니다.

(나)가장 먼저 떠오른 생각은 "입력"으로 사용되는 매크로를 작성하는 것이었습니다.

  • X 위치를 쉼표로 구분한 목록
  • O의 위치를 ​​쉼표로 구분한 목록
  • 논평

그리드에서 왼쪽에서 오른쪽으로, 위에서 아래로 읽는 1,2,...,9로 인코딩할 X 및 O 위치입니다. 예를 \NoughtsCrosses{5,6}{9}{Third move}들어 ,

여기에 이미지 설명을 입력하세요

(II)이를 수행하는 두 번째 방법은 동작이 X,O,X,...로 번갈아 나타난다고 가정하고 설명과 함께 쉼표로 구분된 동작 목록을 제공하는 것입니다. 예를 \NoughtsCrossesII{5,9,6,4}{Fourth move}들어 ,

여기에 이미지 설명을 입력하세요

\only<5>{\NoughtsCrossesII{5,9,6,4}{Fourth move}}cfr이 질문에 대한 설명에서 말했듯 이 한 번에 하나의 동작을 표시하기 위해 이러한 명령을 다음과 같은 내부에 묶고 싶을 것입니다 . 아래 MWE에서 이 작업을 수행합니다.

(III)마지막 발언을 고려하고 약간의 OTT를 사용하면 더 똑똑한 매크로는 단순히 동작과 해설 목록을 가져온 다음 프레임에서 게임에 대한 모든 슬라이드를 구성합니다. 지금까지 모든 매크로는 tikz를 사용했으며 tikz \foreach명령은 슬래시로 구분된 여러 루핑 변수를 허용하므로 이를 구현하는 가장 쉬운 방법은 다음 구문을 사용하는 것입니다.

  \NoughtsCrossesGame{%
     5/First move,
     9/Second move,
     6/Third move,
     4/Fouth move
  }

출력은 "게임"이 4개 슬라이드에 걸쳐 나타나는 점을 제외하면 위와 "동일"합니다. 매크로는 명령 \NoughtsCrossesGame에 대한 선택적 인수와 유사하게 동작하는 선택적 인수를 사용합니다 \pause. 즉, 게임의 움직임이 주어진 프레임의 슬라이드에 나타나기 시작할 때를 제어하는 ​​"오프셋" 역할을 합니다.

다음은 위의 세 가지 매크로에 대한 정의를 제공하는 코드이며, 사용 방법을 보여주기 위해 MWE로 완성되었습니다.

\documentclass{beamer}
\usepackage{tikz}

% Helper macro for placing a node at "position" 1,2,...,9 into the grid
% \PlaceMarker[optional node styling]<position><X or O>
\usepackage{xparse}
\NewDocumentCommand\PlaceMarker{ O{}mm }{%
   \ifnum#2>0
       \def\markercol{#1}
       \def\PlaceMakerNumber{#2}
    \else
       \def\markercol{red}
       \def\PlaceMakerNumber{\numexpr-#2}
    \fi
   \ifcase\PlaceMakerNumber%
      \or\node[\markercol] at (1,3) {#3}; % 1 = (3,1)
      \or\node[\markercol] at (2,3) {#3}; % 2 = (3,2)
      \or\node[\markercol] at (3,3) {#3}; % 3 = (3,3)
      \or\node[\markercol] at (1,2) {#3}; % 4 = (2,1)
      \or\node[\markercol] at (2,2) {#3}; % 5 = (2,2)
      \or\node[\markercol] at (3,2) {#3}; % 6 = (2,3)
      \or\node[\markercol] at (1,1) {#3}; % 7 = (1,1)
      \or\node[\markercol] at (2,1) {#3}; % 8 = (1,2)
      \or\node[\markercol] at (3,1) {#3}; % 9 = (1,3)
   \fi
}

% Creates a noughts and cross game with commentary
%\NoughtsCrosses{x-positions}{y-positions}{Commentary}
\newcommand\NoughtsCrosses[3]{%
  \begin{tikzpicture}
     \foreach \x in {1.5,2.5} {
         \draw[ultra thick](\x,0.5)--+(0,3);
         \draw[ultra thick](0.5,\x)--+(3,0);
     }
     \foreach \x in {#1} {\PlaceMarker{\x}{X}}
     \foreach \y in {#2} {\PlaceMarker{\y}{O}}
     \node[text width=40mm,text ragged, anchor=west] at (5,3) {#3};
  \end{tikzpicture}
}

% Creates a noughts and cross game with commentary
%\NoughtsCrossesII{move positions}{Commentary}
% Moves alternate as X,O,...
\newcommand\NoughtsCrossesII[2]{%
  \begin{tikzpicture}
     \foreach \x in {1.5,2.5} {
         \draw[ultra thick](\x,0.5)--+(0,3);
         \draw[ultra thick](0.5,\x)--+(3,0);
     }
     \foreach \move [count=\m] in {#1} {
         \ifodd\m \PlaceMarker{\move}{X}
         \else\PlaceMarker{\move}{O}
         \fi
     }
     \node[text width=40mm,text ragged, anchor=west] at (5,3) {#2};% add comment
  \end{tikzpicture}
}

% Creates a noughts and cross game with commentary
%\NoughtsCrossesII{move positions}{Commentary}
% Moves alternate as X,O,...
\makeatletter
\newcommand\NoughtsCrossesGame[2][0]{%
  \begin{tikzpicture}
     \foreach \x in {1.5,2.5} {
         \draw[ultra thick](\x,0.5)--+(0,3);
         \draw[ultra thick](0.5,\x)--+(3,0);
     }
     % count length of game
     \foreach \move/\com [count=\lmove] in {#2} {}
     \def\endgame{\the\numexpr\lmove+#1\relax}
     \def\Endgame{\the\numexpr\endgame+1\relax}
     \foreach \move/\com [count=\m,
                          evaluate=\m as \mm using int(\m+#1),
                          evaluate=\move as \mov using int(abs(-\move))] in {#2} {
         \ifodd\m\def\Marker{X}
         \else\def\Marker{O}
         \fi
         \def\mmm{\the\numexpr\mm+1\relax}
         \only<\mm>{\PlaceMarker[blue]{\mov}{\Marker}}
         \ifnum\move<0
            \only<\mmm-\endgame>{\PlaceMarker{\mov}{\Marker}}
            \only<\Endgame->{\PlaceMarker[blue]{\mov}{\Marker}}
         \else
            \only<\mmm->{\PlaceMarker{\mov}{\Marker}}
         \fi
         \only<\mm>{
           \node[text width=40mm,text ragged, anchor=west] at (5,3){\com};
         }
     }
  \end{tikzpicture}
}
\makeatother

\begin{document}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{A game of noughts and crosses}
  Here is a game of noughts and crosses. On the left we have the
  game, and on the right the commentary.

  \medskip

  \only<2>{\NoughtsCrosses{5}{}{First move}}
  \only<3>{\NoughtsCrosses{5}{9}{Second move}}
  \only<4>{\NoughtsCrosses{5,6}{9}{Third move}}
  \only<5>{\NoughtsCrossesII{5,9,6,4}{Fourth move}}

\end{frame}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{frame}{Another game of noughts and crosses}
  Here is a game of noughts and crosses. On the left we have the
  game, and on the right the commentary.

  \pause Here is a clever game
  \medskip

  \NoughtsCrossesGame[1]{% offset start of game because of \pause above
    -5/First move,
     6/Middle square,
     7/Forcing,
     3/Forced block,
    -9/Forced block leading to a pincer!,
     8/Forced defence!,
    -1/Wins!
  }

\end{frame}

\end{document}

몇 가지 의견:

  • 모든 매크로가 사용됩니다.틱즈게임을 그리려면 X/O 마커 배치와 그리드 그리기를 더 잘 제어할 수 있습니다.
  • 매크로 \PlaceMarker는 지정된 위치에 마커를 배치하기 위한 "도우미 기능"입니다. \ifcase위치 인덱스를 좌표 1,2,...,9로 변환하는 데 사용됩니다 (x,y).
  • 매크로는 \foreach쉼표로 구분된 마커 위치 목록을 반복하는 데 사용됩니다. 두 번째 매크로는 또한 \ifoddX 또는 O를 배치할지 여부를 결정하는 데 사용됩니다.
  • "설명"은 폭 40mm의 비정형 왼쪽 텍스트로 tikz 노드 내부에 배치됩니다. (x,y) 좌표의 배치와 텍스트 너비를 미세 조정해야 할 수도 있습니다.
  • 의견에서 요청한 대로 일부 동작을 쉽게 강조 표시할 수 있도록 매크로를 개선했습니다. 이제 "음수 위치" 색인을 지정하면 해당 X또는 에 색상이 지정 O됩니다. 예를 들어 \NoughtsCrosses{-5,-6}{9}{Third move}두 개의 s를 빨간색으로 만듭니다 X.
  • 더 재미있게도 \NoughtsCrossesGame매크로는 이제 각 움직임에 색상을 지정하고 게임이 끝날 때 최종 "승리" 연속을 파란색으로 표시합니다. 연승은 음수 위치 지수를 사용하여 다시 강조 표시해야 합니다. 두 경우 모두 의 \PlaceMarker자동 색상 지정이 \NoughtsCrosses더 복잡하기 는 하지만 색상 지정은 의 향상된 기능을 통해 수행됩니다 .

완성도를 높이기 위해 예제에서 생성된 마지막 슬라이드의 애니메이션 버전은 다음과 같습니다 \NoughtsCrossesGame.

여기에 이미지 설명을 입력하세요

비머가 만든 프레임을 제외하고 이 슬라이드 모음은 본질적으로 명령의 출력입니다.

\NoughtsCrossesGame[1]{% offset start of game because of \pause above
  -5/First move,
   6/Middle square,
   7/Forcing,
   3/Forced block,
  -9/Forced block leading to a pincer!,
   8/Forced defence!,
  -1/Wins!
}

관련 정보