Introduction
COMP3411 Artificial Intelligence
Term 1, 2024 Assignment 3 – Nine-Board Tic-Tac-Toe
Due: Friday 19 April, 10 pm Marks: 16% of final assessment
In this assignment you will be writing an agent to play the game of Nine-Board Tic- Tac-Toe. This game is played on a 3 x 3 array of 3 x 3 Tic-Tac-Toe boards. The first move is made by placing an X in a randomly chosen cell of a randomly chosen board. After that, the two players take turns placing an O or X alternately into an empty cell of the board corresponding to the cell of the previous move. (For example, if the previous move was into the upper right corner of a board, the next move must be made into the upper right board.)
The game is won by getting three-in-a row either horizontally, vertically or diagonally in one of the nine boards. If a player is unable to make their move (because the relevant board is already full) the game ends in a draw.
Getting Started
Copy the archive into your own filespace and unzip it. Then type
You should then see something like this:
src.zip
cd src
make all
./servt -x -o
...|...|... ...|...|... ...|...|... ------+-------+------ ...|...|... ...|...|... ...|..x|...
------+-------+------ ...|...|... ...|...|... ...|...|...
next move for O ?
You can now play Nine-Board Tic-Tac-Toe against yourself, by typing a number for each move. The cells in each board are numbered 1, 2, 3, 4, 5, 6, 7, 8, 9 as follows:
+-----+
|1 2 3|
|4 5 6|
|7 8 9|
+-----+
To play against a computer player, you need to open another terminal window (and cd to the src directory).
Type this into the first window:
This tells the server to use port 12345 for communication, and that the moves for X will be chosen by you, the human, typing at the keyboard. (If port 12345 is busy, choose another 5-digit number.)
You should then type this into the second window (using the same port number):
The program randt simply chooses each move randomly among the available legal moves. The Python program agent.py behaves in exactly the same way. You can play against it by typing this into the second window:
You can play against a somewhat more sophisticated player by typing this into the second window:
./servt -p 12345 -x
./randt -p 12345
python3 agent.py -p 12345
./lookt -p 12345
(If you are using a Mac, type ./lookt.mac instead of ./lookt )
Writing a Player
Your task is to write a program to play the game of nine-board tic-tac-toe as well as you can. Your program will receive commands from the server (init, start(), second_move(), third_move(), last_move(), win(), loss(), draw(), end()) and must send back a single digit specifying the chosen move.
(the parameters for these commands are explained in the comments of agent.py) Communication between the server and the player(s) is illustrated in this brief
example:
Language Options
← ←
← →
← →
← ←
→
→ → ←
→ ←
→ → →
You are free to write your player in any language you wish.
1. If you write in Python, you should submit your .py files (including your program will be invoked by:
agent.py);
python3 agent.py -p (port)
-
If you write in Java, you should submit your .java files (no .class files). The main file must be called your program will be invoked by:
-
If you write in C or C++, You should submit your source files (no object files) as well as a Makefile which, when invoked with the command "make", will produce an executable called your program will be invoked by:
If you wish to write in some other language, let us know.
Starter Code
Two types of starter code are provided. The src directory contains a minimally functioning agent in each language which connects to the socket and plays random moves (agent.py, Agent.java, agent.c). The directory code/ttt contains a standalone program in each language which plays normal (single board) tic-tac-toe and chooses its moves via alpha-beta search (ttt.py, ttt.java, ttt.c).
Note: You are free to use some method other than alpha-beta search if you wish. The starter code is simply meant to provide you with one viable option.
Testing Your Code
To play two computer programs against each other, you may need to open three windows. For example, to play agent against lookt using port 54321, type as follows:
(Whichever program connects first will play X; the other program will play O.)
You can alternatively use the shell script playt.sh, and provide the executables and
port number as command-line arguments. Here are some examples:
Agent.java;
java Agent -p (port)
agent;
./agent -p (port)
window 1: ./servt -p 54321 window 2: ./agent -p 54321 window 3: ./lookt -p 54321
./playt.sh ./agent ./lookt 12345 ./playt.sh "java Agent" ./lookt 12346
./playt.sh "python3 agent.py" ./lookt 12347
The strength of lookt can be adjusted by specifying a maximum search depth (default value is 9; reasonable range is 1 to 18), e.g.
Question
At the top of your code, in a block of comments, you must provide a brief answer (one or two paragraphs) to this Question:
Groups
This assignment may be done individually, or in groups of two students. Groups are determined by an SMS field called pair3 . Every student has initially been assigned a unique pair3 which is "h" followed by their student ID number, e.g. h1234567 .
-
If you plan to complete the assignment individually, you don't need to do anything (but, if you do create a group with only you as a member, that's ok too).
-
If you wish to form a pair, you should go to the WebCMS page and click on "Groups" in the left hand column, then click "Create". Click on the menu for "Group Type" and select "pair". After creating a group, click "Edit", search for the other member, and click "Add". WebCMS assigns a unique group ID to each group, in the form of "g" followed by six digits (e.g. g012345 ). We will periodically run a script to load these values into SMS.