summaryrefslogtreecommitdiffstats
path: root/src/test_cases
diff options
context:
space:
mode:
Diffstat (limited to 'src/test_cases')
-rw-r--r--src/test_cases/CONFIG1
-rw-r--r--src/test_cases/extra/CONFIG2
-rw-r--r--src/test_cases/extra/grade-agent.test11
-rw-r--r--src/test_cases/q1/CONFIG2
-rw-r--r--src/test_cases/q1/grade-agent.solution2
-rw-r--r--src/test_cases/q1/grade-agent.test18
-rw-r--r--src/test_cases/q2/0-lecture-6-tree.solution3
-rw-r--r--src/test_cases/q2/0-lecture-6-tree.test50
-rw-r--r--src/test_cases/q2/0-small-tree.solution3
-rw-r--r--src/test_cases/q2/0-small-tree.test36
-rw-r--r--src/test_cases/q2/1-1-minmax.solution3
-rw-r--r--src/test_cases/q2/1-1-minmax.test47
-rw-r--r--src/test_cases/q2/1-2-minmax.solution3
-rw-r--r--src/test_cases/q2/1-2-minmax.test47
-rw-r--r--src/test_cases/q2/1-3-minmax.solution3
-rw-r--r--src/test_cases/q2/1-3-minmax.test47
-rw-r--r--src/test_cases/q2/1-4-minmax.solution3
-rw-r--r--src/test_cases/q2/1-4-minmax.test47
-rw-r--r--src/test_cases/q2/1-5-minmax.solution3
-rw-r--r--src/test_cases/q2/1-5-minmax.test75
-rw-r--r--src/test_cases/q2/1-6-minmax.solution3
-rw-r--r--src/test_cases/q2/1-6-minmax.test75
-rw-r--r--src/test_cases/q2/1-7-minmax.solution3
-rw-r--r--src/test_cases/q2/1-7-minmax.test75
-rw-r--r--src/test_cases/q2/1-8-minmax.solution3
-rw-r--r--src/test_cases/q2/1-8-minmax.test75
-rw-r--r--src/test_cases/q2/2-1a-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-1a-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-1b-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-1b-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-2a-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-2a-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-2b-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-2b-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-3a-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-3a-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-3b-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-3b-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-4a-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-4a-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-4b-vary-depth.solution3
-rw-r--r--src/test_cases/q2/2-4b-vary-depth.test52
-rw-r--r--src/test_cases/q2/2-one-ghost-3level.solution3
-rw-r--r--src/test_cases/q2/2-one-ghost-3level.test52
-rw-r--r--src/test_cases/q2/3-one-ghost-4level.solution3
-rw-r--r--src/test_cases/q2/3-one-ghost-4level.test79
-rw-r--r--src/test_cases/q2/4-two-ghosts-3level.solution3
-rw-r--r--src/test_cases/q2/4-two-ghosts-3level.test52
-rw-r--r--src/test_cases/q2/5-two-ghosts-4level.solution3
-rw-r--r--src/test_cases/q2/5-two-ghosts-4level.test79
-rw-r--r--src/test_cases/q2/6-tied-root.solution3
-rw-r--r--src/test_cases/q2/6-tied-root.test31
-rw-r--r--src/test_cases/q2/7-1a-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q2/7-1a-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q2/7-1b-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q2/7-1b-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q2/7-1c-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q2/7-1c-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q2/7-2a-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q2/7-2a-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q2/7-2b-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q2/7-2b-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q2/7-2c-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q2/7-2c-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q2/8-pacman-game.solution444
-rw-r--r--src/test_cases/q2/8-pacman-game.test19
-rw-r--r--src/test_cases/q2/CONFIG2
-rw-r--r--src/test_cases/q3/0-lecture-6-tree.solution3
-rw-r--r--src/test_cases/q3/0-lecture-6-tree.test50
-rw-r--r--src/test_cases/q3/0-small-tree.solution3
-rw-r--r--src/test_cases/q3/0-small-tree.test36
-rw-r--r--src/test_cases/q3/1-1-minmax.solution3
-rw-r--r--src/test_cases/q3/1-1-minmax.test47
-rw-r--r--src/test_cases/q3/1-2-minmax.solution3
-rw-r--r--src/test_cases/q3/1-2-minmax.test47
-rw-r--r--src/test_cases/q3/1-3-minmax.solution3
-rw-r--r--src/test_cases/q3/1-3-minmax.test47
-rw-r--r--src/test_cases/q3/1-4-minmax.solution3
-rw-r--r--src/test_cases/q3/1-4-minmax.test47
-rw-r--r--src/test_cases/q3/1-5-minmax.solution3
-rw-r--r--src/test_cases/q3/1-5-minmax.test75
-rw-r--r--src/test_cases/q3/1-6-minmax.solution3
-rw-r--r--src/test_cases/q3/1-6-minmax.test75
-rw-r--r--src/test_cases/q3/1-7-minmax.solution3
-rw-r--r--src/test_cases/q3/1-7-minmax.test75
-rw-r--r--src/test_cases/q3/1-8-minmax.solution3
-rw-r--r--src/test_cases/q3/1-8-minmax.test75
-rw-r--r--src/test_cases/q3/2-1a-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-1a-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-1b-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-1b-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-2a-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-2a-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-2b-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-2b-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-3a-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-3a-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-3b-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-3b-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-4a-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-4a-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-4b-vary-depth.solution3
-rw-r--r--src/test_cases/q3/2-4b-vary-depth.test52
-rw-r--r--src/test_cases/q3/2-one-ghost-3level.solution3
-rw-r--r--src/test_cases/q3/2-one-ghost-3level.test52
-rw-r--r--src/test_cases/q3/3-one-ghost-4level.solution3
-rw-r--r--src/test_cases/q3/3-one-ghost-4level.test79
-rw-r--r--src/test_cases/q3/4-two-ghosts-3level.solution3
-rw-r--r--src/test_cases/q3/4-two-ghosts-3level.test52
-rw-r--r--src/test_cases/q3/5-two-ghosts-4level.solution3
-rw-r--r--src/test_cases/q3/5-two-ghosts-4level.test79
-rw-r--r--src/test_cases/q3/6-tied-root.solution3
-rw-r--r--src/test_cases/q3/6-tied-root.test31
-rw-r--r--src/test_cases/q3/7-1a-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q3/7-1a-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q3/7-1b-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q3/7-1b-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q3/7-1c-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q3/7-1c-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q3/7-2a-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q3/7-2a-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q3/7-2b-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q3/7-2b-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q3/7-2c-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q3/7-2c-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q3/8-pacman-game.solution444
-rw-r--r--src/test_cases/q3/8-pacman-game.test19
-rw-r--r--src/test_cases/q3/CONFIG2
-rw-r--r--src/test_cases/q4/0-expectimax1.solution3
-rw-r--r--src/test_cases/q4/0-expectimax1.test48
-rw-r--r--src/test_cases/q4/1-expectimax2.solution3
-rw-r--r--src/test_cases/q4/1-expectimax2.test48
-rw-r--r--src/test_cases/q4/2-one-ghost-3level.solution3
-rw-r--r--src/test_cases/q4/2-one-ghost-3level.test52
-rw-r--r--src/test_cases/q4/3-one-ghost-4level.solution3
-rw-r--r--src/test_cases/q4/3-one-ghost-4level.test79
-rw-r--r--src/test_cases/q4/4-two-ghosts-3level.solution3
-rw-r--r--src/test_cases/q4/4-two-ghosts-3level.test52
-rw-r--r--src/test_cases/q4/5-two-ghosts-4level.solution3
-rw-r--r--src/test_cases/q4/5-two-ghosts-4level.test79
-rw-r--r--src/test_cases/q4/6-1a-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q4/6-1a-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q4/6-1b-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q4/6-1b-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q4/6-1c-check-depth-one-ghost.solution3
-rw-r--r--src/test_cases/q4/6-1c-check-depth-one-ghost.test83
-rw-r--r--src/test_cases/q4/6-2a-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q4/6-2a-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q4/6-2b-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q4/6-2b-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q4/6-2c-check-depth-two-ghosts.solution3
-rw-r--r--src/test_cases/q4/6-2c-check-depth-two-ghosts.test110
-rw-r--r--src/test_cases/q4/7-pacman-game.solution444
-rw-r--r--src/test_cases/q4/7-pacman-game.test19
-rw-r--r--src/test_cases/q4/CONFIG2
-rw-r--r--src/test_cases/q5/CONFIG2
-rw-r--r--src/test_cases/q5/grade-agent.solution2
-rw-r--r--src/test_cases/q5/grade-agent.test18
158 files changed, 6324 insertions, 0 deletions
diff --git a/src/test_cases/CONFIG b/src/test_cases/CONFIG
new file mode 100644
index 0000000..e01f27b
--- /dev/null
+++ b/src/test_cases/CONFIG
@@ -0,0 +1 @@
+order: "q1 q2 q3 q4 q5"
diff --git a/src/test_cases/extra/CONFIG b/src/test_cases/extra/CONFIG
new file mode 100644
index 0000000..3a646dd
--- /dev/null
+++ b/src/test_cases/extra/CONFIG
@@ -0,0 +1,2 @@
+max_points: "0"
+class: "PartialCreditQuestion"
diff --git a/src/test_cases/extra/grade-agent.test b/src/test_cases/extra/grade-agent.test
new file mode 100644
index 0000000..5da84c6
--- /dev/null
+++ b/src/test_cases/extra/grade-agent.test
@@ -0,0 +1,11 @@
+class: "EvalAgentTest"
+
+agentName: "ContestAgent"
+layoutName: "contestClassic"
+maxTime: "180"
+numGames: "5"
+
+scoreThresholds: "2500 2900"
+
+randomSeed: "0"
+ghosts: "[DirectionalGhost(1), DirectionalGhost(2), DirectionalGhost(3)]"
diff --git a/src/test_cases/q1/CONFIG b/src/test_cases/q1/CONFIG
new file mode 100644
index 0000000..426bfe9
--- /dev/null
+++ b/src/test_cases/q1/CONFIG
@@ -0,0 +1,2 @@
+max_points: "4"
+class: "PartialCreditQuestion"
diff --git a/src/test_cases/q1/grade-agent.solution b/src/test_cases/q1/grade-agent.solution
new file mode 100644
index 0000000..278af4f
--- /dev/null
+++ b/src/test_cases/q1/grade-agent.solution
@@ -0,0 +1,2 @@
+# This is the solution file for test_cases/q1/grade-agent.test.
+# File intentionally blank.
diff --git a/src/test_cases/q1/grade-agent.test b/src/test_cases/q1/grade-agent.test
new file mode 100644
index 0000000..3a70660
--- /dev/null
+++ b/src/test_cases/q1/grade-agent.test
@@ -0,0 +1,18 @@
+class: "EvalAgentTest"
+
+agentName: "ReflexAgent"
+layoutName: "openClassic"
+maxTime: "120"
+numGames: "10"
+
+
+nonTimeoutMinimum: "10"
+
+scoreThresholds: "500 1000"
+
+winsMinimum: "1"
+winsThresholds: "5 10"
+
+
+randomSeed: "0"
+ghosts: "[RandomGhost(1)]"
diff --git a/src/test_cases/q2/0-lecture-6-tree.solution b/src/test_cases/q2/0-lecture-6-tree.solution
new file mode 100644
index 0000000..3c6a74d
--- /dev/null
+++ b/src/test_cases/q2/0-lecture-6-tree.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/0-lecture-6-tree.test.
+action: "Center"
+generated: "A B C D E F G H I max min1 min2 min3"
diff --git a/src/test_cases/q2/0-lecture-6-tree.test b/src/test_cases/q2/0-lecture-6-tree.test
new file mode 100644
index 0000000..debf815
--- /dev/null
+++ b/src/test_cases/q2/0-lecture-6-tree.test
@@ -0,0 +1,50 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/0-small-tree.solution b/src/test_cases/q2/0-small-tree.solution
new file mode 100644
index 0000000..f381f9a
--- /dev/null
+++ b/src/test_cases/q2/0-small-tree.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/0-small-tree.test.
+action: "pacLeft"
+generated: "A B C D deeper minLeft minRight root"
diff --git a/src/test_cases/q2/0-small-tree.test b/src/test_cases/q2/0-small-tree.test
new file mode 100644
index 0000000..5eaa65c
--- /dev/null
+++ b/src/test_cases/q2/0-small-tree.test
@@ -0,0 +1,36 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-1-minmax.solution b/src/test_cases/q2/1-1-minmax.solution
new file mode 100644
index 0000000..3ac7510
--- /dev/null
+++ b/src/test_cases/q2/1-1-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-1-minmax.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/src/test_cases/q2/1-1-minmax.test b/src/test_cases/q2/1-1-minmax.test
new file mode 100644
index 0000000..addd65b
--- /dev/null
+++ b/src/test_cases/q2/1-1-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-2-minmax.solution b/src/test_cases/q2/1-2-minmax.solution
new file mode 100644
index 0000000..e40e3de
--- /dev/null
+++ b/src/test_cases/q2/1-2-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-2-minmax.test.
+action: "Right"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/src/test_cases/q2/1-2-minmax.test b/src/test_cases/q2/1-2-minmax.test
new file mode 100644
index 0000000..44e0a77
--- /dev/null
+++ b/src/test_cases/q2/1-2-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-3-minmax.solution b/src/test_cases/q2/1-3-minmax.solution
new file mode 100644
index 0000000..513961c
--- /dev/null
+++ b/src/test_cases/q2/1-3-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-3-minmax.test.
+action: "Left"
+generated: "a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/src/test_cases/q2/1-3-minmax.test b/src/test_cases/q2/1-3-minmax.test
new file mode 100644
index 0000000..5f4b12d
--- /dev/null
+++ b/src/test_cases/q2/1-3-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-4-minmax.solution b/src/test_cases/q2/1-4-minmax.solution
new file mode 100644
index 0000000..1ae4c0f
--- /dev/null
+++ b/src/test_cases/q2/1-4-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-4-minmax.test.
+action: "Right"
+generated: "a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/src/test_cases/q2/1-4-minmax.test b/src/test_cases/q2/1-4-minmax.test
new file mode 100644
index 0000000..445fe0f
--- /dev/null
+++ b/src/test_cases/q2/1-4-minmax.test
@@ -0,0 +1,47 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-5-minmax.solution b/src/test_cases/q2/1-5-minmax.solution
new file mode 100644
index 0000000..0553ca7
--- /dev/null
+++ b/src/test_cases/q2/1-5-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-5-minmax.test.
+action: "Right"
+generated: "A B C D E F G H Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/src/test_cases/q2/1-5-minmax.test b/src/test_cases/q2/1-5-minmax.test
new file mode 100644
index 0000000..5ce2ba9
--- /dev/null
+++ b/src/test_cases/q2/1-5-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-6-minmax.solution b/src/test_cases/q2/1-6-minmax.solution
new file mode 100644
index 0000000..f25e068
--- /dev/null
+++ b/src/test_cases/q2/1-6-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-6-minmax.test.
+action: "Left"
+generated: "A B C D E F G H Z a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/src/test_cases/q2/1-6-minmax.test b/src/test_cases/q2/1-6-minmax.test
new file mode 100644
index 0000000..44b166f
--- /dev/null
+++ b/src/test_cases/q2/1-6-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-7-minmax.solution b/src/test_cases/q2/1-7-minmax.solution
new file mode 100644
index 0000000..fd801a8
--- /dev/null
+++ b/src/test_cases/q2/1-7-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-7-minmax.test.
+action: "Left"
+generated: "I J K L M N O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/src/test_cases/q2/1-7-minmax.test b/src/test_cases/q2/1-7-minmax.test
new file mode 100644
index 0000000..534cb39
--- /dev/null
+++ b/src/test_cases/q2/1-7-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/1-8-minmax.solution b/src/test_cases/q2/1-8-minmax.solution
new file mode 100644
index 0000000..80c7ebe
--- /dev/null
+++ b/src/test_cases/q2/1-8-minmax.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/1-8-minmax.test.
+action: "Right"
+generated: "I J K L M N O P Z a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/src/test_cases/q2/1-8-minmax.test b/src/test_cases/q2/1-8-minmax.test
new file mode 100644
index 0000000..7d3ead9
--- /dev/null
+++ b/src/test_cases/q2/1-8-minmax.test
@@ -0,0 +1,75 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-1a-vary-depth.solution b/src/test_cases/q2/2-1a-vary-depth.solution
new file mode 100644
index 0000000..9dd1708
--- /dev/null
+++ b/src/test_cases/q2/2-1a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-1a-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx"
diff --git a/src/test_cases/q2/2-1a-vary-depth.test b/src/test_cases/q2/2-1a-vary-depth.test
new file mode 100644
index 0000000..321b1ce
--- /dev/null
+++ b/src/test_cases/q2/2-1a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-1b-vary-depth.solution b/src/test_cases/q2/2-1b-vary-depth.solution
new file mode 100644
index 0000000..a824e44
--- /dev/null
+++ b/src/test_cases/q2/2-1b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-1b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/src/test_cases/q2/2-1b-vary-depth.test b/src/test_cases/q2/2-1b-vary-depth.test
new file mode 100644
index 0000000..d0d656d
--- /dev/null
+++ b/src/test_cases/q2/2-1b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-2a-vary-depth.solution b/src/test_cases/q2/2-2a-vary-depth.solution
new file mode 100644
index 0000000..b4b0e98
--- /dev/null
+++ b/src/test_cases/q2/2-2a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-2a-vary-depth.test.
+action: "Right"
+generated: "a b1 b2 c1 c2 cx"
diff --git a/src/test_cases/q2/2-2a-vary-depth.test b/src/test_cases/q2/2-2a-vary-depth.test
new file mode 100644
index 0000000..204877f
--- /dev/null
+++ b/src/test_cases/q2/2-2a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-2b-vary-depth.solution b/src/test_cases/q2/2-2b-vary-depth.solution
new file mode 100644
index 0000000..94e2089
--- /dev/null
+++ b/src/test_cases/q2/2-2b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-2b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 cx d1 d2 d3 d4 dx"
diff --git a/src/test_cases/q2/2-2b-vary-depth.test b/src/test_cases/q2/2-2b-vary-depth.test
new file mode 100644
index 0000000..1e4ef41
--- /dev/null
+++ b/src/test_cases/q2/2-2b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-3a-vary-depth.solution b/src/test_cases/q2/2-3a-vary-depth.solution
new file mode 100644
index 0000000..1bab661
--- /dev/null
+++ b/src/test_cases/q2/2-3a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-3a-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c3 c4 cx"
diff --git a/src/test_cases/q2/2-3a-vary-depth.test b/src/test_cases/q2/2-3a-vary-depth.test
new file mode 100644
index 0000000..e083759
--- /dev/null
+++ b/src/test_cases/q2/2-3a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-3b-vary-depth.solution b/src/test_cases/q2/2-3b-vary-depth.solution
new file mode 100644
index 0000000..fb389ec
--- /dev/null
+++ b/src/test_cases/q2/2-3b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-3b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/src/test_cases/q2/2-3b-vary-depth.test b/src/test_cases/q2/2-3b-vary-depth.test
new file mode 100644
index 0000000..cbe88b5
--- /dev/null
+++ b/src/test_cases/q2/2-3b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-4a-vary-depth.solution b/src/test_cases/q2/2-4a-vary-depth.solution
new file mode 100644
index 0000000..815147d
--- /dev/null
+++ b/src/test_cases/q2/2-4a-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-4a-vary-depth.test.
+action: "Right"
+generated: "a b1 b2 c3 c4 cx"
diff --git a/src/test_cases/q2/2-4a-vary-depth.test b/src/test_cases/q2/2-4a-vary-depth.test
new file mode 100644
index 0000000..e519969
--- /dev/null
+++ b/src/test_cases/q2/2-4a-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-4b-vary-depth.solution b/src/test_cases/q2/2-4b-vary-depth.solution
new file mode 100644
index 0000000..3b12519
--- /dev/null
+++ b/src/test_cases/q2/2-4b-vary-depth.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-4b-vary-depth.test.
+action: "Left"
+generated: "a b1 b2 c3 c4 cx d5 d6 d7 d8 dx"
diff --git a/src/test_cases/q2/2-4b-vary-depth.test b/src/test_cases/q2/2-4b-vary-depth.test
new file mode 100644
index 0000000..a80e82d
--- /dev/null
+++ b/src/test_cases/q2/2-4b-vary-depth.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/2-one-ghost-3level.solution b/src/test_cases/q2/2-one-ghost-3level.solution
new file mode 100644
index 0000000..f7b10fb
--- /dev/null
+++ b/src/test_cases/q2/2-one-ghost-3level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/2-one-ghost-3level.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q2/2-one-ghost-3level.test b/src/test_cases/q2/2-one-ghost-3level.test
new file mode 100644
index 0000000..90d4685
--- /dev/null
+++ b/src/test_cases/q2/2-one-ghost-3level.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/3-one-ghost-4level.solution b/src/test_cases/q2/3-one-ghost-4level.solution
new file mode 100644
index 0000000..5fcb2c5
--- /dev/null
+++ b/src/test_cases/q2/3-one-ghost-4level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/3-one-ghost-4level.test.
+action: "Left"
+generated: "A B C D E F G H I J K L M N O P a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q2/3-one-ghost-4level.test b/src/test_cases/q2/3-one-ghost-4level.test
new file mode 100644
index 0000000..6868528
--- /dev/null
+++ b/src/test_cases/q2/3-one-ghost-4level.test
@@ -0,0 +1,79 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/4-two-ghosts-3level.solution b/src/test_cases/q2/4-two-ghosts-3level.solution
new file mode 100644
index 0000000..36a2326
--- /dev/null
+++ b/src/test_cases/q2/4-two-ghosts-3level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/4-two-ghosts-3level.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q2/4-two-ghosts-3level.test b/src/test_cases/q2/4-two-ghosts-3level.test
new file mode 100644
index 0000000..a2c5bad
--- /dev/null
+++ b/src/test_cases/q2/4-two-ghosts-3level.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/5-two-ghosts-4level.solution b/src/test_cases/q2/5-two-ghosts-4level.solution
new file mode 100644
index 0000000..3164ec0
--- /dev/null
+++ b/src/test_cases/q2/5-two-ghosts-4level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/5-two-ghosts-4level.test.
+action: "Left"
+generated: "A B C D E F G H I J K L M N O P a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q2/5-two-ghosts-4level.test b/src/test_cases/q2/5-two-ghosts-4level.test
new file mode 100644
index 0000000..9eeb228
--- /dev/null
+++ b/src/test_cases/q2/5-two-ghosts-4level.test
@@ -0,0 +1,79 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/6-tied-root.solution b/src/test_cases/q2/6-tied-root.solution
new file mode 100644
index 0000000..61918b0
--- /dev/null
+++ b/src/test_cases/q2/6-tied-root.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/6-tied-root.test.
+action: "Left"
+generated: "A B C max min1 min2"
diff --git a/src/test_cases/q2/6-tied-root.test b/src/test_cases/q2/6-tied-root.test
new file mode 100644
index 0000000..98cc012
--- /dev/null
+++ b/src/test_cases/q2/6-tied-root.test
@@ -0,0 +1,31 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/7-1a-check-depth-one-ghost.solution b/src/test_cases/q2/7-1a-check-depth-one-ghost.solution
new file mode 100644
index 0000000..0b7f01b
--- /dev/null
+++ b/src/test_cases/q2/7-1a-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/7-1a-check-depth-one-ghost.test.
+action: "Left"
+generated: "a b1 b2 b3 c1 c2 c3"
diff --git a/src/test_cases/q2/7-1a-check-depth-one-ghost.test b/src/test_cases/q2/7-1a-check-depth-one-ghost.test
new file mode 100644
index 0000000..077effc
--- /dev/null
+++ b/src/test_cases/q2/7-1a-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/7-1b-check-depth-one-ghost.solution b/src/test_cases/q2/7-1b-check-depth-one-ghost.solution
new file mode 100644
index 0000000..e7e3c6f
--- /dev/null
+++ b/src/test_cases/q2/7-1b-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/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/src/test_cases/q2/7-1b-check-depth-one-ghost.test b/src/test_cases/q2/7-1b-check-depth-one-ghost.test
new file mode 100644
index 0000000..53cefd4
--- /dev/null
+++ b/src/test_cases/q2/7-1b-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/7-1c-check-depth-one-ghost.solution b/src/test_cases/q2/7-1c-check-depth-one-ghost.solution
new file mode 100644
index 0000000..188854d
--- /dev/null
+++ b/src/test_cases/q2/7-1c-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/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/src/test_cases/q2/7-1c-check-depth-one-ghost.test b/src/test_cases/q2/7-1c-check-depth-one-ghost.test
new file mode 100644
index 0000000..51a5c9a
--- /dev/null
+++ b/src/test_cases/q2/7-1c-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/7-2a-check-depth-two-ghosts.solution b/src/test_cases/q2/7-2a-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..649825a
--- /dev/null
+++ b/src/test_cases/q2/7-2a-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/7-2a-check-depth-two-ghosts.test.
+action: "Left"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3"
diff --git a/src/test_cases/q2/7-2a-check-depth-two-ghosts.test b/src/test_cases/q2/7-2a-check-depth-two-ghosts.test
new file mode 100644
index 0000000..c8fc743
--- /dev/null
+++ b/src/test_cases/q2/7-2a-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/7-2b-check-depth-two-ghosts.solution b/src/test_cases/q2/7-2b-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..440eaf8
--- /dev/null
+++ b/src/test_cases/q2/7-2b-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/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/src/test_cases/q2/7-2b-check-depth-two-ghosts.test b/src/test_cases/q2/7-2b-check-depth-two-ghosts.test
new file mode 100644
index 0000000..2dff6d0
--- /dev/null
+++ b/src/test_cases/q2/7-2b-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/7-2c-check-depth-two-ghosts.solution b/src/test_cases/q2/7-2c-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..fb146d8
--- /dev/null
+++ b/src/test_cases/q2/7-2c-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q2/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/src/test_cases/q2/7-2c-check-depth-two-ghosts.test b/src/test_cases/q2/7-2c-check-depth-two-ghosts.test
new file mode 100644
index 0000000..2ef9f15
--- /dev/null
+++ b/src/test_cases/q2/7-2c-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/8-pacman-game.solution b/src/test_cases/q2/8-pacman-game.solution
new file mode 100644
index 0000000..4ee19d8
--- /dev/null
+++ b/src/test_cases/q2/8-pacman-game.solution
@@ -0,0 +1,444 @@
+optimalActions: """
+[[["West", "East"], 59], [["West", "East"], 35]]
+[[["West"], 190], [["West"], 127]]
+[[["West"], 190], [["West"], 135]]
+[[["West", "North"], 120], [["West", "North"], 82]]
+[[["West"], 77], [["West"], 57]]
+[[["West", "North"], 143], [["West", "North"], 97]]
+[[["West"], 155], [["West"], 110]]
+[[["West"], 40], [["West"], 27]]
+[[["North"], 64], [["North"], 43]]
+[[["North"], 85], [["North"], 57]]
+[[["North"], 106], [["North"], 71]]
+[[["North"], 97], [["North"], 65]]
+[[["Stop", "East"], 154], [["East"], 103]]
+[[["East"], 156], [["East"], 101]]
+[[["West"], 30], [["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"], 29], [["North"], 18]]
+[[["North"], 50], [["North"], 31]]
+[[["West"], 55], [["West"], 36]]
+[[["East"], 29], [["East"], 16]]
+[[["North"], 89], [["North"], 61]]
+[[["East", "North"], 161], [["East", "North"], 121]]
+[[["East", "North"], 221], [["East", "North"], 166]]
+[[["North", "South"], 105], [["North", "South"], 77]]
+[[["West"], 69], [["West"], 51]]
+[[["West"], 94], [["West"], 69]]
+[[["West", "Stop"], 57], [["West"], 42]]
+[[["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"], 85], [["East", "South"], 57]]
+[[["Stop", "East", "South"], 64], [["East", "South"], 43]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 85], [["East", "South"], 57]]
+[[["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"], 29], [["East", "North"], 18]]
+[[["East"], 38], [["East"], 22]]
+[[["North"], 29], [["North"], 18]]
+[[["North"], 38], [["North"], 22]]
+[[["East"], 33], [["East"], 22]]
+[[["East"], 37], [["East"], 18]]
+[[["East"], 18], [["East"], 12]]
+[[["East"], 37], [["East"], 26]]
+[[["East"], 69], [["East"], 41]]
+[[["East"], 56], [["East"], 26]]
+[[["East"], 44], [["East"], 29]]
+[[["North", "South"], 83], [["North", "South"], 52]]
+[[["East", "North"], 121], [["East", "North"], 74]]
+[[["East", "North"], 97], [["East", "North"], 73]]
+[[["North", "South"], 173], [["North", "South"], 130]]
+[[["West", "East"], 90], [["West", "East"], 66]]
+[[["West", "Stop", "East"], 161], [["West", "East"], 118]]
+[[["Stop", "East", "South"], 58], [["East", "South"], 43]]
+[[["Stop", "East"], 120], [["South"], 85]]
+[[["East"], 78], [["East"], 45]]
+[[["West"], 77], [["West"], 42]]
+[[["South"], 83], [["South"], 48]]
+[[["South"], 49], [["South"], 37]]
+[[["South"], 185], [["South"], 104]]
+[[["South"], 68], [["South"], 41]]
+[[["West"], 30], [["West"], 18]]
+[[["West"], 56], [["West"], 29]]
+[[["West"], 14], [["West"], 10]]
+[[["West"], 20], [["West"], 14]]
+[[["West"], 13], [["West"], 9]]
+[[["West"], 13], [["West"], 9]]
+[[["West"], 16], [["West"], 12]]
+[[["West", "North"], 30], [["West", "North"], 20]]
+[[["West"], 38], [["West"], 23]]
+[[["West", "Stop", "East", "North"], 70], [["West", "East", "North"], 46]]
+[[["West", "Stop", "East"], 128], [["West", "East"], 89]]
+[[["West", "Stop", "East"], 31], [["West", "East"], 20]]
+[[["Stop", "East", "North"], 69], [["East", "North"], 45]]
+[[["Stop", "North"], 58], [["North"], 31]]
+[[["North"], 34], [["North"], 19]]
+[[["North"], 30], [["North"], 17]]
+[[["North"], 19], [["North"], 11]]
+[[["North"], 34], [["North"], 19]]
+[[["East"], 30], [["East"], 17]]
+[[["East"], 19], [["East"], 11]]
+[[["East"], 44], [["East"], 29]]
+[[["East", "South"], 87], [["East", "South"], 60]]
+[[["East", "South"], 108], [["East", "South"], 62]]
+[[["South"], 120], [["South"], 61]]
+[[["North", "South"], 209], [["North", "South"], 132]]
+[[["West"], 108], [["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"], 98], [["East", "South"], 65]]
+[[["Stop", "East", "South"], 128], [["East", "South"], 86]]
+[[["Stop", "East", "South"], 82], [["East", "South"], 55]]
+[[["Stop", "East", "South"], 85], [["East", "South"], 57]]
+[[["Stop", "East", "South"], 190], [["East", "South"], 127]]
+[[["Stop", "East", "South"], 158], [["East", "South"], 103]]
+[[["Stop", "South"], 50], [["South"], 27]]
+[[["South"], 30], [["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"], 29], [["East", "North"], 18]]
+[[["East"], 37], [["East"], 22]]
+[[["East", "North"], 41], [["East", "North"], 24]]
+[[["East"], 59], [["East"], 29]]
+[[["East"], 19], [["East"], 11]]
+[[["East"], 26], [["East"], 15]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 18], [["East"], 12]]
+[[["East"], 29], [["East"], 18]]
+[[["East"], 37], [["East"], 22]]
+[[["East", "North"], 41], [["East", "North"], 24]]
+[[["East"], 59], [["East"], 29]]
+[[["East"], 19], [["East"], 11]]
+[[["North"], 26], [["North"], 15]]
+[[["North"], 19], [["North"], 11]]
+[[["North"], 30], [["North"], 17]]
+[[["North"], 34], [["North"], 19]]
+[[["West"], 34], [["West"], 19]]
+[[["West"], 25], [["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/src/test_cases/q2/8-pacman-game.test b/src/test_cases/q2/8-pacman-game.test
new file mode 100644
index 0000000..be7396d
--- /dev/null
+++ b/src/test_cases/q2/8-pacman-game.test
@@ -0,0 +1,19 @@
+class: "PacmanGameTreeTest"
+alg: "MinimaxAgent"
+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/src/test_cases/q2/CONFIG b/src/test_cases/q2/CONFIG
new file mode 100644
index 0000000..a5adc3f
--- /dev/null
+++ b/src/test_cases/q2/CONFIG
@@ -0,0 +1,2 @@
+max_points: "5"
+class: "PassAllTestsQuestion"
diff --git a/src/test_cases/q3/0-lecture-6-tree.solution b/src/test_cases/q3/0-lecture-6-tree.solution
new file mode 100644
index 0000000..c4a91ad
--- /dev/null
+++ b/src/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/src/test_cases/q3/0-lecture-6-tree.test b/src/test_cases/q3/0-lecture-6-tree.test
new file mode 100644
index 0000000..cbc61fe
--- /dev/null
+++ b/src/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/src/test_cases/q3/0-small-tree.solution b/src/test_cases/q3/0-small-tree.solution
new file mode 100644
index 0000000..e940986
--- /dev/null
+++ b/src/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/src/test_cases/q3/0-small-tree.test b/src/test_cases/q3/0-small-tree.test
new file mode 100644
index 0000000..a9829d0
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-1-minmax.solution b/src/test_cases/q3/1-1-minmax.solution
new file mode 100644
index 0000000..2834b29
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-1-minmax.test b/src/test_cases/q3/1-1-minmax.test
new file mode 100644
index 0000000..c601316
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-2-minmax.solution b/src/test_cases/q3/1-2-minmax.solution
new file mode 100644
index 0000000..8c17bcf
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-2-minmax.test b/src/test_cases/q3/1-2-minmax.test
new file mode 100644
index 0000000..d42a467
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-3-minmax.solution b/src/test_cases/q3/1-3-minmax.solution
new file mode 100644
index 0000000..827cdbd
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-3-minmax.test b/src/test_cases/q3/1-3-minmax.test
new file mode 100644
index 0000000..0fc2226
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-4-minmax.solution b/src/test_cases/q3/1-4-minmax.solution
new file mode 100644
index 0000000..f5570d1
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-4-minmax.test b/src/test_cases/q3/1-4-minmax.test
new file mode 100644
index 0000000..d8d02e2
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-5-minmax.solution b/src/test_cases/q3/1-5-minmax.solution
new file mode 100644
index 0000000..06cebde
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-5-minmax.test b/src/test_cases/q3/1-5-minmax.test
new file mode 100644
index 0000000..2d57290
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-6-minmax.solution b/src/test_cases/q3/1-6-minmax.solution
new file mode 100644
index 0000000..1ced2ca
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-6-minmax.test b/src/test_cases/q3/1-6-minmax.test
new file mode 100644
index 0000000..3360e93
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-7-minmax.solution b/src/test_cases/q3/1-7-minmax.solution
new file mode 100644
index 0000000..74e2da0
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-7-minmax.test b/src/test_cases/q3/1-7-minmax.test
new file mode 100644
index 0000000..207381d
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-8-minmax.solution b/src/test_cases/q3/1-8-minmax.solution
new file mode 100644
index 0000000..bf426b8
--- /dev/null
+++ b/src/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/src/test_cases/q3/1-8-minmax.test b/src/test_cases/q3/1-8-minmax.test
new file mode 100644
index 0000000..2272b30
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-1a-vary-depth.solution b/src/test_cases/q3/2-1a-vary-depth.solution
new file mode 100644
index 0000000..59d892c
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-1a-vary-depth.test b/src/test_cases/q3/2-1a-vary-depth.test
new file mode 100644
index 0000000..f8f9431
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-1b-vary-depth.solution b/src/test_cases/q3/2-1b-vary-depth.solution
new file mode 100644
index 0000000..a0f232c
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-1b-vary-depth.test b/src/test_cases/q3/2-1b-vary-depth.test
new file mode 100644
index 0000000..1b161af
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-2a-vary-depth.solution b/src/test_cases/q3/2-2a-vary-depth.solution
new file mode 100644
index 0000000..6e8d7fd
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-2a-vary-depth.test b/src/test_cases/q3/2-2a-vary-depth.test
new file mode 100644
index 0000000..b436d21
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-2b-vary-depth.solution b/src/test_cases/q3/2-2b-vary-depth.solution
new file mode 100644
index 0000000..f508aef
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-2b-vary-depth.test b/src/test_cases/q3/2-2b-vary-depth.test
new file mode 100644
index 0000000..c0540a3
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-3a-vary-depth.solution b/src/test_cases/q3/2-3a-vary-depth.solution
new file mode 100644
index 0000000..d805b84
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-3a-vary-depth.test b/src/test_cases/q3/2-3a-vary-depth.test
new file mode 100644
index 0000000..853a8d3
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-3b-vary-depth.solution b/src/test_cases/q3/2-3b-vary-depth.solution
new file mode 100644
index 0000000..32a70c6
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-3b-vary-depth.test b/src/test_cases/q3/2-3b-vary-depth.test
new file mode 100644
index 0000000..2892005
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-4a-vary-depth.solution b/src/test_cases/q3/2-4a-vary-depth.solution
new file mode 100644
index 0000000..eafdb62
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-4a-vary-depth.test b/src/test_cases/q3/2-4a-vary-depth.test
new file mode 100644
index 0000000..73d681b
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-4b-vary-depth.solution b/src/test_cases/q3/2-4b-vary-depth.solution
new file mode 100644
index 0000000..820398a
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-4b-vary-depth.test b/src/test_cases/q3/2-4b-vary-depth.test
new file mode 100644
index 0000000..a7aca5f
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-one-ghost-3level.solution b/src/test_cases/q3/2-one-ghost-3level.solution
new file mode 100644
index 0000000..b22f76f
--- /dev/null
+++ b/src/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/src/test_cases/q3/2-one-ghost-3level.test b/src/test_cases/q3/2-one-ghost-3level.test
new file mode 100644
index 0000000..2ec19b4
--- /dev/null
+++ b/src/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/src/test_cases/q3/3-one-ghost-4level.solution b/src/test_cases/q3/3-one-ghost-4level.solution
new file mode 100644
index 0000000..b6a9a0f
--- /dev/null
+++ b/src/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/src/test_cases/q3/3-one-ghost-4level.test b/src/test_cases/q3/3-one-ghost-4level.test
new file mode 100644
index 0000000..cfa33db
--- /dev/null
+++ b/src/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/src/test_cases/q3/4-two-ghosts-3level.solution b/src/test_cases/q3/4-two-ghosts-3level.solution
new file mode 100644
index 0000000..12e9520
--- /dev/null
+++ b/src/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/src/test_cases/q3/4-two-ghosts-3level.test b/src/test_cases/q3/4-two-ghosts-3level.test
new file mode 100644
index 0000000..fd3ac91
--- /dev/null
+++ b/src/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/src/test_cases/q3/5-two-ghosts-4level.solution b/src/test_cases/q3/5-two-ghosts-4level.solution
new file mode 100644
index 0000000..89c534c
--- /dev/null
+++ b/src/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/src/test_cases/q3/5-two-ghosts-4level.test b/src/test_cases/q3/5-two-ghosts-4level.test
new file mode 100644
index 0000000..ce431fc
--- /dev/null
+++ b/src/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/src/test_cases/q3/6-tied-root.solution b/src/test_cases/q3/6-tied-root.solution
new file mode 100644
index 0000000..93ece27
--- /dev/null
+++ b/src/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/src/test_cases/q3/6-tied-root.test b/src/test_cases/q3/6-tied-root.test
new file mode 100644
index 0000000..b43f4d9
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-1a-check-depth-one-ghost.solution b/src/test_cases/q3/7-1a-check-depth-one-ghost.solution
new file mode 100644
index 0000000..a3a74c4
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-1a-check-depth-one-ghost.test b/src/test_cases/q3/7-1a-check-depth-one-ghost.test
new file mode 100644
index 0000000..0230cbb
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-1b-check-depth-one-ghost.solution b/src/test_cases/q3/7-1b-check-depth-one-ghost.solution
new file mode 100644
index 0000000..8dad3c7
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-1b-check-depth-one-ghost.test b/src/test_cases/q3/7-1b-check-depth-one-ghost.test
new file mode 100644
index 0000000..7e0ced7
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-1c-check-depth-one-ghost.solution b/src/test_cases/q3/7-1c-check-depth-one-ghost.solution
new file mode 100644
index 0000000..210bb5d
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-1c-check-depth-one-ghost.test b/src/test_cases/q3/7-1c-check-depth-one-ghost.test
new file mode 100644
index 0000000..cd92eb9
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-2a-check-depth-two-ghosts.solution b/src/test_cases/q3/7-2a-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..9a08a38
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-2a-check-depth-two-ghosts.test b/src/test_cases/q3/7-2a-check-depth-two-ghosts.test
new file mode 100644
index 0000000..421a05c
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-2b-check-depth-two-ghosts.solution b/src/test_cases/q3/7-2b-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..194c0aa
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-2b-check-depth-two-ghosts.test b/src/test_cases/q3/7-2b-check-depth-two-ghosts.test
new file mode 100644
index 0000000..728806e
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-2c-check-depth-two-ghosts.solution b/src/test_cases/q3/7-2c-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..1e989f3
--- /dev/null
+++ b/src/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/src/test_cases/q3/7-2c-check-depth-two-ghosts.test b/src/test_cases/q3/7-2c-check-depth-two-ghosts.test
new file mode 100644
index 0000000..9e727ce
--- /dev/null
+++ b/src/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/src/test_cases/q3/8-pacman-game.solution b/src/test_cases/q3/8-pacman-game.solution
new file mode 100644
index 0000000..ec0b0b8
--- /dev/null
+++ b/src/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/src/test_cases/q3/8-pacman-game.test b/src/test_cases/q3/8-pacman-game.test
new file mode 100644
index 0000000..56341ae
--- /dev/null
+++ b/src/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/src/test_cases/q3/CONFIG b/src/test_cases/q3/CONFIG
new file mode 100644
index 0000000..a5adc3f
--- /dev/null
+++ b/src/test_cases/q3/CONFIG
@@ -0,0 +1,2 @@
+max_points: "5"
+class: "PassAllTestsQuestion"
diff --git a/src/test_cases/q4/0-expectimax1.solution b/src/test_cases/q4/0-expectimax1.solution
new file mode 100644
index 0000000..ff7dfe6
--- /dev/null
+++ b/src/test_cases/q4/0-expectimax1.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/0-expectimax1.test.
+action: "Left"
+generated: "A B C D E F G H I exp1 exp2 exp3 max"
diff --git a/src/test_cases/q4/0-expectimax1.test b/src/test_cases/q4/0-expectimax1.test
new file mode 100644
index 0000000..deee59a
--- /dev/null
+++ b/src/test_cases/q4/0-expectimax1.test
@@ -0,0 +1,48 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+depth: "2"
+
+# Tree adapted from lecture 6 slides
+diagram: """
+ max
+ /-/ | \--\
+ / | \
+ / | \
+ exp1 exp2 exp3
+ /|\ /|\ /|\
+ / | \ / | \ / | \
+A B C D E F G H I
+3 12 8 2 4 6 14 5 2
+"""
+num_agents: "2"
+
+start_state: "max"
+win_states: "A B C D E F G H I"
+lose_states: ""
+
+successors: """
+max Left exp1
+max Center exp2
+max Right exp3
+exp1 Left A
+exp1 Center B
+exp1 Right C
+exp2 Left D
+exp2 Center E
+exp2 Right F
+exp3 Left G
+exp3 Center H
+exp3 Right I
+"""
+
+evaluation: """
+A 3.0
+B 12.0
+C 8.0
+D 2.0
+E 4.0
+F 6.0
+G 14.0
+H 5.0
+I 2.0
+"""
diff --git a/src/test_cases/q4/1-expectimax2.solution b/src/test_cases/q4/1-expectimax2.solution
new file mode 100644
index 0000000..30c8768
--- /dev/null
+++ b/src/test_cases/q4/1-expectimax2.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/1-expectimax2.test.
+action: "Left"
+generated: "A B C D E F G H I exp1 exp2 exp3 max"
diff --git a/src/test_cases/q4/1-expectimax2.test b/src/test_cases/q4/1-expectimax2.test
new file mode 100644
index 0000000..d220fe6
--- /dev/null
+++ b/src/test_cases/q4/1-expectimax2.test
@@ -0,0 +1,48 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+depth: "2"
+
+# Tree from lecture 7 slides
+diagram: """
+ max
+ /-/ | \--\
+ / | \
+ / | \
+ exp1 exp2 exp3
+ /|\ /|\ /|\
+ / | \ / | \ / | \
+A B C D E F G H I
+3 12 9 2 4 6 15 6 0
+"""
+num_agents: "2"
+
+start_state: "max"
+win_states: "A B C D E F G H I"
+lose_states: ""
+
+successors: """
+max Left exp1
+max Center exp2
+max Right exp3
+exp1 Left A
+exp1 Center B
+exp1 Right C
+exp2 Left D
+exp2 Center E
+exp2 Right F
+exp3 Left G
+exp3 Center H
+exp3 Right I
+"""
+
+evaluation: """
+A 3.0
+B 12.0
+C 9.0
+D 2.0
+E 4.0
+F 6.0
+G 15.0
+H 6.0
+I 0.0
+"""
diff --git a/src/test_cases/q4/2-one-ghost-3level.solution b/src/test_cases/q4/2-one-ghost-3level.solution
new file mode 100644
index 0000000..bde5c83
--- /dev/null
+++ b/src/test_cases/q4/2-one-ghost-3level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/2-one-ghost-3level.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q4/2-one-ghost-3level.test b/src/test_cases/q4/2-one-ghost-3level.test
new file mode 100644
index 0000000..5778a1d
--- /dev/null
+++ b/src/test_cases/q4/2-one-ghost-3level.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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 - exp
+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/src/test_cases/q4/3-one-ghost-4level.solution b/src/test_cases/q4/3-one-ghost-4level.solution
new file mode 100644
index 0000000..4ba2b47
--- /dev/null
+++ b/src/test_cases/q4/3-one-ghost-4level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/3-one-ghost-4level.test.
+action: "Right"
+generated: "A B C D E F G H I J K L M N O P a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q4/3-one-ghost-4level.test b/src/test_cases/q4/3-one-ghost-4level.test
new file mode 100644
index 0000000..6490a48
--- /dev/null
+++ b/src/test_cases/q4/3-one-ghost-4level.test
@@ -0,0 +1,79 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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 - exp
+c - max
+d - exp
+"""
+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/src/test_cases/q4/4-two-ghosts-3level.solution b/src/test_cases/q4/4-two-ghosts-3level.solution
new file mode 100644
index 0000000..6dbd664
--- /dev/null
+++ b/src/test_cases/q4/4-two-ghosts-3level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/4-two-ghosts-3level.test.
+action: "Left"
+generated: "a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q4/4-two-ghosts-3level.test b/src/test_cases/q4/4-two-ghosts-3level.test
new file mode 100644
index 0000000..d39bf1c
--- /dev/null
+++ b/src/test_cases/q4/4-two-ghosts-3level.test
@@ -0,0 +1,52 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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 - exp
+c - exp
+"""
+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/src/test_cases/q4/5-two-ghosts-4level.solution b/src/test_cases/q4/5-two-ghosts-4level.solution
new file mode 100644
index 0000000..caccbea
--- /dev/null
+++ b/src/test_cases/q4/5-two-ghosts-4level.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/5-two-ghosts-4level.test.
+action: "Left"
+generated: "A B C D E F G H I J K L M N O P a b1 b2 c1 c2 c3 c4 d1 d2 d3 d4 d5 d6 d7 d8"
diff --git a/src/test_cases/q4/5-two-ghosts-4level.test b/src/test_cases/q4/5-two-ghosts-4level.test
new file mode 100644
index 0000000..b2d2733
--- /dev/null
+++ b/src/test_cases/q4/5-two-ghosts-4level.test
@@ -0,0 +1,79 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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 - exp
+c - exp
+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/src/test_cases/q4/6-1a-check-depth-one-ghost.solution b/src/test_cases/q4/6-1a-check-depth-one-ghost.solution
new file mode 100644
index 0000000..22aebdc
--- /dev/null
+++ b/src/test_cases/q4/6-1a-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/6-1a-check-depth-one-ghost.test.
+action: "Left"
+generated: "a b1 b2 b3 c1 c2 c3"
diff --git a/src/test_cases/q4/6-1a-check-depth-one-ghost.test b/src/test_cases/q4/6-1a-check-depth-one-ghost.test
new file mode 100644
index 0000000..4d36ea5
--- /dev/null
+++ b/src/test_cases/q4/6-1a-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/6-1b-check-depth-one-ghost.solution b/src/test_cases/q4/6-1b-check-depth-one-ghost.solution
new file mode 100644
index 0000000..e34e3d3
--- /dev/null
+++ b/src/test_cases/q4/6-1b-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/6-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/src/test_cases/q4/6-1b-check-depth-one-ghost.test b/src/test_cases/q4/6-1b-check-depth-one-ghost.test
new file mode 100644
index 0000000..a63d167
--- /dev/null
+++ b/src/test_cases/q4/6-1b-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/6-1c-check-depth-one-ghost.solution b/src/test_cases/q4/6-1c-check-depth-one-ghost.solution
new file mode 100644
index 0000000..cd33b5a
--- /dev/null
+++ b/src/test_cases/q4/6-1c-check-depth-one-ghost.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/6-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/src/test_cases/q4/6-1c-check-depth-one-ghost.test b/src/test_cases/q4/6-1c-check-depth-one-ghost.test
new file mode 100644
index 0000000..84e78f0
--- /dev/null
+++ b/src/test_cases/q4/6-1c-check-depth-one-ghost.test
@@ -0,0 +1,83 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/6-2a-check-depth-two-ghosts.solution b/src/test_cases/q4/6-2a-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..0e9c9e9
--- /dev/null
+++ b/src/test_cases/q4/6-2a-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/6-2a-check-depth-two-ghosts.test.
+action: "Left"
+generated: "a b1 b2 b3 c1 c2 c3 d1 d2 d3"
diff --git a/src/test_cases/q4/6-2a-check-depth-two-ghosts.test b/src/test_cases/q4/6-2a-check-depth-two-ghosts.test
new file mode 100644
index 0000000..36ecd4e
--- /dev/null
+++ b/src/test_cases/q4/6-2a-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/6-2b-check-depth-two-ghosts.solution b/src/test_cases/q4/6-2b-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..3fcde21
--- /dev/null
+++ b/src/test_cases/q4/6-2b-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/6-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/src/test_cases/q4/6-2b-check-depth-two-ghosts.test b/src/test_cases/q4/6-2b-check-depth-two-ghosts.test
new file mode 100644
index 0000000..d1b85b7
--- /dev/null
+++ b/src/test_cases/q4/6-2b-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/6-2c-check-depth-two-ghosts.solution b/src/test_cases/q4/6-2c-check-depth-two-ghosts.solution
new file mode 100644
index 0000000..bad1cf9
--- /dev/null
+++ b/src/test_cases/q4/6-2c-check-depth-two-ghosts.solution
@@ -0,0 +1,3 @@
+# This is the solution file for test_cases/q4/6-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/src/test_cases/q4/6-2c-check-depth-two-ghosts.test b/src/test_cases/q4/6-2c-check-depth-two-ghosts.test
new file mode 100644
index 0000000..6c4c9ea
--- /dev/null
+++ b/src/test_cases/q4/6-2c-check-depth-two-ghosts.test
@@ -0,0 +1,110 @@
+class: "GraphGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/7-pacman-game.solution b/src/test_cases/q4/7-pacman-game.solution
new file mode 100644
index 0000000..ecc544b
--- /dev/null
+++ b/src/test_cases/q4/7-pacman-game.solution
@@ -0,0 +1,444 @@
+optimalActions: """
+[[["West", "East"], 59], [["West", "East"], 35]]
+[[["West"], 190], [["West"], 127]]
+[[["West"], 190], [["West"], 135]]
+[[["West", "North"], 120], [["West", "North"], 82]]
+[[["West"], 77], [["West"], 57]]
+[[["West", "North"], 143], [["West", "North"], 97]]
+[[["West"], 155], [["West"], 110]]
+[[["West"], 40], [["West"], 27]]
+[[["North"], 64], [["North"], 43]]
+[[["North"], 85], [["North"], 57]]
+[[["North"], 106], [["North"], 71]]
+[[["North"], 97], [["North"], 65]]
+[[["East"], 154], [["East"], 103]]
+[[["Stop"], 130], [["West"], 85]]
+[[["West"], 30], [["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"], 29], [["North"], 18]]
+[[["North"], 50], [["North"], 31]]
+[[["West"], 55], [["West"], 36]]
+[[["East"], 29], [["East"], 16]]
+[[["North"], 89], [["North"], 61]]
+[[["East", "North"], 161], [["East", "North"], 121]]
+[[["East", "North"], 221], [["East", "North"], 166]]
+[[["North", "South"], 105], [["North", "South"], 77]]
+[[["West"], 69], [["West"], 51]]
+[[["West"], 94], [["West"], 69]]
+[[["West", "Stop"], 57], [["West"], 42]]
+[[["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"], 85], [["East", "South"], 57]]
+[[["Stop", "East", "South"], 64], [["East", "South"], 43]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 61], [["East", "South"], 41]]
+[[["Stop", "East", "South"], 85], [["East", "South"], 57]]
+[[["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"], 29], [["East", "North"], 18]]
+[[["East"], 38], [["East"], 22]]
+[[["North"], 29], [["North"], 18]]
+[[["North"], 38], [["North"], 22]]
+[[["East"], 33], [["East"], 22]]
+[[["East"], 37], [["East"], 18]]
+[[["East"], 18], [["East"], 12]]
+[[["East"], 37], [["East"], 26]]
+[[["East"], 69], [["East"], 41]]
+[[["East"], 56], [["East"], 26]]
+[[["East"], 44], [["East"], 29]]
+[[["North", "South"], 83], [["North", "South"], 52]]
+[[["East", "North"], 121], [["East", "North"], 74]]
+[[["East", "North"], 97], [["East", "North"], 73]]
+[[["North", "South"], 173], [["North", "South"], 130]]
+[[["West", "East"], 90], [["West", "East"], 66]]
+[[["West", "Stop", "East"], 161], [["West", "East"], 118]]
+[[["Stop", "East", "South"], 58], [["East", "South"], 43]]
+[[["Stop", "East"], 120], [["East"], 85]]
+[[["East"], 78], [["East"], 45]]
+[[["West"], 77], [["West"], 42]]
+[[["South"], 83], [["South"], 48]]
+[[["South"], 49], [["South"], 37]]
+[[["South"], 185], [["South"], 104]]
+[[["South"], 68], [["South"], 41]]
+[[["West"], 30], [["West"], 18]]
+[[["West"], 56], [["West"], 29]]
+[[["West"], 14], [["West"], 10]]
+[[["West"], 20], [["West"], 14]]
+[[["West"], 13], [["West"], 9]]
+[[["West"], 13], [["West"], 9]]
+[[["West"], 16], [["West"], 12]]
+[[["West", "North"], 30], [["West", "North"], 20]]
+[[["West"], 38], [["West"], 23]]
+[[["West", "Stop", "East", "North"], 70], [["West", "East", "North"], 46]]
+[[["West", "Stop", "East"], 128], [["West", "East"], 89]]
+[[["West", "Stop", "East"], 31], [["West", "East"], 20]]
+[[["Stop", "East", "North"], 69], [["East", "North"], 45]]
+[[["Stop", "North"], 58], [["North"], 31]]
+[[["North"], 34], [["North"], 19]]
+[[["North"], 30], [["North"], 17]]
+[[["North"], 19], [["North"], 11]]
+[[["North"], 34], [["North"], 19]]
+[[["East"], 30], [["East"], 17]]
+[[["East"], 19], [["East"], 11]]
+[[["East"], 44], [["East"], 29]]
+[[["East", "South"], 87], [["East", "South"], 60]]
+[[["East", "South"], 108], [["East", "South"], 62]]
+[[["South"], 120], [["South"], 61]]
+[[["North", "South"], 209], [["North", "South"], 132]]
+[[["West"], 108], [["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"], 98], [["East", "South"], 65]]
+[[["Stop", "East", "South"], 128], [["East", "South"], 86]]
+[[["Stop", "East", "South"], 82], [["East", "South"], 55]]
+[[["Stop", "East", "South"], 85], [["East", "South"], 57]]
+[[["Stop", "East", "South"], 190], [["East", "South"], 127]]
+[[["Stop", "East", "South"], 158], [["East", "South"], 103]]
+[[["Stop", "South"], 50], [["South"], 27]]
+[[["South"], 30], [["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"], 29], [["East", "North"], 18]]
+[[["East"], 37], [["East"], 22]]
+[[["East", "North"], 41], [["East", "North"], 24]]
+[[["East"], 59], [["East"], 29]]
+[[["East"], 19], [["East"], 11]]
+[[["East"], 26], [["East"], 15]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 15], [["East"], 9]]
+[[["East"], 18], [["East"], 12]]
+[[["East"], 29], [["East"], 18]]
+[[["East"], 37], [["East"], 22]]
+[[["East", "North"], 41], [["East", "North"], 24]]
+[[["East"], 59], [["East"], 29]]
+[[["East"], 19], [["East"], 11]]
+[[["North"], 26], [["North"], 15]]
+[[["North"], 19], [["North"], 11]]
+[[["North"], 30], [["North"], 17]]
+[[["North"], 34], [["North"], 19]]
+[[["West"], 34], [["West"], 19]]
+[[["West"], 25], [["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"], ["North"], ["North"]]
+[["East"], ["East"], ["East"], ["East"]]
+[["West", "Stop"], ["West"], ["Stop"], ["West"]]
+[["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"], ["East"]]
+[["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"], ["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"]]
+[["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"], ["West"]]
+[["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/src/test_cases/q4/7-pacman-game.test b/src/test_cases/q4/7-pacman-game.test
new file mode 100644
index 0000000..435cf2f
--- /dev/null
+++ b/src/test_cases/q4/7-pacman-game.test
@@ -0,0 +1,19 @@
+class: "PacmanGameTreeTest"
+alg: "ExpectimaxAgent"
+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/src/test_cases/q4/CONFIG b/src/test_cases/q4/CONFIG
new file mode 100644
index 0000000..a5adc3f
--- /dev/null
+++ b/src/test_cases/q4/CONFIG
@@ -0,0 +1,2 @@
+max_points: "5"
+class: "PassAllTestsQuestion"
diff --git a/src/test_cases/q5/CONFIG b/src/test_cases/q5/CONFIG
new file mode 100644
index 0000000..df50d84
--- /dev/null
+++ b/src/test_cases/q5/CONFIG
@@ -0,0 +1,2 @@
+max_points: "6"
+class: "PartialCreditQuestion"
diff --git a/src/test_cases/q5/grade-agent.solution b/src/test_cases/q5/grade-agent.solution
new file mode 100644
index 0000000..55fcfc8
--- /dev/null
+++ b/src/test_cases/q5/grade-agent.solution
@@ -0,0 +1,2 @@
+# This is the solution file for test_cases/q5/grade-agent.test.
+# File intentionally blank.
diff --git a/src/test_cases/q5/grade-agent.test b/src/test_cases/q5/grade-agent.test
new file mode 100644
index 0000000..4109586
--- /dev/null
+++ b/src/test_cases/q5/grade-agent.test
@@ -0,0 +1,18 @@
+class: "EvalAgentTest"
+
+agentName: "ExpectimaxAgent"
+agentArgs: "evalFn=better"
+layoutName: "smallClassic"
+maxTime: "120"
+numGames: "10"
+
+nonTimeoutMinimum: "0"
+nonTimeoutThresholds: "10"
+
+scoreThresholds: "500 1000"
+
+winsMinimum: "1"
+winsThresholds: "1 5 10"
+
+randomSeed: "0"
+ghosts: "[RandomGhost(1)]"