summaryrefslogtreecommitdiffstats
path: root/test_cases/q3
diff options
context:
space:
mode:
Diffstat (limited to 'test_cases/q3')
-rw-r--r--test_cases/q3/0-lecture-6-tree.solution3
-rw-r--r--test_cases/q3/0-lecture-6-tree.test50
-rw-r--r--test_cases/q3/0-small-tree.solution3
-rw-r--r--test_cases/q3/0-small-tree.test36
-rw-r--r--test_cases/q3/1-1-minmax.solution3
-rw-r--r--test_cases/q3/1-1-minmax.test47
-rw-r--r--test_cases/q3/1-2-minmax.solution3
-rw-r--r--test_cases/q3/1-2-minmax.test47
-rw-r--r--test_cases/q3/1-3-minmax.solution3
-rw-r--r--test_cases/q3/1-3-minmax.test47
-rw-r--r--test_cases/q3/1-4-minmax.solution3
-rw-r--r--test_cases/q3/1-4-minmax.test47
-rw-r--r--test_cases/q3/1-5-minmax.solution3
-rw-r--r--test_cases/q3/1-5-minmax.test75
-rw-r--r--test_cases/q3/1-6-minmax.solution3
-rw-r--r--test_cases/q3/1-6-minmax.test75
-rw-r--r--test_cases/q3/1-7-minmax.solution3
-rw-r--r--test_cases/q3/1-7-minmax.test75
-rw-r--r--test_cases/q3/1-8-minmax.solution3
-rw-r--r--test_cases/q3/1-8-minmax.test75
-rw-r--r--test_cases/q3/2-1a-vary-depth.solution3
-rw-r--r--test_cases/q3/2-1a-vary-depth.test52
-rw-r--r--test_cases/q3/2-1b-vary-depth.solution3
-rw-r--r--test_cases/q3/2-1b-vary-depth.test52
-rw-r--r--test_cases/q3/2-2a-vary-depth.solution3
-rw-r--r--test_cases/q3/2-2a-vary-depth.test52
-rw-r--r--test_cases/q3/2-2b-vary-depth.solution3
-rw-r--r--test_cases/q3/2-2b-vary-depth.test52
-rw-r--r--test_cases/q3/2-3a-vary-depth.solution3
-rw-r--r--test_cases/q3/2-3a-vary-depth.test52
-rw-r--r--test_cases/q3/2-3b-vary-depth.solution3
-rw-r--r--test_cases/q3/2-3b-vary-depth.test52
-rw-r--r--test_cases/q3/2-4a-vary-depth.solution3
-rw-r--r--test_cases/q3/2-4a-vary-depth.test52
-rw-r--r--test_cases/q3/2-4b-vary-depth.solution3
-rw-r--r--test_cases/q3/2-4b-vary-depth.test52
-rw-r--r--test_cases/q3/2-one-ghost-3level.solution3
-rw-r--r--test_cases/q3/2-one-ghost-3level.test52
-rw-r--r--test_cases/q3/3-one-ghost-4level.solution3
-rw-r--r--test_cases/q3/3-one-ghost-4level.test79
-rw-r--r--test_cases/q3/4-two-ghosts-3level.solution3
-rw-r--r--test_cases/q3/4-two-ghosts-3level.test52
-rw-r--r--test_cases/q3/5-two-ghosts-4level.solution3
-rw-r--r--test_cases/q3/5-two-ghosts-4level.test79
-rw-r--r--test_cases/q3/6-tied-root.solution3
-rw-r--r--test_cases/q3/6-tied-root.test31
-rw-r--r--test_cases/q3/7-1a-check-depth-one-ghost.solution3
-rw-r--r--test_cases/q3/7-1a-check-depth-one-ghost.test83
-rw-r--r--test_cases/q3/7-1b-check-depth-one-ghost.solution3
-rw-r--r--test_cases/q3/7-1b-check-depth-one-ghost.test83
-rw-r--r--test_cases/q3/7-1c-check-depth-one-ghost.solution3
-rw-r--r--test_cases/q3/7-1c-check-depth-one-ghost.test83
-rw-r--r--test_cases/q3/7-2a-check-depth-two-ghosts.solution3
-rw-r--r--test_cases/q3/7-2a-check-depth-two-ghosts.test110
-rw-r--r--test_cases/q3/7-2b-check-depth-two-ghosts.solution3
-rw-r--r--test_cases/q3/7-2b-check-depth-two-ghosts.test110
-rw-r--r--test_cases/q3/7-2c-check-depth-two-ghosts.solution3
-rw-r--r--test_cases/q3/7-2c-check-depth-two-ghosts.test110
-rw-r--r--test_cases/q3/8-pacman-game.solution444
-rw-r--r--test_cases/q3/8-pacman-game.test19
-rw-r--r--test_cases/q3/CONFIG2
61 files changed, 2414 insertions, 0 deletions
diff --git a/test_cases/q3/0-lecture-6-tree.solution b/test_cases/q3/0-lecture-6-tree.solution
new file mode 100644
index 0000000..c4a91ad
--- /dev/null
+++ b/test_cases/q3/0-lecture-6-tree.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/0-lecture-6-tree.test.
+action: "Center"
+generated: "A B C D E F G H max min1 min2 min3"
diff --git a/test_cases/q3/0-lecture-6-tree.test b/test_cases/q3/0-lecture-6-tree.test
new file mode 100644
index 0000000..cbc61fe
--- /dev/null
+++ b/test_cases/q3/0-lecture-6-tree.test
@@ -0,0 +1,50 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+# Tree from lecture 6 slides
+diagram: """
+ max
+ /-/ | \--\
+ / | \
+ / | \
+ min1 min2 min3
+ /|\ /|\ /|\
+ / | \ / | \ / | \
+A B C D E F G H I
+3 12 8 5 4 6 14 1 11
+"""
+
+num_agents: "2"
+
+start_state: "max"
+win_states: "A B C D E F G H I"
+lose_states: ""
+
+successors: """
+max Left min1
+max Center min2
+max Right min3
+min1 Left A
+min1 Center B
+min1 Right C
+min2 Left D
+min2 Center E
+min2 Right F
+min3 Left G
+min3 Center H
+min3 Right I
+"""
+
+
+evaluation: """
+A 3.0
+B 12.0
+C 8.0
+D 5.0
+E 4.0
+F 6.0
+G 14.0
+H 1.0
+I 11.0
+"""
diff --git a/test_cases/q3/0-small-tree.solution b/test_cases/q3/0-small-tree.solution
new file mode 100644
index 0000000..e940986
--- /dev/null
+++ b/test_cases/q3/0-small-tree.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/0-small-tree.test.
+action: "pacLeft"
+generated: "A B C minLeft minRight root"
diff --git a/test_cases/q3/0-small-tree.test b/test_cases/q3/0-small-tree.test
new file mode 100644
index 0000000..a9829d0
--- /dev/null
+++ b/test_cases/q3/0-small-tree.test
@@ -0,0 +1,36 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ root
+ / \
+ minLeft minRight
+ / \ / \
+ A B C deeper
+ 4 3 2 |
+ D
+ 1000
+"""
+num_agents: "2"
+
+start_state: "root"
+win_states: "A C"
+lose_states: "B D"
+
+successors: """
+root pacLeft minLeft
+root pacRight minRight
+minLeft gLeft A
+minLeft gRight B
+minRight gLeft C
+minRight gRight deeper
+deeper pacLeft D
+"""
+
+evaluation: """
+A 4.0
+B 3.0
+C 2.0
+D 1000.0
+"""
diff --git a/test_cases/q3/1-1-minmax.solution b/test_cases/q3/1-1-minmax.solution
new file mode 100644
index 0000000..2834b29
--- /dev/null
+++ b/test_cases/q3/1-1-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-1-minmax.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 dx"
diff --git a/test_cases/q3/1-1-minmax.test b/test_cases/q3/1-1-minmax.test
new file mode 100644
index 0000000..c601316
--- /dev/null
+++ b/test_cases/q3/1-1-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+ c1 c2 cx
+ / \ / \ |
+ d1 d2 d3 d4 dx
+-3 -9 10 6 -3.01
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is -3.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+cx Down dx
+"""
+
+evaluation: """
+d1 -3.0
+d2 -9.0
+d3 10.0
+d4 6.0
+dx -3.01
+"""
diff --git a/test_cases/q3/1-2-minmax.solution b/test_cases/q3/1-2-minmax.solution
new file mode 100644
index 0000000..8c17bcf
--- /dev/null
+++ b/test_cases/q3/1-2-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-2-minmax.test.
+action: "Right"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 dx"
diff --git a/test_cases/q3/1-2-minmax.test b/test_cases/q3/1-2-minmax.test
new file mode 100644
index 0000000..d42a467
--- /dev/null
+++ b/test_cases/q3/1-2-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+ c1 c2 cx
+ / \ / \ |
+ d1 d2 d3 d4 dx
+-3 -9 10 6 -2.99
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is -3.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+cx Down dx
+"""
+
+evaluation: """
+d1 -3.0
+d2 -9.0
+d3 10.0
+d4 6.0
+dx -2.99
+"""
diff --git a/test_cases/q3/1-3-minmax.solution b/test_cases/q3/1-3-minmax.solution
new file mode 100644
index 0000000..827cdbd
--- /dev/null
+++ b/test_cases/q3/1-3-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-3-minmax.test.
+action: "Left"
+generated: "a b1 b2 c3 cx d5 d6 dx"
diff --git a/test_cases/q3/1-3-minmax.test b/test_cases/q3/1-3-minmax.test
new file mode 100644
index 0000000..0fc2226
--- /dev/null
+++ b/test_cases/q3/1-3-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ cx c3 c4
+ | / \ / \
+ dx d5 d6 d7 d8
+ 4.01 4 -7 0 5
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b2 is 4.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+"""
+
+evaluation: """
+d5 4.0
+d6 -7.0
+d7 0.0
+d8 5.0
+dx 4.01
+"""
diff --git a/test_cases/q3/1-4-minmax.solution b/test_cases/q3/1-4-minmax.solution
new file mode 100644
index 0000000..f5570d1
--- /dev/null
+++ b/test_cases/q3/1-4-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-4-minmax.test.
+action: "Right"
+generated: "a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/test_cases/q3/1-4-minmax.test b/test_cases/q3/1-4-minmax.test
new file mode 100644
index 0000000..d8d02e2
--- /dev/null
+++ b/test_cases/q3/1-4-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ cx c3 c4
+ | / \ / \
+ dx d5 d6 d7 d8
+ 3.99 4 -7 0 5
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b2 is 4.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+"""
+
+evaluation: """
+d5 4.0
+d6 -7.0
+d7 0.0
+d8 5.0
+dx 3.99
+"""
diff --git a/test_cases/q3/1-5-minmax.solution b/test_cases/q3/1-5-minmax.solution
new file mode 100644
index 0000000..06cebde
--- /dev/null
+++ b/test_cases/q3/1-5-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-5-minmax.test.
+action: "Right"
+generated: "A B C D E F G Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/test_cases/q3/1-5-minmax.test b/test_cases/q3/1-5-minmax.test
new file mode 100644
index 0000000..2d57290
--- /dev/null
+++ b/test_cases/q3/1-5-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "4"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+ c1 c2 cx
+ / \ / \ |
+ d1 d2 d3 d4 dx
+ / \ / \ / \ / \ |
+ A B C D E F G H Z
+-3 13 5 9 10 3 -6 8 3.01
+
+a - max
+b - min
+c - max
+d - min
+
+Note the minimax value of b1 is 3.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "A B C D E F G H I J K L M N O P Z"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+d1 Left A
+d1 Right B
+d2 Left C
+d2 Right D
+d3 Left E
+d3 Right F
+d4 Left G
+d4 Right H
+d5 Left I
+d5 Right J
+d6 Left K
+d6 Right L
+d7 Left M
+d7 Right N
+d8 Left O
+d8 Right P
+dx Down Z
+"""
+
+evaluation: """
+A -3.0
+B 13.0
+C 5.0
+D 9.0
+E 10.0
+F 3.0
+G -6.0
+H 8.0
+Z 3.01
+"""
diff --git a/test_cases/q3/1-6-minmax.solution b/test_cases/q3/1-6-minmax.solution
new file mode 100644
index 0000000..1ced2ca
--- /dev/null
+++ b/test_cases/q3/1-6-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-6-minmax.test.
+action: "Left"
+generated: "A B C D E F G Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/test_cases/q3/1-6-minmax.test b/test_cases/q3/1-6-minmax.test
new file mode 100644
index 0000000..3360e93
--- /dev/null
+++ b/test_cases/q3/1-6-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "4"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+ c1 c2 cx
+ / \ / \ |
+ d1 d2 d3 d4 dx
+ / \ / \ / \ / \ |
+ A B C D E F G H Z
+-3 13 5 9 10 3 -6 8 2.99
+
+a - max
+b - min
+c - max
+d - min
+
+Note the minimax value of b1 is 3.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "A B C D E F G H I J K L M N O P Z"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+d1 Left A
+d1 Right B
+d2 Left C
+d2 Right D
+d3 Left E
+d3 Right F
+d4 Left G
+d4 Right H
+d5 Left I
+d5 Right J
+d6 Left K
+d6 Right L
+d7 Left M
+d7 Right N
+d8 Left O
+d8 Right P
+dx Down Z
+"""
+
+evaluation: """
+A -3.0
+B 13.0
+C 5.0
+D 9.0
+E 10.0
+F 3.0
+G -6.0
+H 8.0
+Z 2.99
+"""
diff --git a/test_cases/q3/1-7-minmax.solution b/test_cases/q3/1-7-minmax.solution
new file mode 100644
index 0000000..74e2da0
--- /dev/null
+++ b/test_cases/q3/1-7-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-7-minmax.test.
+action: "Left"
+generated: "I J K M O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/test_cases/q3/1-7-minmax.test b/test_cases/q3/1-7-minmax.test
new file mode 100644
index 0000000..207381d
--- /dev/null
+++ b/test_cases/q3/1-7-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "4"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ cx c3 c4
+ | / \ / \
+ dx d5 d6 d7 d8
+ | / \ / \ / \ / \
+ Z I J K L M N O P
+ -1.99 -1 -9 4 7 2 5 -3 -2
+
+a - max
+b - min
+c - min
+d - max
+
+Note that the minimax value of b2 is -2
+"""
+num_agents: "3"
+
+start_state: "a"
+win_states: "A B C D E F G H I J K L M N O P Z"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+d1 Left A
+d1 Right B
+d2 Left C
+d2 Right D
+d3 Left E
+d3 Right F
+d4 Left G
+d4 Right H
+d5 Left I
+d5 Right J
+d6 Left K
+d6 Right L
+d7 Left M
+d7 Right N
+d8 Left O
+d8 Right P
+dx Down Z
+"""
+
+evaluation: """
+I -1.0
+J -9.0
+K 4.0
+L 7.0
+M 2.0
+N 5.0
+O -3.0
+P -2.0
+Z -1.99
+"""
diff --git a/test_cases/q3/1-8-minmax.solution b/test_cases/q3/1-8-minmax.solution
new file mode 100644
index 0000000..bf426b8
--- /dev/null
+++ b/test_cases/q3/1-8-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/1-8-minmax.test.
+action: "Right"
+generated: "I J K M O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/test_cases/q3/1-8-minmax.test b/test_cases/q3/1-8-minmax.test
new file mode 100644
index 0000000..2272b30
--- /dev/null
+++ b/test_cases/q3/1-8-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "4"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ cx c3 c4
+ | / \ / \
+ dx d5 d6 d7 d8
+ | / \ / \ / \ / \
+ Z I J K L M N O P
+ -2.01 -1 -9 4 7 2 5 -3 -2
+
+a - max
+b - min
+c - min
+d - max
+
+Note that the minimax value of b2 is -2.01
+"""
+num_agents: "3"
+
+start_state: "a"
+win_states: "A B C D E F G H I J K L M N O P Z"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+d1 Left A
+d1 Right B
+d2 Left C
+d2 Right D
+d3 Left E
+d3 Right F
+d4 Left G
+d4 Right H
+d5 Left I
+d5 Right J
+d6 Left K
+d6 Right L
+d7 Left M
+d7 Right N
+d8 Left O
+d8 Right P
+dx Down Z
+"""
+
+evaluation: """
+I -1.0
+J -9.0
+K 4.0
+L 7.0
+M 2.0
+N 5.0
+O -3.0
+P -2.0
+Z -2.01
+"""
diff --git a/test_cases/q3/2-1a-vary-depth.solution b/test_cases/q3/2-1a-vary-depth.solution
new file mode 100644
index 0000000..59d892c
--- /dev/null
+++ b/test_cases/q3/2-1a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-1a-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx"
diff --git a/test_cases/q3/2-1a-vary-depth.test b/test_cases/q3/2-1a-vary-depth.test
new file mode 100644
index 0000000..f8f9431
--- /dev/null
+++ b/test_cases/q3/2-1a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "1"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+-4 c1 c2 9 cx -4.01
+ / \ / \ |
+ d1 d2 d3 d4 dx
+-3 -9 10 6 -4.01
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is -3, but the depth=1 limited value is -4.
+The values next to c1, c2, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+cx Down dx
+"""
+
+evaluation: """
+c1 -4.0
+c2 9.0
+cx -4.01
+d1 -3.0
+d2 -9.0
+d3 10.0
+d4 6.0
+dx -4.01
+"""
diff --git a/test_cases/q3/2-1b-vary-depth.solution b/test_cases/q3/2-1b-vary-depth.solution
new file mode 100644
index 0000000..a0f232c
--- /dev/null
+++ b/test_cases/q3/2-1b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-1b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 dx"
diff --git a/test_cases/q3/2-1b-vary-depth.test b/test_cases/q3/2-1b-vary-depth.test
new file mode 100644
index 0000000..1b161af
--- /dev/null
+++ b/test_cases/q3/2-1b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+-4 c1 c2 9 cx -4.01
+ / \ / \ |
+ d1 d2 d3 d4 dx
+-3 -9 10 6 -4.01
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is -3, but the depth=1 limited value is -4.
+The values next to c1, c2, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+cx Down dx
+"""
+
+evaluation: """
+c1 -4.0
+c2 9.0
+cx -4.01
+d1 -3.0
+d2 -9.0
+d3 10.0
+d4 6.0
+dx -4.01
+"""
diff --git a/test_cases/q3/2-2a-vary-depth.solution b/test_cases/q3/2-2a-vary-depth.solution
new file mode 100644
index 0000000..6e8d7fd
--- /dev/null
+++ b/test_cases/q3/2-2a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-2a-vary-depth.test.
+action: "Right"
+generated: "a b1 b2 c1 c2 cx"
diff --git a/test_cases/q3/2-2a-vary-depth.test b/test_cases/q3/2-2a-vary-depth.test
new file mode 100644
index 0000000..b436d21
--- /dev/null
+++ b/test_cases/q3/2-2a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "1"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+-4 c1 c2 9 cx -3.99
+ / \ / \ |
+ d1 d2 d3 d4 dx
+-3 -9 10 6 -3.99
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is -3, but the depth=1 limited value is -4.
+The values next to c1, c2, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+cx Down dx
+"""
+
+evaluation: """
+c1 -4.0
+c2 9.0
+cx -3.99
+d1 -3.0
+d2 -9.0
+d3 10.0
+d4 6.0
+dx -3.99
+"""
diff --git a/test_cases/q3/2-2b-vary-depth.solution b/test_cases/q3/2-2b-vary-depth.solution
new file mode 100644
index 0000000..f508aef
--- /dev/null
+++ b/test_cases/q3/2-2b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-2b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 dx"
diff --git a/test_cases/q3/2-2b-vary-depth.test b/test_cases/q3/2-2b-vary-depth.test
new file mode 100644
index 0000000..c0540a3
--- /dev/null
+++ b/test_cases/q3/2-2b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ |
+-4 c1 c2 9 cx -3.99
+ / \ / \ |
+ d1 d2 d3 d4 dx
+-3 -9 10 6 -3.99
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is -3, but the depth=1 limited value is -4.
+The values next to c1, c2, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Down cx
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+cx Down dx
+"""
+
+evaluation: """
+c1 -4.0
+c2 9.0
+cx -3.99
+d1 -3.0
+d2 -9.0
+d3 10.0
+d4 6.0
+dx -3.99
+"""
diff --git a/test_cases/q3/2-3a-vary-depth.solution b/test_cases/q3/2-3a-vary-depth.solution
new file mode 100644
index 0000000..d805b84
--- /dev/null
+++ b/test_cases/q3/2-3a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-3a-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c3 c4 cx"
diff --git a/test_cases/q3/2-3a-vary-depth.test b/test_cases/q3/2-3a-vary-depth.test
new file mode 100644
index 0000000..853a8d3
--- /dev/null
+++ b/test_cases/q3/2-3a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "1"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ 5.01 cx 8 c3 c4 5
+ | / \ / \
+ dx d5 d6 d7 d8
+ 5.01 4 -7 0 5
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is 4, but the depth=1 limited value is 5.
+The values next to c3, c4, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+"""
+
+evaluation: """
+c3 8.0
+c4 5.0
+cx 5.01
+d5 4.0
+d6 -7.0
+d7 0.0
+d8 5.0
+dx 5.01
+"""
diff --git a/test_cases/q3/2-3b-vary-depth.solution b/test_cases/q3/2-3b-vary-depth.solution
new file mode 100644
index 0000000..32a70c6
--- /dev/null
+++ b/test_cases/q3/2-3b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-3b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c3 cx d5 d6 dx"
diff --git a/test_cases/q3/2-3b-vary-depth.test b/test_cases/q3/2-3b-vary-depth.test
new file mode 100644
index 0000000..2892005
--- /dev/null
+++ b/test_cases/q3/2-3b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ 5.01 cx 8 c3 c4 5
+ | / \ / \
+ dx d5 d6 d7 d8
+ 5.01 4 -7 0 5
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is 4, but the depth=1 limited value is 5.
+The values next to c3, c4, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+"""
+
+evaluation: """
+c3 8.0
+c4 5.0
+cx 5.01
+d5 4.0
+d6 -7.0
+d7 0.0
+d8 5.0
+dx 5.01
+"""
diff --git a/test_cases/q3/2-4a-vary-depth.solution b/test_cases/q3/2-4a-vary-depth.solution
new file mode 100644
index 0000000..eafdb62
--- /dev/null
+++ b/test_cases/q3/2-4a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-4a-vary-depth.test.
+action: "Right"
+generated: "a b1 b2 c3 c4 cx"
diff --git a/test_cases/q3/2-4a-vary-depth.test b/test_cases/q3/2-4a-vary-depth.test
new file mode 100644
index 0000000..73d681b
--- /dev/null
+++ b/test_cases/q3/2-4a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "1"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ 4.99 cx 8 c3 c4 5
+ | / \ / \
+ dx d5 d6 d7 d8
+ 4.99 4 -7 0 5
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is 4, but the depth=1 limited value is 5.
+The values next to c3, c4, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+"""
+
+evaluation: """
+c3 8.0
+c4 5.0
+cx 4.99
+d5 4.0
+d6 -7.0
+d7 0.0
+d8 5.0
+dx 4.99
+"""
diff --git a/test_cases/q3/2-4b-vary-depth.solution b/test_cases/q3/2-4b-vary-depth.solution
new file mode 100644
index 0000000..820398a
--- /dev/null
+++ b/test_cases/q3/2-4b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-4b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c3 cx d5 d6 dx"
diff --git a/test_cases/q3/2-4b-vary-depth.test b/test_cases/q3/2-4b-vary-depth.test
new file mode 100644
index 0000000..a7aca5f
--- /dev/null
+++ b/test_cases/q3/2-4b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ | / \
+ 4.99 cx 8 c3 c4 5
+ | / \ / \
+ dx d5 d6 d7 d8
+ 4.99 4 -7 0 5
+
+a - max
+b - min
+c - max
+
+Note that the minimax value of b1 is 4, but the depth=1 limited value is 5.
+The values next to c3, c4, and cx are the values of the evaluation function, not
+necessarily the correct minimax backup.
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8 dx"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Down cx
+b2 Left c3
+b2 Right c4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+cx Down dx
+"""
+
+evaluation: """
+c3 8.0
+c4 5.0
+cx 4.99
+d5 4.0
+d6 -7.0
+d7 0.0
+d8 5.0
+dx 4.99
+"""
diff --git a/test_cases/q3/2-one-ghost-3level.solution b/test_cases/q3/2-one-ghost-3level.solution
new file mode 100644
index 0000000..b22f76f
--- /dev/null
+++ b/test_cases/q3/2-one-ghost-3level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/2-one-ghost-3level.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 c3 d1 d2 d3 d5 d6"
diff --git a/test_cases/q3/2-one-ghost-3level.test b/test_cases/q3/2-one-ghost-3level.test
new file mode 100644
index 0000000..2ec19b4
--- /dev/null
+++ b/test_cases/q3/2-one-ghost-3level.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ / \
+ c1 c2 c3 c4
+ / \ / \ / \ / \
+ d1 d2 d3 d4 d5 d6 d7 d8
+ 3 9 10 6 4 7 0 5
+
+a - max
+b - min
+c - max
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Left c3
+b2 Right c4
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+"""
+
+evaluation: """
+d1 3.0
+d2 9.0
+d3 10.0
+d4 6.0
+d5 4.0
+d6 7.0
+d7 0.0
+d8 5.0
+"""
diff --git a/test_cases/q3/3-one-ghost-4level.solution b/test_cases/q3/3-one-ghost-4level.solution
new file mode 100644
index 0000000..b6a9a0f
--- /dev/null
+++ b/test_cases/q3/3-one-ghost-4level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/3-one-ghost-4level.test.
+action: "Left"
+generated: "A B C D E F I K a b1 b2 c1 c2 c3 d1 d2 d3 d5 d6"
diff --git a/test_cases/q3/3-one-ghost-4level.test b/test_cases/q3/3-one-ghost-4level.test
new file mode 100644
index 0000000..cfa33db
--- /dev/null
+++ b/test_cases/q3/3-one-ghost-4level.test
@@ -0,0 +1,79 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "4"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ / \
+ c1 c2 c3 c4
+ / \ / \ / \ / \
+ d1 d2 d3 d4 d5 d6 d7 d8
+/ \ / \ / \ / \ / \ / \ / \ / \
+A B C D E F G H I J K L M N O P
+3 13 5 9 10 11 6 8 1 0 4 7 12 15 2 14
+
+a - max
+b - min
+c - max
+d - min
+"""
+num_agents: "2"
+
+start_state: "a"
+win_states: "A B C D E F G H I J K L M N O P"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Left c3
+b2 Right c4
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+d1 Left A
+d1 Right B
+d2 Left C
+d2 Right D
+d3 Left E
+d3 Right F
+d4 Left G
+d4 Right H
+d5 Left I
+d5 Right J
+d6 Left K
+d6 Right L
+d7 Left M
+d7 Right N
+d8 Left O
+d8 Right P
+"""
+
+evaluation: """
+A 3.0
+B 13.0
+C 5.0
+D 9.0
+E 10.0
+F 11.0
+G 6.0
+H 8.0
+I 1.0
+J 0.0
+K 4.0
+L 7.0
+M 12.0
+N 15.0
+O 2.0
+P 14.0
+"""
diff --git a/test_cases/q3/4-two-ghosts-3level.solution b/test_cases/q3/4-two-ghosts-3level.solution
new file mode 100644
index 0000000..12e9520
--- /dev/null
+++ b/test_cases/q3/4-two-ghosts-3level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/4-two-ghosts-3level.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7"
diff --git a/test_cases/q3/4-two-ghosts-3level.test b/test_cases/q3/4-two-ghosts-3level.test
new file mode 100644
index 0000000..fd3ac91
--- /dev/null
+++ b/test_cases/q3/4-two-ghosts-3level.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ / \
+ c1 c2 c3 c4
+ / \ / \ / \ / \
+ d1 d2 d3 d4 d5 d6 d7 d8
+ 3 9 10 6 4 7 0 5
+
+a - max
+b - min
+c - min
+"""
+num_agents: "3"
+
+start_state: "a"
+win_states: "d1 d2 d3 d4 d5 d6 d7 d8"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Left c3
+b2 Right c4
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+"""
+
+evaluation: """
+d1 3.0
+d2 9.0
+d3 10.0
+d4 6.0
+d5 4.0
+d6 7.0
+d7 0.0
+d8 5.0
+"""
diff --git a/test_cases/q3/5-two-ghosts-4level.solution b/test_cases/q3/5-two-ghosts-4level.solution
new file mode 100644
index 0000000..89c534c
--- /dev/null
+++ b/test_cases/q3/5-two-ghosts-4level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/5-two-ghosts-4level.test.
+action: "Left"
+generated: "A B C D E G H I J a b1 b2 c1 c2 c3 d1 d2 d3 d4 d5"
diff --git a/test_cases/q3/5-two-ghosts-4level.test b/test_cases/q3/5-two-ghosts-4level.test
new file mode 100644
index 0000000..ce431fc
--- /dev/null
+++ b/test_cases/q3/5-two-ghosts-4level.test
@@ -0,0 +1,79 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "4"
+
+diagram: """
+ /-----a------\
+ / \
+ / \
+ b1 b2
+ / \ / \
+ c1 c2 c3 c4
+ / \ / \ / \ / \
+ d1 d2 d3 d4 d5 d6 d7 d8
+/ \ / \ / \ / \ / \ / \ / \ / \
+A B C D E F G H I J K L M N O P
+3 13 5 9 10 11 6 8 1 0 4 7 12 15 2 14
+
+a - max
+b - min
+c - min
+d - max
+"""
+num_agents: "3"
+
+start_state: "a"
+win_states: "A B C D E F G H I J K L M N O P"
+lose_states: ""
+
+successors: """
+a Left b1
+a Right b2
+b1 Left c1
+b1 Right c2
+b2 Left c3
+b2 Right c4
+c1 Left d1
+c1 Right d2
+c2 Left d3
+c2 Right d4
+c3 Left d5
+c3 Right d6
+c4 Left d7
+c4 Right d8
+d1 Left A
+d1 Right B
+d2 Left C
+d2 Right D
+d3 Left E
+d3 Right F
+d4 Left G
+d4 Right H
+d5 Left I
+d5 Right J
+d6 Left K
+d6 Right L
+d7 Left M
+d7 Right N
+d8 Left O
+d8 Right P
+"""
+
+evaluation: """
+A 3.0
+B 13.0
+C 5.0
+D 9.0
+E 10.0
+F 11.0
+G 6.0
+H 8.0
+I 1.0
+J 0.0
+K 4.0
+L 7.0
+M 12.0
+N 15.0
+O 2.0
+P 14.0
+"""
diff --git a/test_cases/q3/6-tied-root.solution b/test_cases/q3/6-tied-root.solution
new file mode 100644
index 0000000..93ece27
--- /dev/null
+++ b/test_cases/q3/6-tied-root.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/6-tied-root.test.
+action: "Left"
+generated: "A B C max min1 min2"
diff --git a/test_cases/q3/6-tied-root.test b/test_cases/q3/6-tied-root.test
new file mode 100644
index 0000000..b43f4d9
--- /dev/null
+++ b/test_cases/q3/6-tied-root.test
@@ -0,0 +1,31 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ max
+ / \
+min1 min2
+ | / \
+ A B C
+10 10 0
+"""
+num_agents: "2"
+
+start_state: "max"
+win_states: "A B"
+lose_states: "C"
+
+successors: """
+max Left min1
+max Right min2
+min1 Down A
+min2 Left B
+min2 Right C
+"""
+
+evaluation: """
+A 10.0
+B 10.0
+C 0.0
+"""
diff --git a/test_cases/q3/7-1a-check-depth-one-ghost.solution b/test_cases/q3/7-1a-check-depth-one-ghost.solution
new file mode 100644
index 0000000..a3a74c4
--- /dev/null
+++ b/test_cases/q3/7-1a-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/7-1a-check-depth-one-ghost.test.
+action: "Left"
+generated: "a b1 b2 b3 c1 c2 c3"
diff --git a/test_cases/q3/7-1a-check-depth-one-ghost.test b/test_cases/q3/7-1a-check-depth-one-ghost.test
new file mode 100644
index 0000000..0230cbb
--- /dev/null
+++ b/test_cases/q3/7-1a-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "1"
+
+diagram: """
+ a
+ /-/ | \--\
+ / | \
+ 0 b1 0 b2 b3 8
+ | | |
+ 10 c1 0 c2 c3 8
+ | | |
+ 0 d1 0 d2 d3 8
+ | | |
+ 0 e1 10 e2 e3 8
+ | | |
+ 0 f1 0 f2 f3 8
+ | | |
+ g1 g2 g3
+ 0 0 8
+
+a - max
+b - min
+c - max
+d - min
+e - max
+f - min
+
+At depth 1, the evaluation function is called at level c,
+so Left should be returned. If your algorithm is returning a
+different action, check how you implemented your depth.
+"""
+
+num_agents: "2"
+
+start_state: "a"
+win_states: "g1 g2 g3"
+lose_states: ""
+
+successors: """
+a Left b1
+a Center b2
+a Right b3
+b1 Center c1
+b2 Center c2
+b3 Center c3
+c1 Center d1
+c2 Center d2
+c3 Center d3
+d1 Center e1
+d2 Center e2
+d3 Center e3
+e1 Center f1
+e2 Center f2
+e3 Center f3
+f1 Center g1
+f2 Center g2
+f3 Center g3
+"""
+
+
+evaluation: """
+b1 0.0
+b2 0.0
+b3 8.0
+c1 10.0
+c2 0.0
+c3 8.0
+d1 0.0
+d2 0.0
+d3 8.0
+e1 0.0
+e2 10.0
+e3 8.0
+f1 0.0
+f2 0.0
+f3 8.0
+g1 0.0
+g2 0.0
+g3 8.0
+"""
+
+
diff --git a/test_cases/q3/7-1b-check-depth-one-ghost.solution b/test_cases/q3/7-1b-check-depth-one-ghost.solution
new file mode 100644
index 0000000..8dad3c7
--- /dev/null
+++ b/test_cases/q3/7-1b-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/7-1b-check-depth-one-ghost.test.
+action: "Center"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3"
diff --git a/test_cases/q3/7-1b-check-depth-one-ghost.test b/test_cases/q3/7-1b-check-depth-one-ghost.test
new file mode 100644
index 0000000..7e0ced7
--- /dev/null
+++ b/test_cases/q3/7-1b-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+diagram: """
+ a
+ /-/ | \--\
+ / | \
+ 0 b1 0 b2 b3 8
+ | | |
+ 10 c1 0 c2 c3 8
+ | | |
+ 0 d1 0 d2 d3 8
+ | | |
+ 0 e1 10 e2 e3 8
+ | | |
+ 0 f1 0 f2 f3 8
+ | | |
+ g1 g2 g3
+ 0 0 8
+
+a - max
+b - min
+c - max
+d - min
+e - max
+f - min
+
+At depth 2, the evaluation function is called at level e,
+so Center should be returned. If your algorithm is returning a
+different action, check how you implemented your depth.
+"""
+
+num_agents: "2"
+
+start_state: "a"
+win_states: "g1 g2 g3"
+lose_states: ""
+
+successors: """
+a Left b1
+a Center b2
+a Right b3
+b1 Center c1
+b2 Center c2
+b3 Center c3
+c1 Center d1
+c2 Center d2
+c3 Center d3
+d1 Center e1
+d2 Center e2
+d3 Center e3
+e1 Center f1
+e2 Center f2
+e3 Center f3
+f1 Center g1
+f2 Center g2
+f3 Center g3
+"""
+
+
+evaluation: """
+b1 0.0
+b2 0.0
+b3 8.0
+c1 10.0
+c2 0.0
+c3 8.0
+d1 0.0
+d2 0.0
+d3 8.0
+e1 0.0
+e2 10.0
+e3 8.0
+f1 0.0
+f2 0.0
+f3 8.0
+g1 0.0
+g2 0.0
+g3 8.0
+"""
+
+
diff --git a/test_cases/q3/7-1c-check-depth-one-ghost.solution b/test_cases/q3/7-1c-check-depth-one-ghost.solution
new file mode 100644
index 0000000..210bb5d
--- /dev/null
+++ b/test_cases/q3/7-1c-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/7-1c-check-depth-one-ghost.test.
+action: "Right"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3"
diff --git a/test_cases/q3/7-1c-check-depth-one-ghost.test b/test_cases/q3/7-1c-check-depth-one-ghost.test
new file mode 100644
index 0000000..cd92eb9
--- /dev/null
+++ b/test_cases/q3/7-1c-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ a
+ /-/ | \--\
+ / | \
+ 0 b1 0 b2 b3 8
+ | | |
+ 10 c1 0 c2 c3 8
+ | | |
+ 0 d1 0 d2 d3 8
+ | | |
+ 0 e1 10 e2 e3 8
+ | | |
+ 0 f1 0 f2 f3 8
+ | | |
+ g1 g2 g3
+ 0 0 8
+
+a - max
+b - min
+c - max
+d - min
+e - max
+f - min
+
+At depth 3, the evaluation function is called at level g,
+so Right should be returned. If your algorithm is returning a
+different action, check how you implemented your depth.
+"""
+
+num_agents: "2"
+
+start_state: "a"
+win_states: "g1 g2 g3"
+lose_states: ""
+
+successors: """
+a Left b1
+a Center b2
+a Right b3
+b1 Center c1
+b2 Center c2
+b3 Center c3
+c1 Center d1
+c2 Center d2
+c3 Center d3
+d1 Center e1
+d2 Center e2
+d3 Center e3
+e1 Center f1
+e2 Center f2
+e3 Center f3
+f1 Center g1
+f2 Center g2
+f3 Center g3
+"""
+
+
+evaluation: """
+b1 0.0
+b2 0.0
+b3 8.0
+c1 10.0
+c2 0.0
+c3 8.0
+d1 0.0
+d2 0.0
+d3 8.0
+e1 0.0
+e2 10.0
+e3 8.0
+f1 0.0
+f2 0.0
+f3 8.0
+g1 0.0
+g2 0.0
+g3 8.0
+"""
+
+
diff --git a/test_cases/q3/7-2a-check-depth-two-ghosts.solution b/test_cases/q3/7-2a-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..9a08a38
--- /dev/null
+++ b/test_cases/q3/7-2a-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/7-2a-check-depth-two-ghosts.test.
+action: "Left"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3"
diff --git a/test_cases/q3/7-2a-check-depth-two-ghosts.test b/test_cases/q3/7-2a-check-depth-two-ghosts.test
new file mode 100644
index 0000000..421a05c
--- /dev/null
+++ b/test_cases/q3/7-2a-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "1"
+
+diagram: """
+ a
+ /-/ | \--\
+ / | \
+ 0 b1 0 b2 b3 8
+ | | |
+ 0 c1 0 c2 c3 8
+ | | |
+ 10 d1 0 d2 d3 8
+ | | |
+ 0 e1 0 e2 e3 8
+ | | |
+ 0 f1 0 f2 f3 8
+ | | |
+ 0 g1 10 g2 g3 8
+ | | |
+ 0 h1 0 h2 h3 8
+ | | |
+ 0 i1 0 i2 i3 8
+ | | |
+ j1 j2 j3
+ 0 0 8
+
+a - max
+b - min
+c - min
+d - max
+e - min
+f - min
+g - max
+h - min
+i - min
+
+At depth 1, the evaluation function is called at level d,
+so Left should be returned. If your algorithm is returning a
+different action, check how you implemented your depth.
+"""
+
+num_agents: "3"
+
+start_state: "a"
+win_states: "j1 j2 j3"
+lose_states: ""
+
+successors: """
+a Left b1
+a Center b2
+a Right b3
+b1 Center c1
+b2 Center c2
+b3 Center c3
+c1 Center d1
+c2 Center d2
+c3 Center d3
+d1 Center e1
+d2 Center e2
+d3 Center e3
+e1 Center f1
+e2 Center f2
+e3 Center f3
+f1 Center g1
+f2 Center g2
+f3 Center g3
+g1 Center h1
+g2 Center h2
+g3 Center h3
+h1 Center i1
+h2 Center i2
+h3 Center i3
+i1 Center j1
+i2 Center j2
+i3 Center j3
+"""
+
+
+evaluation: """
+b1 0.0
+b2 0.0
+b3 8.0
+c1 0.0
+c2 0.0
+c3 8.0
+d1 10.0
+d2 0.0
+d3 8.0
+e1 0.0
+e2 0.0
+e3 8.0
+f1 0.0
+f2 0.0
+f3 8.0
+g1 0.0
+g2 10.0
+g3 8.0
+h1 0.0
+h2 0.0
+h3 8.0
+i1 0.0
+i2 0.0
+i3 8.0
+j1 0.0
+j2 0.0
+j3 8.0
+"""
+
+
diff --git a/test_cases/q3/7-2b-check-depth-two-ghosts.solution b/test_cases/q3/7-2b-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..194c0aa
--- /dev/null
+++ b/test_cases/q3/7-2b-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/7-2b-check-depth-two-ghosts.test.
+action: "Center"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3"
diff --git a/test_cases/q3/7-2b-check-depth-two-ghosts.test b/test_cases/q3/7-2b-check-depth-two-ghosts.test
new file mode 100644
index 0000000..728806e
--- /dev/null
+++ b/test_cases/q3/7-2b-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "2"
+
+diagram: """
+ a
+ /-/ | \--\
+ / | \
+ 0 b1 0 b2 b3 8
+ | | |
+ 0 c1 0 c2 c3 8
+ | | |
+ 10 d1 0 d2 d3 8
+ | | |
+ 0 e1 0 e2 e3 8
+ | | |
+ 0 f1 0 f2 f3 8
+ | | |
+ 0 g1 10 g2 g3 8
+ | | |
+ 0 h1 0 h2 h3 8
+ | | |
+ 0 i1 0 i2 i3 8
+ | | |
+ j1 j2 j3
+ 0 0 8
+
+a - max
+b - min
+c - min
+d - max
+e - min
+f - min
+g - max
+h - min
+i - min
+
+At depth 2, the evaluation function is called at level g,
+so Center should be returned. If your algorithm is returning
+a different action, check how you implemented your depth.
+"""
+
+num_agents: "3"
+
+start_state: "a"
+win_states: "j1 j2 j3"
+lose_states: ""
+
+successors: """
+a Left b1
+a Center b2
+a Right b3
+b1 Center c1
+b2 Center c2
+b3 Center c3
+c1 Center d1
+c2 Center d2
+c3 Center d3
+d1 Center e1
+d2 Center e2
+d3 Center e3
+e1 Center f1
+e2 Center f2
+e3 Center f3
+f1 Center g1
+f2 Center g2
+f3 Center g3
+g1 Center h1
+g2 Center h2
+g3 Center h3
+h1 Center i1
+h2 Center i2
+h3 Center i3
+i1 Center j1
+i2 Center j2
+i3 Center j3
+"""
+
+
+evaluation: """
+b1 0.0
+b2 0.0
+b3 8.0
+c1 0.0
+c2 0.0
+c3 8.0
+d1 10.0
+d2 0.0
+d3 8.0
+e1 0.0
+e2 0.0
+e3 8.0
+f1 0.0
+f2 0.0
+f3 8.0
+g1 0.0
+g2 10.0
+g3 8.0
+h1 0.0
+h2 0.0
+h3 8.0
+i1 0.0
+i2 0.0
+i3 8.0
+j1 0.0
+j2 0.0
+j3 8.0
+"""
+
+
diff --git a/test_cases/q3/7-2c-check-depth-two-ghosts.solution b/test_cases/q3/7-2c-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..1e989f3
--- /dev/null
+++ b/test_cases/q3/7-2c-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q3/7-2c-check-depth-two-ghosts.test.
+action: "Right"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 h1 h2 h3 i1 i2 i3 j1 j2 j3"
diff --git a/test_cases/q3/7-2c-check-depth-two-ghosts.test b/test_cases/q3/7-2c-check-depth-two-ghosts.test
new file mode 100644
index 0000000..9e727ce
--- /dev/null
+++ b/test_cases/q3/7-2c-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "AlphaBetaAgent"
+depth: "3"
+
+diagram: """
+ a
+ /-/ | \--\
+ / | \
+ 0 b1 0 b2 b3 8
+ | | |
+ 0 c1 0 c2 c3 8
+ | | |
+ 10 d1 0 d2 d3 8
+ | | |
+ 0 e1 0 e2 e3 8
+ | | |
+ 0 f1 0 f2 f3 8
+ | | |
+ 0 g1 10 g2 g3 8
+ | | |
+ 0 h1 0 h2 h3 8
+ | | |
+ 0 i1 0 i2 i3 8
+ | | |
+ j1 j2 j3
+ 0 0 8
+
+a - max
+b - min
+c - min
+d - max
+e - min
+f - min
+g - max
+h - min
+i - min
+
+At depth 3, the evaluation function is called at level j,
+so Right should be returned. If your algorithm is returning
+a different action, check how you implemented your depth.
+"""
+
+num_agents: "3"
+
+start_state: "a"
+win_states: "j1 j2 j3"
+lose_states: ""
+
+successors: """
+a Left b1
+a Center b2
+a Right b3
+b1 Center c1
+b2 Center c2
+b3 Center c3
+c1 Center d1
+c2 Center d2
+c3 Center d3
+d1 Center e1
+d2 Center e2
+d3 Center e3
+e1 Center f1
+e2 Center f2
+e3 Center f3
+f1 Center g1
+f2 Center g2
+f3 Center g3
+g1 Center h1
+g2 Center h2
+g3 Center h3
+h1 Center i1
+h2 Center i2
+h3 Center i3
+i1 Center j1
+i2 Center j2
+i3 Center j3
+"""
+
+
+evaluation: """
+b1 0.0
+b2 0.0
+b3 8.0
+c1 0.0
+c2 0.0
+c3 8.0
+d1 10.0
+d2 0.0
+d3 8.0
+e1 0.0
+e2 0.0
+e3 8.0
+f1 0.0
+f2 0.0
+f3 8.0
+g1 0.0
+g2 10.0
+g3 8.0
+h1 0.0
+h2 0.0
+h3 8.0
+i1 0.0
+i2 0.0
+i3 8.0
+j1 0.0
+j2 0.0
+j3 8.0
+"""
+
+
diff --git a/test_cases/q3/8-pacman-game.solution b/test_cases/q3/8-pacman-game.solution
new file mode 100644
index 0000000..ec0b0b8
--- /dev/null
+++ b/test_cases/q3/8-pacman-game.solution
@@ -0,0 +1,444 @@
+optimalActions: """
+[[["West", "East"], 39], [["West", "East"], 27]]
+[[["West"], 75], [["West"], 57]]
+[[["West"], 95], [["West"], 77]]
+[[["West", "North"], 72], [["West", "North"], 54]]
+[[["West"], 51], [["West"], 39]]
+[[["West", "North"], 76], [["West", "North"], 58]]
+[[["West"], 69], [["West"], 51]]
+[[["West"], 34], [["West"], 23]]
+[[["North"], 55], [["North"], 41]]
+[[["North"], 63], [["North"], 32]]
+[[["North"], 87], [["North"], 43]]
+[[["North"], 69], [["North"], 34]]
+[[["Stop", "East"], 116], [["East"], 56]]
+[[["East"], 110], [["East"], 52]]
+[[["West"], 28], [["West"], 17]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 18], [["East"], 12]]
+[[["North"], 28], [["North"], 18]]
+[[["North"], 47], [["North"], 30]]
+[[["West"], 35], [["West"], 23]]
+[[["East"], 28], [["East"], 15]]
+[[["North"], 74], [["North"], 48]]
+[[["East", "North"], 130], [["East", "North"], 87]]
+[[["East", "North"], 213], [["East", "North"], 158]]
+[[["North", "South"], 101], [["North", "South"], 73]]
+[[["West"], 48], [["West"], 36]]
+[[["West"], 60], [["West"], 45]]
+[[["West", "Stop"], 49], [["West"], 36]]
+[[["West", "Stop", "East"], 69], [["West", "East"], 49]]
+[[["West", "Stop", "East"], 61], [["West", "East"], 41]]
+[[["Stop", "East", "South"], 55], [["East", "South"], 37]]
+[[["Stop", "East", "South"], 28], [["East", "South"], 19]]
+[[["Stop", "East", "South"], 34], [["East", "South"], 23]]
+[[["Stop", "East", "South"], 55], [["East", "South"], 37]]
+[[["Stop", "East", "South"], 55], [["East", "South"], 37]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 81], [["East", "South"], 53]]
+[[["Stop", "East", "South"], 64], [["East", "South"], 43]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 81], [["East", "South"], 53]]
+[[["Stop", "East", "South"], 102], [["East", "South"], 67]]
+[[["Stop", "South"], 23], [["South"], 13]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 18], [["East"], 12]]
+[[["East", "North"], 28], [["East", "North"], 18]]
+[[["East"], 35], [["East"], 22]]
+[[["North"], 28], [["North"], 18]]
+[[["North"], 38], [["North"], 22]]
+[[["East"], 30], [["East"], 20]]
+[[["East"], 33], [["East"], 18]]
+[[["East"], 18], [["East"], 12]]
+[[["East"], 33], [["East"], 23]]
+[[["East"], 48], [["East"], 29]]
+[[["East"], 49], [["East"], 26]]
+[[["East"], 44], [["East"], 29]]
+[[["North", "South"], 75], [["North", "South"], 52]]
+[[["East", "North"], 113], [["East", "North"], 74]]
+[[["East", "North"], 89], [["East", "North"], 65]]
+[[["North", "South"], 173], [["North", "South"], 130]]
+[[["West", "East"], 54], [["West", "East"], 42]]
+[[["West", "Stop", "East"], 130], [["West", "East"], 87]]
+[[["Stop", "East", "South"], 58], [["East", "South"], 43]]
+[[["Stop", "East"], 110], [["South"], 82]]
+[[["East"], 71], [["East"], 45]]
+[[["West"], 66], [["West"], 42]]
+[[["South"], 70], [["South"], 48]]
+[[["South"], 48], [["South"], 37]]
+[[["South"], 179], [["South"], 104]]
+[[["South"], 68], [["South"], 41]]
+[[["West"], 25], [["West"], 18]]
+[[["West"], 41], [["West"], 29]]
+[[["West"], 14], [["West"], 10]]
+[[["West"], 20], [["West"], 14]]
+[[["West"], 13], [["West"], 9]]
+[[["West"], 13], [["West"], 9]]
+[[["West"], 16], [["West"], 12]]
+[[["West", "North"], 28], [["West", "North"], 20]]
+[[["West"], 30], [["West"], 23]]
+[[["West", "Stop", "East", "North"], 66], [["West", "East", "North"], 46]]
+[[["West", "Stop", "East"], 126], [["West", "East"], 89]]
+[[["West", "Stop", "East"], 30], [["West", "East"], 20]]
+[[["Stop", "East", "North"], 67], [["East", "North"], 45]]
+[[["Stop", "North"], 52], [["North"], 27]]
+[[["North"], 30], [["North"], 19]]
+[[["North"], 28], [["North"], 17]]
+[[["North"], 17], [["North"], 11]]
+[[["North"], 30], [["North"], 19]]
+[[["East"], 28], [["East"], 17]]
+[[["East"], 17], [["East"], 11]]
+[[["East"], 40], [["East"], 29]]
+[[["East", "South"], 79], [["East", "South"], 60]]
+[[["East", "South"], 90], [["East", "South"], 62]]
+[[["South"], 96], [["South"], 61]]
+[[["North", "South"], 195], [["North", "South"], 132]]
+[[["West"], 80], [["West"], 60]]
+[[["West", "Stop", "East", "South"], 83], [["West", "East", "South"], 61]]
+[[["West", "Stop", "East", "South"], 90], [["West", "East", "South"], 66]]
+[[["West", "Stop", "East"], 134], [["West", "East"], 95]]
+[[["West", "Stop", "East"], 82], [["West", "East"], 55]]
+[[["Stop", "East", "South"], 142], [["East", "South"], 95]]
+[[["Stop", "East", "South"], 95], [["East", "South"], 62]]
+[[["Stop", "East", "South"], 128], [["East", "South"], 86]]
+[[["Stop", "East", "South"], 82], [["East", "South"], 55]]
+[[["Stop", "East", "South"], 85], [["East", "South"], 57]]
+[[["Stop", "East", "South"], 182], [["East", "South"], 119]]
+[[["Stop", "East", "South"], 154], [["East", "South"], 103]]
+[[["Stop", "South"], 46], [["South"], 25]]
+[[["South"], 28], [["South"], 17]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["South"], 15], [["South"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 18], [["East"], 12]]
+[[["East", "North"], 28], [["East", "North"], 18]]
+[[["East"], 37], [["East"], 22]]
+[[["East", "North"], 34], [["East", "North"], 24]]
+[[["East"], 56], [["East"], 29]]
+[[["East"], 17], [["East"], 11]]
+[[["East"], 26], [["East"], 15]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 18], [["East"], 12]]
+[[["East"], 27], [["East"], 17]]
+[[["East"], 37], [["East"], 22]]
+[[["East", "North"], 37], [["East", "North"], 24]]
+[[["East"], 56], [["East"], 29]]
+[[["East"], 19], [["East"], 11]]
+[[["North"], 26], [["North"], 15]]
+[[["North"], 19], [["North"], 11]]
+[[["North"], 30], [["North"], 17]]
+[[["North"], 30], [["North"], 19]]
+[[["West"], 28], [["West"], 19]]
+[[["West"], 23], [["West"], 13]]
+[[["West", "Stop", "East"], 7], [["West", "East"], 3]]
+"""
+altDepthActions: """
+[["West", "East"], ["West", "East"], ["West", "East"], ["West", "East"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West", "North"], ["West", "North"], ["West", "North"], ["West", "North"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West", "North"], ["West", "North"], ["West", "North"], ["West", "North"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["Stop", "North"], ["North"]]
+[["East"], ["East"], ["Stop", "East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["West"], ["West"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["East", "North"], ["East", "North"], ["East", "North"], ["East", "North"]]
+[["East", "North"], ["East", "North"], ["East", "North"], ["East", "North"]]
+[["North", "South"], ["North", "South"], ["North"], ["North"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West", "Stop"], ["West"]]
+[["West"], ["West"], ["West", "Stop", "East", "South"], ["West", "East", "South"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "South"], ["South"], ["Stop", "South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East", "North"], ["East", "North"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["North", "South"], ["North", "South"], ["South"], ["South"]]
+[["East", "North"], ["East", "North"], ["East", "North"], ["East", "North"]]
+[["East", "North"], ["East", "North"], ["East", "North"], ["East", "North"]]
+[["North", "South"], ["North", "South"], ["North"], ["North"]]
+[["West", "East"], ["West", "East"], ["East"], ["East"]]
+[["West"], ["West"], ["East"], ["East"]]
+[["Stop", "East", "South"], ["East", "South"], ["East"], ["East"]]
+[["Stop", "East"], ["East"], ["Stop", "East"], ["South"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["West", "East"], ["West", "East"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West", "North"], ["West", "North"], ["West", "North"], ["West", "North"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West", "Stop", "East", "North"], ["West", "East", "North"], ["West", "Stop", "East", "North"], ["West", "East", "North"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "North"], ["East", "North"], ["Stop", "East", "North"], ["East", "North"]]
+[["Stop", "North"], ["North"], ["Stop", "North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East", "South"], ["East", "South"], ["East", "South"], ["East", "South"]]
+[["East", "South"], ["East", "South"], ["East", "South"], ["East", "South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["North", "South"], ["North", "South"], ["North", "South"], ["North", "South"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West", "Stop", "East", "South"], ["West", "East", "South"], ["West", "Stop", "East", "South"], ["West", "East", "South"]]
+[["West", "Stop", "East", "South"], ["West", "East", "South"], ["West", "Stop", "East", "South"], ["West", "East", "South"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"], ["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "South"], ["South"], ["Stop", "South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["South"], ["South"], ["South"], ["South"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East", "North"], ["East", "North"], ["East", "North"], ["East", "North"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East", "North"], ["East", "North"], ["East", "North"], ["East", "North"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East", "North"], ["East", "North"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["North"], ["North"], ["North"], ["North"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West"], ["West"], ["West"], ["West"]]
+[["West", "Stop", "East"], ["West", "East"], ["West", "Stop", "East"], ["West", "East"]]
+"""
+partialPlyBugActions: """
+[["West", "East"], ["West", "East"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West", "North"], ["West", "North"]]
+[["West"], ["West"]]
+[["West", "North"], ["West", "North"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["East"], ["East"]]
+[["Stop", "East"], ["East"]]
+[["West"], ["West"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["West"], ["West"]]
+[["East"], ["East"]]
+[["North"], ["North"]]
+[["East", "North"], ["East", "North"]]
+[["East", "North"], ["East", "North"]]
+[["North", "South"], ["North", "South"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West", "Stop"], ["West"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East", "North"], ["East", "North"]]
+[["East"], ["East"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["North", "South"], ["North", "South"]]
+[["East", "North"], ["East", "North"]]
+[["East", "North"], ["East", "North"]]
+[["North", "South"], ["North", "South"]]
+[["West", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East"], ["East"]]
+[["East"], ["East"]]
+[["West"], ["West"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West", "North"], ["West", "North"]]
+[["West"], ["West"]]
+[["West", "Stop", "East", "North"], ["West", "East", "North"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "North"], ["East", "North"]]
+[["Stop", "North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East", "South"], ["East", "South"]]
+[["East", "South"], ["East", "South"]]
+[["South"], ["South"]]
+[["North", "South"], ["North", "South"]]
+[["West"], ["West"]]
+[["West", "Stop", "East", "South"], ["West", "East", "South"]]
+[["West", "Stop", "East", "South"], ["West", "East", "South"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["West", "Stop", "East"], ["West", "East"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "East", "South"], ["East", "South"]]
+[["Stop", "South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["South"], ["South"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East", "North"], ["East", "North"]]
+[["East"], ["East"]]
+[["East", "North"], ["East", "North"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["East", "North"], ["East", "North"]]
+[["East"], ["East"]]
+[["East"], ["East"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["North"], ["North"]]
+[["West"], ["West"]]
+[["West"], ["West"]]
+[["West", "Stop", "East"], ["West", "East"]]
+"""
diff --git a/test_cases/q3/8-pacman-game.test b/test_cases/q3/8-pacman-game.test
new file mode 100644
index 0000000..56341ae
--- /dev/null
+++ b/test_cases/q3/8-pacman-game.test
@@ -0,0 +1,19 @@
+class: "PacmanGameTreeTest"
+alg: "AlphaBetaAgent"
+seed: "0"
+depth: "2"
+max_points: "4"
+
+# The following specifies the layout to be used
+layoutName: "smallClassic"
+layout: """
+%%%%%%%%%%%%%%%%%%%%
+%......%G G%......%
+%.%%...%% %%...%%.%
+%.%o.%........%.o%.%
+%.%%.%.%%%%%%.%.%%.%
+%........P.........%
+%%%%%%%%%%%%%%%%%%%%
+"""
+
+
diff --git a/test_cases/q3/CONFIG b/test_cases/q3/CONFIG
new file mode 100644
index 0000000..a5adc3f
--- /dev/null
+++ b/test_cases/q3/CONFIG
@@ -0,0 +1,2 @@
+max_points: "5"
+class: "PassAllTestsQuestion"