aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInigoGutierrez <inigogf.95@gmail.com>2023-06-09 13:12:05 +0200
committerInigoGutierrez <inigogf.95@gmail.com>2023-06-09 13:12:05 +0200
commita005228a986b17732ae7cccbedde450533cfe1f1 (patch)
tree20dd63b13dd65c1d9fb5082f3a15ce5e5424317f
parent12431ce4c4ed52fcfc2180bcffdfec33e72b73ba (diff)
downloadimago-a005228a986b17732ae7cccbedde450533cfe1f1.tar.gz
imago-a005228a986b17732ae7cccbedde450533cfe1f1.zip
First usability test.
-rw-r--r--doc/listings/goInterface/02-firstMove.txt1
-rw-r--r--doc/listings/goInterface/03-fullGame.txt1
-rw-r--r--doc/listings/goInterface/04-ko.txt5
-rw-r--r--doc/tex/appendixes.tex127
-rw-r--r--doc/tex/implementation.tex71
-rw-r--r--doc/tex/systemDesign.tex13
-rwxr-xr-xgo.py12
-rw-r--r--imago/engine/keras/keras.py2
-rw-r--r--imago/gameLogic/gameState.py2
9 files changed, 172 insertions, 62 deletions
diff --git a/doc/listings/goInterface/02-firstMove.txt b/doc/listings/goInterface/02-firstMove.txt
index 2fc37a6..3fb46d6 100644
--- a/doc/listings/goInterface/02-firstMove.txt
+++ b/doc/listings/goInterface/02-firstMove.txt
@@ -9,6 +9,7 @@
2 · · · · · · · · ·
1 · · · · · · · · ·
Move (B): e6
+
A B C D E F G H J
9 · · · · · · · · ·
8 · · · · · · · · ·
diff --git a/doc/listings/goInterface/03-fullGame.txt b/doc/listings/goInterface/03-fullGame.txt
index a975329..4e01b75 100644
--- a/doc/listings/goInterface/03-fullGame.txt
+++ b/doc/listings/goInterface/03-fullGame.txt
@@ -93,5 +93,4 @@ Move (B): pass
2 · · · · · · · · ·
1 · · · · · · · · ·
Move (W): pass
-
Both players passed: end of the game.
diff --git a/doc/listings/goInterface/04-ko.txt b/doc/listings/goInterface/04-ko.txt
index b2edf55..f1ef2dd 100644
--- a/doc/listings/goInterface/04-ko.txt
+++ b/doc/listings/goInterface/04-ko.txt
@@ -21,8 +21,8 @@ Move (W): b9
2 · · · · · · · · ·
1 · · · · · · · · W
Move (B): a9
-
Invalid Move. Illegal by ko rule.
+
A B C D E F G H J
9 · W B · · · · · ·
8 W B · · · · · · ·
@@ -35,6 +35,7 @@ Invalid Move. Illegal by ko rule.
1 · · · · · · · · W
Move (B): z9
Invalid move syntax. Example of move: A1
+
A B C D E F G H J
9 · W B · · · · · ·
8 W B · · · · · · ·
@@ -47,6 +48,7 @@ Invalid move syntax. Example of move: A1
1 · · · · · · · · W
Move (B): a0
Invalid move syntax. Example of move: A1
+
A B C D E F G H J
9 · W B · · · · · ·
8 W B · · · · · · ·
@@ -59,6 +61,7 @@ Invalid move syntax. Example of move: A1
1 · · · · · · · · W
Move (B): a10
Invalid move syntax. Example of move: A1
+
A B C D E F G H J
9 · W B · · · · · ·
8 W B · · · · · · ·
diff --git a/doc/tex/appendixes.tex b/doc/tex/appendixes.tex
index ec6c2aa..f9f189e 100644
--- a/doc/tex/appendixes.tex
+++ b/doc/tex/appendixes.tex
@@ -34,7 +34,7 @@ When executed the user is presented with the following interface:
\par
}
-The state of the board (empty for now) is shown and the user is prompt for a
+The state of the board (empty for now) is shown and the user is prompted for a
move. The color to make the move is marked between brackets: \texttt{B} for
Black, \texttt{W} for White.
@@ -87,11 +87,38 @@ specification. It can be executed in a shell as:
\par
}
+The \acrshort{ai} to be run can be passes as an argument to the \texttt{-e}
+option. The available arguments are:
+
+\begin{itemize}
+
+ \item \texttt{montecarlo}: The Monte Carlo Tree Search algorithm is used.
+ \item \texttt{keras}: The default Keras neural network, the convolutional
+ one, is used.
+ \item \texttt{dense}: The dense neural network is used.
+ \item \texttt{conv}: The convolutional neural network is used.
+
+\end{itemize}
+
+So, if for example the dense neural network is the one to use, the program would
+be executed as:
+
+{
+ \centering
+ \begin{minipage}{0.4\textwidth}
+ \texttt{python imagocli.py -e dense}
+ \end{minipage}
+ \par
+}
+
+If no arguments are provided, the default configuration is to use the Monte
+Carlo Tree Search algorithm.
+
When executed interactively and before any input is provided it just waits for
input, with no prompt whatsoever. This is in compliance with the \acrshort{gtp}
specification.
-There are the commands that the program knows and a short description of what
+These are the commands that the program knows and a short description of what
each does:
\begin{itemize}
@@ -155,18 +182,26 @@ is closed with \texttt{quit}.
\subsubsection{Example of \acrshort{gui} use: configuring Sabaki}
Since the main aim of implementing a \acrshort{gtp} interface is having it be
-compatible with existing tools, an explanation of how to use in in conjunction
+compatible with existing tools, an explanation of how to use it in conjunction
with one such established tool is provided.
+\begin{figure}[p]
+ \begin{center}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/01-initialScreen.jpg}
+ \caption{Sabaki after being started.
+ }\label{fig:sabakiStart}
+ \end{center}
+\end{figure}
+
Sabaki \cite{sabaki} is a Go board software compatible with \acrshort{gtp}
engines. It can be downloaded from \texttt{https://sabaki.yichuanshen.de/}. When
started, it shows a screen such as the one in \fref{fig:sabakiStart}.
-\begin{figure}[h]
+\begin{figure}[p]
\begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/01-initialScreen.jpg}
- \caption{Sabaki after being started.
- }\label{fig:sabakiStart}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/02-examplePlaying.jpg}
+ \caption{Playing some moves on the default board.
+ }\label{fig:sabakiExampleMoves}
\end{center}
\end{figure}
@@ -176,11 +211,11 @@ board and, as would be expected, the interface swaps between players after each
move. An example of the screen after some initial moves can be seen on
\fref{fig:sabakiExampleMoves}.
-\begin{figure}[h]
+\begin{figure}[p]
\begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/02-examplePlaying.jpg}
- \caption{Playing some moves on the default board.
- }\label{fig:sabakiExampleMoves}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/03-enginesSidebar.jpg}
+ \caption{Opened the engines sidebar (on the left).
+ }\label{fig:sabakiEnginesSidebar}
\end{center}
\end{figure}
@@ -191,9 +226,9 @@ sidebar open at the left but with nothing shown on it yet.
\begin{figure}[h]
\begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/03-enginesSidebar.jpg}
- \caption{Opened the engines sidebar (on the left).
- }\label{fig:sabakiEnginesSidebar}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/04-engineManagement.jpg}
+ \caption{The engine management window.
+ }\label{fig:sabakiEngineManagement}
\end{center}
\end{figure}
@@ -202,11 +237,11 @@ triangle inside of a circle (the play button), and on ``Manage Engines...'' on
the opened floating dialog. The engine management window will open, as shown on
\fref{fig:sabakiEngineManagement}.
-\begin{figure}[h]
+\begin{figure}[p]
\begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/04-engineManagement.jpg}
- \caption{The engine management window.
- }\label{fig:sabakiEngineManagement}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/05-configuredEngine.jpg}
+ \caption{\texttt{imagocli.py} configured as engine.
+ }\label{fig:sabakiConfiguredEngine}
\end{center}
\end{figure}
@@ -215,15 +250,17 @@ yet been configured nothing will be shown there. Click ``Add'' to create the
first engine entry. Give it a name by writing on the first line of the newly
created entry, then write the path to the \texttt{imagocli.py} executable
besides the folder symbol, at the text box prompting for the path to the engine.
-Arguments and initial commands to provide to the engine can be configured here,
-but none of them will be needed for the default configuration of \program{}. An
-example of the configured engine is shown on \fref{fig:sabakiConfiguredEngine}.
+Alternatively, click on the folder symbol and a file explorer will open where it
+will be possible to graphically select the executable file. Arguments and
+initial commands to provide to the engine can be configured here, but none of
+them will be needed for the default configuration of \program{}. An example of
+the configured engine is shown on \fref{fig:sabakiConfiguredEngine}.
-\begin{figure}[h]
+\begin{figure}[p]
\begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/05-configuredEngine.jpg}
- \caption{\texttt{imagocli.py} configured as engine.
- }\label{fig:sabakiConfiguredEngine}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/06-configuringAMatch.jpg}
+ \caption{Configuring a match against the engine.
+ }\label{fig:sabakiConfiguringAMatch}
\end{center}
\end{figure}
@@ -239,23 +276,23 @@ most important settings are making the engine be one (or both) of the players
and setting the board size to 9x9, since this is where the engine plays best.
For example, to set the engine as the white player, click on the arrow next to
the white player's name and select the engine, represented by the name given to
-it before), on the floating menu. The size of the board can be set on the
-``Board Size'' setting. Other options allow to set a name for the other player,
-a name for the match, the \gls{komi} and the handicap stones, if any. When
-ready, click ``Ok'' on the bottom right of the window. An example configuration
-can be seen on \fref{fig:sabakiConfiguringAMatch}. If the engine doesn't respond
-to the moves, which should be clear since its status is shown on the engines
-sidebar, try adding it to the match by clicking on ``Attach Engine'' and then on
-its name on the new match window, instead of directly on its name. This creates
-a new entry for the engine on the engines sidebar. Multiple instances of the
-same or different engines can be running at the same time; to remove one, just
-right click on its name and click on ``Detach'' on the floating menu.
-
-\begin{figure}[h]
+it before, on the floating menu. The size of the board can be set on the ``Board
+Size'' setting. Other options allow to set a name for the other player, a name
+for the match, the \gls{komi} and the handicap stones, if any. When ready, click
+``Ok'' on the bottom right of the window. An example configuration can be seen
+on \fref{fig:sabakiConfiguringAMatch}. If the engine doesn't respond to the
+moves, which should be clear since its status is shown on the engines sidebar,
+try adding it to the match by clicking on ``Attach Engine'' and then on its name
+on the new match window, instead of directly on its name. This creates a new
+entry for the engine on the engines sidebar. Multiple instances of the same or
+different engines can be running at the same time; to remove one, just right
+click on its name and click on ``Detach'' on the floating menu.
+
+\begin{figure}[p]
\begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/06-configuringAMatch.jpg}
- \caption{Configuring a match against the engine.
- }\label{fig:sabakiConfiguringAMatch}
+ \includegraphics[width=0.8\textwidth]{img/sabakiManual/07-playingAgainstImago.png}
+ \caption{Playing some moves against \program{}.
+ }\label{fig:sabakiAgainstTheEngine}
\end{center}
\end{figure}
@@ -264,13 +301,7 @@ will respond as white. Some initial moves against it can be seen on
\fref{fig:sabakiAgainstTheEngine}. Note the interaction between Sabaki and the
\acrshort{gtp} interface on the engines sidebar.
-\begin{figure}[h]
- \begin{center}
- \includegraphics[width=0.8\textwidth]{img/sabakiManual/07-playingAgainstImago.png}
- \caption{Playing some moves against \program{}.
- }\label{fig:sabakiAgainstTheEngine}
- \end{center}
-\end{figure}
+\clearpage
\subsection{Budget}
diff --git a/doc/tex/implementation.tex b/doc/tex/implementation.tex
index 73e4cfd..4970c14 100644
--- a/doc/tex/implementation.tex
+++ b/doc/tex/implementation.tex
@@ -259,3 +259,74 @@ The script used to run the tests is shown on \lref{lst:test} and its output on
\end{tabular}
\subsubsection{Usability Testing}
+
+A human user was asked to interact with the interfaces of \program{} and
+presented with a questionary. The profile of this user is of someone who has
+played some Go matches and knows the fundamentals of the game but is a beginner,
+and who has little experience with computers outside of their usage as office
+tools and internet browsers. Here are their answers.
+
+\vspace{\interclassSpace}
+
+\begin{tabular}{p{0.4\linewidth}p{0.6\linewidth}}
+ \toprule
+ \multicolumn{2}{c}{\textbf{Playing against a human}} \\
+ \midrule
+ \textbf{Question} & \textbf{Answer} \\
+ \midrule
+ Were you able to start the interface? &
+ Yes. \\
+ \midrule
+ How hard was the interface of the game to understand? &
+ It was easy and intuitive because you just entered the command to start and
+ then you only had to tell it where you wanted to play the stones. It felt
+ easy to me.\\
+ \bottomrule
+\end{tabular}
+
+\vspace{\interclassSpace}
+
+\begin{tabular}{p{0.4\linewidth}p{0.6\linewidth}}
+ \toprule
+ \multicolumn{2}{c}{\textbf{Playing against the engine}} \\
+ \midrule
+ \textbf{Question} & \textbf{Answer} \\
+ \midrule
+ Were you able to start the interface? &
+ Yes. \\
+ \midrule
+ How hard was the interface of the game to understand? &
+ It was easy to understand because it just was enering the commands and the
+ application did what it had to do, but it was more difficult than the
+ previous one because I'm not used to do these things with commands. It is
+ less intuitive than the previous one regarding playing against the machine
+ because you don't see each move as you write it, having to ask it to show
+ them instead.\\
+ \midrule
+ How strong did you find the engine? &
+ It was not so aggresive as playing against a human who knows the game. It
+ doesn't play to harm its opponent.\\
+ \bottomrule
+\end{tabular}
+
+\vspace{\interclassSpace}
+
+\begin{tabular}{p{0.4\linewidth}p{0.6\linewidth}}
+ \toprule
+ \multicolumn{2}{c}{\textbf{Playing against the interface through a
+ third-party}} \\
+ \midrule
+ \textbf{Question} & \textbf{Answer} \\
+ \midrule
+ Were you able to start the interface? &
+ Yes. \\
+ \midrule
+ Did you find any problems when setting up the engine? &
+ No, it was well explained step by step, although the images could be better
+ lined up with the text. Anyway, the explanations were clear and easy to
+ follow.\\
+ \midrule
+ Do you think this tool has value for studying Go? &
+ Yes.\\
+ \bottomrule
+\end{tabular}
diff --git a/doc/tex/systemDesign.tex b/doc/tex/systemDesign.tex
index 3542cb5..e166955 100644
--- a/doc/tex/systemDesign.tex
+++ b/doc/tex/systemDesign.tex
@@ -265,7 +265,7 @@ respectively.
\begin{figure}[h]
\begin{center}
- \includegraphics[width=\textwidth]{diagrams/trainingModule.png}
+ \includegraphics[width=0.7\textwidth]{diagrams/trainingModule.png}
\caption{Components of the \acrshort{sgf} file parsing module.}
\label{fig:trainingModule}
Components not showing a capital C are not classes, as in they not
@@ -444,23 +444,24 @@ These are the questions provided to the testers.
\begin{itemize}
- \item Playing a game against a human:
+ \item Playing against a human:
\begin{itemize}
\item Were you able to start the interface?
- \item How hard to understand was the interface of the game?
+ \item How hard was the interface of the game to understand?
\end{itemize}
- \item Playing a game against the engine:
+ \item Playing against the engine:
\begin{itemize}
\item Were you able to start the interface?
- \item How hard to understand was the interface of the game?
+ \item How hard was the interface of the game to understand?
\item How strong did you find the engine?
\end{itemize}
- \item Playing a game against the interface through a third-party \acrshort{gui}:
+ \item Playing against the interface through a third-party \acrshort{gui}:
\begin{itemize}
\item Were you able to start the interface?
\item Did you find any problems when setting up the engine?
+ \item Do you think this tool has value for studying Go?
\end{itemize}
\end{itemize}
diff --git a/go.py b/go.py
index c6553df..7580c2b 100755
--- a/go.py
+++ b/go.py
@@ -22,10 +22,9 @@ def runGame():
move = parseVertex(move, GAMESTATE.size)
except Exception as err:
print("Invalid move syntax. Example of move: A1")
+ print()
continue
- print()
-
if move == "pass":
GAMESTATE.playPass()
@@ -34,10 +33,14 @@ def runGame():
gameEnded = True
else:
-
moveRow = move[0]
moveCol = move[1]
- GAMESTATE.playMove(moveRow, moveCol)
+ try:
+ GAMESTATE.playMove(moveRow, moveCol)
+ except Exception as err:
+ print(err)
+
+ print()
if __name__ == "__main__":
@@ -46,4 +49,5 @@ if __name__ == "__main__":
except KeyboardInterrupt as err:
print()
print("Quitting: End of the game.")
+ print()
sys.exit(0)
diff --git a/imago/engine/keras/keras.py b/imago/engine/keras/keras.py
index 871f4a0..3d60b8e 100644
--- a/imago/engine/keras/keras.py
+++ b/imago/engine/keras/keras.py
@@ -34,7 +34,7 @@ class Keras(DecisionAlgorithm):
if coords == "pass":
self.currentMove = self.currentMove.addPass()
else:
- self.currentMove = self.currentMove.addMoveByCoords(coords)
+ self.currentMove = self.currentMove.addMove(coords)
def pickMove(self):
"""Returns a move to play."""
diff --git a/imago/gameLogic/gameState.py b/imago/gameLogic/gameState.py
index 8821384..c577713 100644
--- a/imago/gameLogic/gameState.py
+++ b/imago/gameLogic/gameState.py
@@ -49,7 +49,7 @@ class GameState:
if playable:
self._addMove(player, row, col)
return True
- print("Invalid Move. %s" % message)
+ raise Exception("Invalid Move. %s" % message)
return False
def playPass(self):