[iagno] Perfs tests generator.



commit 78fa01f3a08cacebdfb8fa8f7d7d5e0988983442
Author: Arnaud Bonatti <arnaud bonatti gmail com>
Date:   Mon Oct 14 15:09:14 2019 +0200

    Perfs tests generator.
    
    cd $builddir
    ninja update-perfs-tests
    cd $gitdir
    git diff
    // files src/perfs-tests-revers*.vala
    // have been edited if AI has changed
    
    cd $builddir
    ninja test // usual tests (.desktop file validation…); instantaneous
    meson configure -Dperfs_tests=true
    ninja test // all tests including generated ones; take ~10s on an i3
    meson configure -Dperfs_tests=false
    cd $gitdir

 src/meson.build                |    57 +-
 src/perfs-tests-generator.vala |   165 +
 src/perfs-tests-iagno.vala     |    62 +
 src/perfs-tests-reverse.vala   | 39251 +++++++++++++++++++++++++++++++++++++++
 src/perfs-tests-reversi.vala   | 38162 +++++++++++++++++++++++++++++++++++++
 src/test-iagno.vala            |   349 +-
 6 files changed, 77709 insertions(+), 337 deletions(-)
---
diff --git a/src/meson.build b/src/meson.build
index 119cb45..578f4c1 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -1,5 +1,51 @@
-# Tests
-iagno_tests = executable('iagno_tests',
+# Tests generation
+run_target('update-perfs-tests', command: executable ('iagno-perfs-tests-generator',
+        [
+            'vapi/config.vapi',
+            'perfs-tests-generator.vala',
+            'computer-player.vala',
+            'computer-reversi.vala',
+            'game.vala',
+            'player.vala'
+        ],
+        c_args: [
+            '-include', 'config.h'
+        ],
+        vala_args: [
+            '--enable-experimental-non-null'
+        ],
+        dependencies : [
+            gio_dependency
+        ]
+    )
+)
+
+# Generated tests
+if get_option('perfs_tests')
+    iagno_generated_tests = executable('iagno-generated-tests',
+        [
+            'perfs-tests-iagno.vala',
+            'perfs-tests-reverse.vala',
+            'perfs-tests-reversi.vala',
+            'computer-player.vala',
+            'computer-reversi.vala',
+            'game.vala',
+            'player.vala'
+        ],
+        vala_args: [
+            '--enable-experimental-non-null'
+        ],
+        dependencies : [
+            gio_dependency
+        ]
+    )
+
+    test('iagno-perfs-tests-reversi', iagno_generated_tests, args : ['-m', 'perf', '-p', 
'/Reversi/reversi'], timeout :  5)
+    test('iagno-perfs-tests-reverse', iagno_generated_tests, args : ['-m', 'perf', '-p', 
'/Reversi/reverse'], timeout : 20)
+endif
+
+# Static tests
+iagno_tests = executable('iagno-tests',
     [
         'test-iagno.vala',
         'computer-player.vala',
@@ -7,15 +53,16 @@ iagno_tests = executable('iagno_tests',
         'game.vala',
         'player.vala'
     ],
+    vala_args: [
+        '--enable-experimental-non-null'
+    ],
     dependencies : [
         gio_dependency
     ]
 )
 test('iagno-short-tests', iagno_tests, timeout : 1)
-if get_option('perfs_tests')
-    test('iagno-perfs-tests', iagno_tests, args : ['-m', 'perf'], timeout : 120)
-endif
 
+# Game
 executable(meson.project_name(),
     [
         'vapi/config.vapi',
diff --git a/src/perfs-tests-generator.vala b/src/perfs-tests-generator.vala
new file mode 100644
index 0000000..eceec6a
--- /dev/null
+++ b/src/perfs-tests-generator.vala
@@ -0,0 +1,165 @@
+/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+   This file is part of GNOME Reversi, also known as Iagno.
+
+   Copyright 2019 — Arnaud Bonatti
+
+   GNOME Reversi is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   GNOME Reversi is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GNOME Reversi.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+private class PerfsTestsGenerator : Application
+{
+    private static int main (string [] args)
+    {
+        Environment.set_application_name ("perfs-tests-generator");
+
+        return new PerfsTestsGenerator ().run (args);
+    }
+
+    private PerfsTestsGenerator ()
+    {
+        Object (application_id: "org.gnome.Reversi.PerfsTestsGenerator", flags: ApplicationFlags.FLAGS_NONE);
+    }
+
+    protected override int handle_local_options (GLib.VariantDict options)
+    {
+        string [] environ = Environ.@get ();
+        string? source_root = Environ.get_variable (environ, "MESON_SOURCE_ROOT");
+        if (source_root == null)
+            assert_not_reached ();
+
+        generate_file ((!) source_root, /* reverse */ false);
+        generate_file ((!) source_root, /* reverse */ true);
+
+        return Posix.EXIT_SUCCESS;
+    }
+
+    private void generate_file (string source_root, bool reverse)
+    {
+        string file_name = reverse ? "perfs-tests-reverse.vala" : "perfs-tests-reversi.vala";
+        FileStream? stream = FileStream.open (Path.build_filename (source_root, "src", file_name), "w");
+        if (stream == null)
+            assert_not_reached ();
+
+        uint16 rounds = reverse ? 512 : 494;
+        string e_or_i = reverse ? "e" : "i";
+
+        ((!) stream).printf ("/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 
-*-\n");
+        ((!) stream).printf ("\n");
+        ((!) stream).printf ("   This file is part of GNOME Reversi, also known as Iagno.\n");
+        ((!) stream).printf ("\n");
+        ((!) stream).printf ("   Copyright 2019 — Arnaud Bonatti\n");
+        ((!) stream).printf ("   File updated by `ninja update-perfs-tests`\n");
+        ((!) stream).printf ("\n");
+        ((!) stream).printf ("   GNOME Reversi is free software: you can redistribute it and/or modify\n");
+        ((!) stream).printf ("   it under the terms of the GNU General Public License as published by\n");
+        ((!) stream).printf ("   the Free Software Foundation, either version 3 of the License, or\n");
+        ((!) stream).printf ("   (at your option) any later version.\n");
+        ((!) stream).printf ("\n");
+        ((!) stream).printf ("   GNOME Reversi is distributed in the hope that it will be useful,\n");
+        ((!) stream).printf ("   but WITHOUT ANY WARRANTY; without even the implied warranty of\n");
+        ((!) stream).printf ("   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n");
+        ((!) stream).printf ("   GNU General Public License for more details.\n");
+        ((!) stream).printf ("\n");
+        ((!) stream).printf ("   You should have received a copy of the GNU General Public License\n");
+        ((!) stream).printf ("   along with GNOME Reversi.  If not, see <https://www.gnu.org/licenses/>.\n");
+        ((!) stream).printf ("*/\n");
+        ((!) stream).printf ("\n");
+        ((!) stream).printf ("namespace GeneratedTests\n");
+        ((!) stream).printf ("{\n");
+
+        ((!) stream).printf (@"    private static void perfs_tests_revers$e_or_i ()\n");
+        ((!) stream).printf ( "    {\n");
+        ((!) stream).printf ( "        /* crossing start position */\n");
+        for (uint16 i = 0; i <= rounds; i++)
+        {
+            if ((!reverse && i == 232) || (reverse && i == 236))
+                ((!) stream).printf ("        /* parallel start position */\n");
+            ((!) stream).printf (@"        Test.add_func (\"/Reversi/revers$e_or_i/Complete game $(i + 
1)\",\n");
+            ((!) stream).printf (@"                            test_complete_revers$(e_or_i)_game_$(i + 
1));\n");
+            if (i != rounds) ((!) stream).printf ("\n");
+        }
+        ((!) stream).printf ("    }\n\n    /*\\\n    * * perfs tests\n    \\*/\n");
+
+        uint8 [] game_init = { 0, 0, 0, 0 };
+        uint8 [] game_init_max = { 0, 0, 0, 0 };
+        for (uint16 i = 0; i <= rounds; i++)
+        {
+            /* ai1 starts */
+            Opening opening = ((!reverse && i < 232) || (reverse && i < 236)) ? Opening.REVERSI : 
Opening.ALTER_TOP;
+            Game game = new Game (reverse, opening, /* size */ 8);
+            uint8 depth = reverse ? 2 : 1;
+
+            if ((!reverse && i == 232) || (reverse && i == 236))
+                game_init = { 0, 0, 0, 0 };
+            for (uint8 j = 0; j <= 3; j++)
+            {
+                SList<PossibleMove?> moves;
+                game.get_possible_moves (out moves);
+                game_init_max [j] = (uint8) moves.length ();
+
+                PossibleMove? move = moves.nth_data (game_init [j]);
+                if (move == null)
+                    assert_not_reached ();
+                assert_true (game.place_tile (((!) move).x, ((!) move).y));
+            }
+            // for next game
+            for (uint8 j = 3; j >= 0; j--)
+            {
+                game_init [j]++;
+                if (game_init [j] < game_init_max [j])
+                    break;
+                game_init [j] = 0;
+            }
+            string [] initial_game = game.to_string ().split ("\n");
+            initial_game = initial_game [1 : initial_game.length - 1];
+            ComputerReversi ai;
+            if (reverse)
+                ai = new ComputerReverseHard (game, depth, /* fixed heuristic */ true);
+            else
+                ai = new ComputerReversiHard (game, depth, /* fixed heuristic */ true);
+
+            ((!) stream).printf (@"\n    private static inline void test_complete_revers$(e_or_i)_game_$(i + 
1) ()\n");
+            ((!) stream).printf ( "    {\n");
+            ((!) stream).printf ( "                                  /* 0 1 2 3 4 5 6 7 */\n");
+            ((!) stream).printf (@"        string [] board = {/* 0 */ \"$(initial_game [0])\",\n");
+            for (uint8 n = 1; n < 7; n++)
+                ((!) stream).printf (@"                           /* $n */ \"$(initial_game [n])\",\n");
+            ((!) stream).printf (@"                           /* 7 */ \"$(initial_game [7])\"};\n\n");
+
+            ((!) stream).printf (@"        Game game = new Game.from_strings (board, Player.DARK, /* reverse 
*/ $reverse);\n");
+            ((!) stream).printf (@"        ComputerPlayer ai = new ComputerRevers$(e_or_i)Hard (game, /* 
depth */ $depth, /* fixed heuristic */ true);\n\n");
+
+            uint8 x;
+            uint8 y;
+            do
+            {
+                if (game.current_player_can_move)
+                {
+                    ai.move_sync (out x, out y);
+                    ((!) stream).printf (@"        assert_true (ai_move (ai, $x, $y));\n");
+                }
+                else if (!game.is_complete)
+                {
+                    game.pass ();
+                    ((!) stream).printf (@"        assert_true (game.pass ());\n");
+                }
+            }
+            while (!game.is_complete);
+
+            ((!) stream).printf ("    }\n");
+        }
+        ((!) stream).printf ("}\n");
+    }
+}
diff --git a/src/perfs-tests-iagno.vala b/src/perfs-tests-iagno.vala
new file mode 100644
index 0000000..1c4706c
--- /dev/null
+++ b/src/perfs-tests-iagno.vala
@@ -0,0 +1,62 @@
+/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+   This file is part of GNOME Reversi, also known as Iagno.
+
+   Copyright 2019 — Arnaud Bonatti
+
+   GNOME Reversi is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   GNOME Reversi is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GNOME Reversi.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+namespace GeneratedTests
+{
+    private static int main (string [] args)
+    {
+        Test.init (ref args);
+
+        Test.add_func ("/Reversi/test tests",
+                                 test_tests);
+
+        if (Test.perf ())
+        {
+            perfs_tests_reverse ();
+            perfs_tests_reversi ();
+        }
+
+        return Test.run ();
+    }
+
+    private static void test_tests ()
+    {
+        assert_true (1 + 1 == 2);
+    }
+
+    /*\
+    * * utilities
+    \*/
+
+    private static bool ai_move (ComputerPlayer ai, uint8 force_x, uint8 force_y)
+    {
+        uint8 x;
+        uint8 y;
+        ai.move_sync (out x, out y);
+
+        bool success = (x == force_x)
+                    && (y == force_y);
+
+        if (!success)
+            print (@"\nwanted: ($force_x, $force_y), result: ($x, $y)");
+
+        return success;
+    }
+}
diff --git a/src/perfs-tests-reverse.vala b/src/perfs-tests-reverse.vala
new file mode 100644
index 0000000..558b512
--- /dev/null
+++ b/src/perfs-tests-reverse.vala
@@ -0,0 +1,39251 @@
+/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+   This file is part of GNOME Reversi, also known as Iagno.
+
+   Copyright 2019 — Arnaud Bonatti
+   File updated by `ninja update-perfs-tests`
+
+   GNOME Reversi is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   GNOME Reversi is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GNOME Reversi.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+namespace GeneratedTests
+{
+    private static void perfs_tests_reverse ()
+    {
+        /* crossing start position */
+        Test.add_func ("/Reversi/reverse/Complete game 1",
+                            test_complete_reverse_game_1);
+
+        Test.add_func ("/Reversi/reverse/Complete game 2",
+                            test_complete_reverse_game_2);
+
+        Test.add_func ("/Reversi/reverse/Complete game 3",
+                            test_complete_reverse_game_3);
+
+        Test.add_func ("/Reversi/reverse/Complete game 4",
+                            test_complete_reverse_game_4);
+
+        Test.add_func ("/Reversi/reverse/Complete game 5",
+                            test_complete_reverse_game_5);
+
+        Test.add_func ("/Reversi/reverse/Complete game 6",
+                            test_complete_reverse_game_6);
+
+        Test.add_func ("/Reversi/reverse/Complete game 7",
+                            test_complete_reverse_game_7);
+
+        Test.add_func ("/Reversi/reverse/Complete game 8",
+                            test_complete_reverse_game_8);
+
+        Test.add_func ("/Reversi/reverse/Complete game 9",
+                            test_complete_reverse_game_9);
+
+        Test.add_func ("/Reversi/reverse/Complete game 10",
+                            test_complete_reverse_game_10);
+
+        Test.add_func ("/Reversi/reverse/Complete game 11",
+                            test_complete_reverse_game_11);
+
+        Test.add_func ("/Reversi/reverse/Complete game 12",
+                            test_complete_reverse_game_12);
+
+        Test.add_func ("/Reversi/reverse/Complete game 13",
+                            test_complete_reverse_game_13);
+
+        Test.add_func ("/Reversi/reverse/Complete game 14",
+                            test_complete_reverse_game_14);
+
+        Test.add_func ("/Reversi/reverse/Complete game 15",
+                            test_complete_reverse_game_15);
+
+        Test.add_func ("/Reversi/reverse/Complete game 16",
+                            test_complete_reverse_game_16);
+
+        Test.add_func ("/Reversi/reverse/Complete game 17",
+                            test_complete_reverse_game_17);
+
+        Test.add_func ("/Reversi/reverse/Complete game 18",
+                            test_complete_reverse_game_18);
+
+        Test.add_func ("/Reversi/reverse/Complete game 19",
+                            test_complete_reverse_game_19);
+
+        Test.add_func ("/Reversi/reverse/Complete game 20",
+                            test_complete_reverse_game_20);
+
+        Test.add_func ("/Reversi/reverse/Complete game 21",
+                            test_complete_reverse_game_21);
+
+        Test.add_func ("/Reversi/reverse/Complete game 22",
+                            test_complete_reverse_game_22);
+
+        Test.add_func ("/Reversi/reverse/Complete game 23",
+                            test_complete_reverse_game_23);
+
+        Test.add_func ("/Reversi/reverse/Complete game 24",
+                            test_complete_reverse_game_24);
+
+        Test.add_func ("/Reversi/reverse/Complete game 25",
+                            test_complete_reverse_game_25);
+
+        Test.add_func ("/Reversi/reverse/Complete game 26",
+                            test_complete_reverse_game_26);
+
+        Test.add_func ("/Reversi/reverse/Complete game 27",
+                            test_complete_reverse_game_27);
+
+        Test.add_func ("/Reversi/reverse/Complete game 28",
+                            test_complete_reverse_game_28);
+
+        Test.add_func ("/Reversi/reverse/Complete game 29",
+                            test_complete_reverse_game_29);
+
+        Test.add_func ("/Reversi/reverse/Complete game 30",
+                            test_complete_reverse_game_30);
+
+        Test.add_func ("/Reversi/reverse/Complete game 31",
+                            test_complete_reverse_game_31);
+
+        Test.add_func ("/Reversi/reverse/Complete game 32",
+                            test_complete_reverse_game_32);
+
+        Test.add_func ("/Reversi/reverse/Complete game 33",
+                            test_complete_reverse_game_33);
+
+        Test.add_func ("/Reversi/reverse/Complete game 34",
+                            test_complete_reverse_game_34);
+
+        Test.add_func ("/Reversi/reverse/Complete game 35",
+                            test_complete_reverse_game_35);
+
+        Test.add_func ("/Reversi/reverse/Complete game 36",
+                            test_complete_reverse_game_36);
+
+        Test.add_func ("/Reversi/reverse/Complete game 37",
+                            test_complete_reverse_game_37);
+
+        Test.add_func ("/Reversi/reverse/Complete game 38",
+                            test_complete_reverse_game_38);
+
+        Test.add_func ("/Reversi/reverse/Complete game 39",
+                            test_complete_reverse_game_39);
+
+        Test.add_func ("/Reversi/reverse/Complete game 40",
+                            test_complete_reverse_game_40);
+
+        Test.add_func ("/Reversi/reverse/Complete game 41",
+                            test_complete_reverse_game_41);
+
+        Test.add_func ("/Reversi/reverse/Complete game 42",
+                            test_complete_reverse_game_42);
+
+        Test.add_func ("/Reversi/reverse/Complete game 43",
+                            test_complete_reverse_game_43);
+
+        Test.add_func ("/Reversi/reverse/Complete game 44",
+                            test_complete_reverse_game_44);
+
+        Test.add_func ("/Reversi/reverse/Complete game 45",
+                            test_complete_reverse_game_45);
+
+        Test.add_func ("/Reversi/reverse/Complete game 46",
+                            test_complete_reverse_game_46);
+
+        Test.add_func ("/Reversi/reverse/Complete game 47",
+                            test_complete_reverse_game_47);
+
+        Test.add_func ("/Reversi/reverse/Complete game 48",
+                            test_complete_reverse_game_48);
+
+        Test.add_func ("/Reversi/reverse/Complete game 49",
+                            test_complete_reverse_game_49);
+
+        Test.add_func ("/Reversi/reverse/Complete game 50",
+                            test_complete_reverse_game_50);
+
+        Test.add_func ("/Reversi/reverse/Complete game 51",
+                            test_complete_reverse_game_51);
+
+        Test.add_func ("/Reversi/reverse/Complete game 52",
+                            test_complete_reverse_game_52);
+
+        Test.add_func ("/Reversi/reverse/Complete game 53",
+                            test_complete_reverse_game_53);
+
+        Test.add_func ("/Reversi/reverse/Complete game 54",
+                            test_complete_reverse_game_54);
+
+        Test.add_func ("/Reversi/reverse/Complete game 55",
+                            test_complete_reverse_game_55);
+
+        Test.add_func ("/Reversi/reverse/Complete game 56",
+                            test_complete_reverse_game_56);
+
+        Test.add_func ("/Reversi/reverse/Complete game 57",
+                            test_complete_reverse_game_57);
+
+        Test.add_func ("/Reversi/reverse/Complete game 58",
+                            test_complete_reverse_game_58);
+
+        Test.add_func ("/Reversi/reverse/Complete game 59",
+                            test_complete_reverse_game_59);
+
+        Test.add_func ("/Reversi/reverse/Complete game 60",
+                            test_complete_reverse_game_60);
+
+        Test.add_func ("/Reversi/reverse/Complete game 61",
+                            test_complete_reverse_game_61);
+
+        Test.add_func ("/Reversi/reverse/Complete game 62",
+                            test_complete_reverse_game_62);
+
+        Test.add_func ("/Reversi/reverse/Complete game 63",
+                            test_complete_reverse_game_63);
+
+        Test.add_func ("/Reversi/reverse/Complete game 64",
+                            test_complete_reverse_game_64);
+
+        Test.add_func ("/Reversi/reverse/Complete game 65",
+                            test_complete_reverse_game_65);
+
+        Test.add_func ("/Reversi/reverse/Complete game 66",
+                            test_complete_reverse_game_66);
+
+        Test.add_func ("/Reversi/reverse/Complete game 67",
+                            test_complete_reverse_game_67);
+
+        Test.add_func ("/Reversi/reverse/Complete game 68",
+                            test_complete_reverse_game_68);
+
+        Test.add_func ("/Reversi/reverse/Complete game 69",
+                            test_complete_reverse_game_69);
+
+        Test.add_func ("/Reversi/reverse/Complete game 70",
+                            test_complete_reverse_game_70);
+
+        Test.add_func ("/Reversi/reverse/Complete game 71",
+                            test_complete_reverse_game_71);
+
+        Test.add_func ("/Reversi/reverse/Complete game 72",
+                            test_complete_reverse_game_72);
+
+        Test.add_func ("/Reversi/reverse/Complete game 73",
+                            test_complete_reverse_game_73);
+
+        Test.add_func ("/Reversi/reverse/Complete game 74",
+                            test_complete_reverse_game_74);
+
+        Test.add_func ("/Reversi/reverse/Complete game 75",
+                            test_complete_reverse_game_75);
+
+        Test.add_func ("/Reversi/reverse/Complete game 76",
+                            test_complete_reverse_game_76);
+
+        Test.add_func ("/Reversi/reverse/Complete game 77",
+                            test_complete_reverse_game_77);
+
+        Test.add_func ("/Reversi/reverse/Complete game 78",
+                            test_complete_reverse_game_78);
+
+        Test.add_func ("/Reversi/reverse/Complete game 79",
+                            test_complete_reverse_game_79);
+
+        Test.add_func ("/Reversi/reverse/Complete game 80",
+                            test_complete_reverse_game_80);
+
+        Test.add_func ("/Reversi/reverse/Complete game 81",
+                            test_complete_reverse_game_81);
+
+        Test.add_func ("/Reversi/reverse/Complete game 82",
+                            test_complete_reverse_game_82);
+
+        Test.add_func ("/Reversi/reverse/Complete game 83",
+                            test_complete_reverse_game_83);
+
+        Test.add_func ("/Reversi/reverse/Complete game 84",
+                            test_complete_reverse_game_84);
+
+        Test.add_func ("/Reversi/reverse/Complete game 85",
+                            test_complete_reverse_game_85);
+
+        Test.add_func ("/Reversi/reverse/Complete game 86",
+                            test_complete_reverse_game_86);
+
+        Test.add_func ("/Reversi/reverse/Complete game 87",
+                            test_complete_reverse_game_87);
+
+        Test.add_func ("/Reversi/reverse/Complete game 88",
+                            test_complete_reverse_game_88);
+
+        Test.add_func ("/Reversi/reverse/Complete game 89",
+                            test_complete_reverse_game_89);
+
+        Test.add_func ("/Reversi/reverse/Complete game 90",
+                            test_complete_reverse_game_90);
+
+        Test.add_func ("/Reversi/reverse/Complete game 91",
+                            test_complete_reverse_game_91);
+
+        Test.add_func ("/Reversi/reverse/Complete game 92",
+                            test_complete_reverse_game_92);
+
+        Test.add_func ("/Reversi/reverse/Complete game 93",
+                            test_complete_reverse_game_93);
+
+        Test.add_func ("/Reversi/reverse/Complete game 94",
+                            test_complete_reverse_game_94);
+
+        Test.add_func ("/Reversi/reverse/Complete game 95",
+                            test_complete_reverse_game_95);
+
+        Test.add_func ("/Reversi/reverse/Complete game 96",
+                            test_complete_reverse_game_96);
+
+        Test.add_func ("/Reversi/reverse/Complete game 97",
+                            test_complete_reverse_game_97);
+
+        Test.add_func ("/Reversi/reverse/Complete game 98",
+                            test_complete_reverse_game_98);
+
+        Test.add_func ("/Reversi/reverse/Complete game 99",
+                            test_complete_reverse_game_99);
+
+        Test.add_func ("/Reversi/reverse/Complete game 100",
+                            test_complete_reverse_game_100);
+
+        Test.add_func ("/Reversi/reverse/Complete game 101",
+                            test_complete_reverse_game_101);
+
+        Test.add_func ("/Reversi/reverse/Complete game 102",
+                            test_complete_reverse_game_102);
+
+        Test.add_func ("/Reversi/reverse/Complete game 103",
+                            test_complete_reverse_game_103);
+
+        Test.add_func ("/Reversi/reverse/Complete game 104",
+                            test_complete_reverse_game_104);
+
+        Test.add_func ("/Reversi/reverse/Complete game 105",
+                            test_complete_reverse_game_105);
+
+        Test.add_func ("/Reversi/reverse/Complete game 106",
+                            test_complete_reverse_game_106);
+
+        Test.add_func ("/Reversi/reverse/Complete game 107",
+                            test_complete_reverse_game_107);
+
+        Test.add_func ("/Reversi/reverse/Complete game 108",
+                            test_complete_reverse_game_108);
+
+        Test.add_func ("/Reversi/reverse/Complete game 109",
+                            test_complete_reverse_game_109);
+
+        Test.add_func ("/Reversi/reverse/Complete game 110",
+                            test_complete_reverse_game_110);
+
+        Test.add_func ("/Reversi/reverse/Complete game 111",
+                            test_complete_reverse_game_111);
+
+        Test.add_func ("/Reversi/reverse/Complete game 112",
+                            test_complete_reverse_game_112);
+
+        Test.add_func ("/Reversi/reverse/Complete game 113",
+                            test_complete_reverse_game_113);
+
+        Test.add_func ("/Reversi/reverse/Complete game 114",
+                            test_complete_reverse_game_114);
+
+        Test.add_func ("/Reversi/reverse/Complete game 115",
+                            test_complete_reverse_game_115);
+
+        Test.add_func ("/Reversi/reverse/Complete game 116",
+                            test_complete_reverse_game_116);
+
+        Test.add_func ("/Reversi/reverse/Complete game 117",
+                            test_complete_reverse_game_117);
+
+        Test.add_func ("/Reversi/reverse/Complete game 118",
+                            test_complete_reverse_game_118);
+
+        Test.add_func ("/Reversi/reverse/Complete game 119",
+                            test_complete_reverse_game_119);
+
+        Test.add_func ("/Reversi/reverse/Complete game 120",
+                            test_complete_reverse_game_120);
+
+        Test.add_func ("/Reversi/reverse/Complete game 121",
+                            test_complete_reverse_game_121);
+
+        Test.add_func ("/Reversi/reverse/Complete game 122",
+                            test_complete_reverse_game_122);
+
+        Test.add_func ("/Reversi/reverse/Complete game 123",
+                            test_complete_reverse_game_123);
+
+        Test.add_func ("/Reversi/reverse/Complete game 124",
+                            test_complete_reverse_game_124);
+
+        Test.add_func ("/Reversi/reverse/Complete game 125",
+                            test_complete_reverse_game_125);
+
+        Test.add_func ("/Reversi/reverse/Complete game 126",
+                            test_complete_reverse_game_126);
+
+        Test.add_func ("/Reversi/reverse/Complete game 127",
+                            test_complete_reverse_game_127);
+
+        Test.add_func ("/Reversi/reverse/Complete game 128",
+                            test_complete_reverse_game_128);
+
+        Test.add_func ("/Reversi/reverse/Complete game 129",
+                            test_complete_reverse_game_129);
+
+        Test.add_func ("/Reversi/reverse/Complete game 130",
+                            test_complete_reverse_game_130);
+
+        Test.add_func ("/Reversi/reverse/Complete game 131",
+                            test_complete_reverse_game_131);
+
+        Test.add_func ("/Reversi/reverse/Complete game 132",
+                            test_complete_reverse_game_132);
+
+        Test.add_func ("/Reversi/reverse/Complete game 133",
+                            test_complete_reverse_game_133);
+
+        Test.add_func ("/Reversi/reverse/Complete game 134",
+                            test_complete_reverse_game_134);
+
+        Test.add_func ("/Reversi/reverse/Complete game 135",
+                            test_complete_reverse_game_135);
+
+        Test.add_func ("/Reversi/reverse/Complete game 136",
+                            test_complete_reverse_game_136);
+
+        Test.add_func ("/Reversi/reverse/Complete game 137",
+                            test_complete_reverse_game_137);
+
+        Test.add_func ("/Reversi/reverse/Complete game 138",
+                            test_complete_reverse_game_138);
+
+        Test.add_func ("/Reversi/reverse/Complete game 139",
+                            test_complete_reverse_game_139);
+
+        Test.add_func ("/Reversi/reverse/Complete game 140",
+                            test_complete_reverse_game_140);
+
+        Test.add_func ("/Reversi/reverse/Complete game 141",
+                            test_complete_reverse_game_141);
+
+        Test.add_func ("/Reversi/reverse/Complete game 142",
+                            test_complete_reverse_game_142);
+
+        Test.add_func ("/Reversi/reverse/Complete game 143",
+                            test_complete_reverse_game_143);
+
+        Test.add_func ("/Reversi/reverse/Complete game 144",
+                            test_complete_reverse_game_144);
+
+        Test.add_func ("/Reversi/reverse/Complete game 145",
+                            test_complete_reverse_game_145);
+
+        Test.add_func ("/Reversi/reverse/Complete game 146",
+                            test_complete_reverse_game_146);
+
+        Test.add_func ("/Reversi/reverse/Complete game 147",
+                            test_complete_reverse_game_147);
+
+        Test.add_func ("/Reversi/reverse/Complete game 148",
+                            test_complete_reverse_game_148);
+
+        Test.add_func ("/Reversi/reverse/Complete game 149",
+                            test_complete_reverse_game_149);
+
+        Test.add_func ("/Reversi/reverse/Complete game 150",
+                            test_complete_reverse_game_150);
+
+        Test.add_func ("/Reversi/reverse/Complete game 151",
+                            test_complete_reverse_game_151);
+
+        Test.add_func ("/Reversi/reverse/Complete game 152",
+                            test_complete_reverse_game_152);
+
+        Test.add_func ("/Reversi/reverse/Complete game 153",
+                            test_complete_reverse_game_153);
+
+        Test.add_func ("/Reversi/reverse/Complete game 154",
+                            test_complete_reverse_game_154);
+
+        Test.add_func ("/Reversi/reverse/Complete game 155",
+                            test_complete_reverse_game_155);
+
+        Test.add_func ("/Reversi/reverse/Complete game 156",
+                            test_complete_reverse_game_156);
+
+        Test.add_func ("/Reversi/reverse/Complete game 157",
+                            test_complete_reverse_game_157);
+
+        Test.add_func ("/Reversi/reverse/Complete game 158",
+                            test_complete_reverse_game_158);
+
+        Test.add_func ("/Reversi/reverse/Complete game 159",
+                            test_complete_reverse_game_159);
+
+        Test.add_func ("/Reversi/reverse/Complete game 160",
+                            test_complete_reverse_game_160);
+
+        Test.add_func ("/Reversi/reverse/Complete game 161",
+                            test_complete_reverse_game_161);
+
+        Test.add_func ("/Reversi/reverse/Complete game 162",
+                            test_complete_reverse_game_162);
+
+        Test.add_func ("/Reversi/reverse/Complete game 163",
+                            test_complete_reverse_game_163);
+
+        Test.add_func ("/Reversi/reverse/Complete game 164",
+                            test_complete_reverse_game_164);
+
+        Test.add_func ("/Reversi/reverse/Complete game 165",
+                            test_complete_reverse_game_165);
+
+        Test.add_func ("/Reversi/reverse/Complete game 166",
+                            test_complete_reverse_game_166);
+
+        Test.add_func ("/Reversi/reverse/Complete game 167",
+                            test_complete_reverse_game_167);
+
+        Test.add_func ("/Reversi/reverse/Complete game 168",
+                            test_complete_reverse_game_168);
+
+        Test.add_func ("/Reversi/reverse/Complete game 169",
+                            test_complete_reverse_game_169);
+
+        Test.add_func ("/Reversi/reverse/Complete game 170",
+                            test_complete_reverse_game_170);
+
+        Test.add_func ("/Reversi/reverse/Complete game 171",
+                            test_complete_reverse_game_171);
+
+        Test.add_func ("/Reversi/reverse/Complete game 172",
+                            test_complete_reverse_game_172);
+
+        Test.add_func ("/Reversi/reverse/Complete game 173",
+                            test_complete_reverse_game_173);
+
+        Test.add_func ("/Reversi/reverse/Complete game 174",
+                            test_complete_reverse_game_174);
+
+        Test.add_func ("/Reversi/reverse/Complete game 175",
+                            test_complete_reverse_game_175);
+
+        Test.add_func ("/Reversi/reverse/Complete game 176",
+                            test_complete_reverse_game_176);
+
+        Test.add_func ("/Reversi/reverse/Complete game 177",
+                            test_complete_reverse_game_177);
+
+        Test.add_func ("/Reversi/reverse/Complete game 178",
+                            test_complete_reverse_game_178);
+
+        Test.add_func ("/Reversi/reverse/Complete game 179",
+                            test_complete_reverse_game_179);
+
+        Test.add_func ("/Reversi/reverse/Complete game 180",
+                            test_complete_reverse_game_180);
+
+        Test.add_func ("/Reversi/reverse/Complete game 181",
+                            test_complete_reverse_game_181);
+
+        Test.add_func ("/Reversi/reverse/Complete game 182",
+                            test_complete_reverse_game_182);
+
+        Test.add_func ("/Reversi/reverse/Complete game 183",
+                            test_complete_reverse_game_183);
+
+        Test.add_func ("/Reversi/reverse/Complete game 184",
+                            test_complete_reverse_game_184);
+
+        Test.add_func ("/Reversi/reverse/Complete game 185",
+                            test_complete_reverse_game_185);
+
+        Test.add_func ("/Reversi/reverse/Complete game 186",
+                            test_complete_reverse_game_186);
+
+        Test.add_func ("/Reversi/reverse/Complete game 187",
+                            test_complete_reverse_game_187);
+
+        Test.add_func ("/Reversi/reverse/Complete game 188",
+                            test_complete_reverse_game_188);
+
+        Test.add_func ("/Reversi/reverse/Complete game 189",
+                            test_complete_reverse_game_189);
+
+        Test.add_func ("/Reversi/reverse/Complete game 190",
+                            test_complete_reverse_game_190);
+
+        Test.add_func ("/Reversi/reverse/Complete game 191",
+                            test_complete_reverse_game_191);
+
+        Test.add_func ("/Reversi/reverse/Complete game 192",
+                            test_complete_reverse_game_192);
+
+        Test.add_func ("/Reversi/reverse/Complete game 193",
+                            test_complete_reverse_game_193);
+
+        Test.add_func ("/Reversi/reverse/Complete game 194",
+                            test_complete_reverse_game_194);
+
+        Test.add_func ("/Reversi/reverse/Complete game 195",
+                            test_complete_reverse_game_195);
+
+        Test.add_func ("/Reversi/reverse/Complete game 196",
+                            test_complete_reverse_game_196);
+
+        Test.add_func ("/Reversi/reverse/Complete game 197",
+                            test_complete_reverse_game_197);
+
+        Test.add_func ("/Reversi/reverse/Complete game 198",
+                            test_complete_reverse_game_198);
+
+        Test.add_func ("/Reversi/reverse/Complete game 199",
+                            test_complete_reverse_game_199);
+
+        Test.add_func ("/Reversi/reverse/Complete game 200",
+                            test_complete_reverse_game_200);
+
+        Test.add_func ("/Reversi/reverse/Complete game 201",
+                            test_complete_reverse_game_201);
+
+        Test.add_func ("/Reversi/reverse/Complete game 202",
+                            test_complete_reverse_game_202);
+
+        Test.add_func ("/Reversi/reverse/Complete game 203",
+                            test_complete_reverse_game_203);
+
+        Test.add_func ("/Reversi/reverse/Complete game 204",
+                            test_complete_reverse_game_204);
+
+        Test.add_func ("/Reversi/reverse/Complete game 205",
+                            test_complete_reverse_game_205);
+
+        Test.add_func ("/Reversi/reverse/Complete game 206",
+                            test_complete_reverse_game_206);
+
+        Test.add_func ("/Reversi/reverse/Complete game 207",
+                            test_complete_reverse_game_207);
+
+        Test.add_func ("/Reversi/reverse/Complete game 208",
+                            test_complete_reverse_game_208);
+
+        Test.add_func ("/Reversi/reverse/Complete game 209",
+                            test_complete_reverse_game_209);
+
+        Test.add_func ("/Reversi/reverse/Complete game 210",
+                            test_complete_reverse_game_210);
+
+        Test.add_func ("/Reversi/reverse/Complete game 211",
+                            test_complete_reverse_game_211);
+
+        Test.add_func ("/Reversi/reverse/Complete game 212",
+                            test_complete_reverse_game_212);
+
+        Test.add_func ("/Reversi/reverse/Complete game 213",
+                            test_complete_reverse_game_213);
+
+        Test.add_func ("/Reversi/reverse/Complete game 214",
+                            test_complete_reverse_game_214);
+
+        Test.add_func ("/Reversi/reverse/Complete game 215",
+                            test_complete_reverse_game_215);
+
+        Test.add_func ("/Reversi/reverse/Complete game 216",
+                            test_complete_reverse_game_216);
+
+        Test.add_func ("/Reversi/reverse/Complete game 217",
+                            test_complete_reverse_game_217);
+
+        Test.add_func ("/Reversi/reverse/Complete game 218",
+                            test_complete_reverse_game_218);
+
+        Test.add_func ("/Reversi/reverse/Complete game 219",
+                            test_complete_reverse_game_219);
+
+        Test.add_func ("/Reversi/reverse/Complete game 220",
+                            test_complete_reverse_game_220);
+
+        Test.add_func ("/Reversi/reverse/Complete game 221",
+                            test_complete_reverse_game_221);
+
+        Test.add_func ("/Reversi/reverse/Complete game 222",
+                            test_complete_reverse_game_222);
+
+        Test.add_func ("/Reversi/reverse/Complete game 223",
+                            test_complete_reverse_game_223);
+
+        Test.add_func ("/Reversi/reverse/Complete game 224",
+                            test_complete_reverse_game_224);
+
+        Test.add_func ("/Reversi/reverse/Complete game 225",
+                            test_complete_reverse_game_225);
+
+        Test.add_func ("/Reversi/reverse/Complete game 226",
+                            test_complete_reverse_game_226);
+
+        Test.add_func ("/Reversi/reverse/Complete game 227",
+                            test_complete_reverse_game_227);
+
+        Test.add_func ("/Reversi/reverse/Complete game 228",
+                            test_complete_reverse_game_228);
+
+        Test.add_func ("/Reversi/reverse/Complete game 229",
+                            test_complete_reverse_game_229);
+
+        Test.add_func ("/Reversi/reverse/Complete game 230",
+                            test_complete_reverse_game_230);
+
+        Test.add_func ("/Reversi/reverse/Complete game 231",
+                            test_complete_reverse_game_231);
+
+        Test.add_func ("/Reversi/reverse/Complete game 232",
+                            test_complete_reverse_game_232);
+
+        Test.add_func ("/Reversi/reverse/Complete game 233",
+                            test_complete_reverse_game_233);
+
+        Test.add_func ("/Reversi/reverse/Complete game 234",
+                            test_complete_reverse_game_234);
+
+        Test.add_func ("/Reversi/reverse/Complete game 235",
+                            test_complete_reverse_game_235);
+
+        Test.add_func ("/Reversi/reverse/Complete game 236",
+                            test_complete_reverse_game_236);
+
+        /* parallel start position */
+        Test.add_func ("/Reversi/reverse/Complete game 237",
+                            test_complete_reverse_game_237);
+
+        Test.add_func ("/Reversi/reverse/Complete game 238",
+                            test_complete_reverse_game_238);
+
+        Test.add_func ("/Reversi/reverse/Complete game 239",
+                            test_complete_reverse_game_239);
+
+        Test.add_func ("/Reversi/reverse/Complete game 240",
+                            test_complete_reverse_game_240);
+
+        Test.add_func ("/Reversi/reverse/Complete game 241",
+                            test_complete_reverse_game_241);
+
+        Test.add_func ("/Reversi/reverse/Complete game 242",
+                            test_complete_reverse_game_242);
+
+        Test.add_func ("/Reversi/reverse/Complete game 243",
+                            test_complete_reverse_game_243);
+
+        Test.add_func ("/Reversi/reverse/Complete game 244",
+                            test_complete_reverse_game_244);
+
+        Test.add_func ("/Reversi/reverse/Complete game 245",
+                            test_complete_reverse_game_245);
+
+        Test.add_func ("/Reversi/reverse/Complete game 246",
+                            test_complete_reverse_game_246);
+
+        Test.add_func ("/Reversi/reverse/Complete game 247",
+                            test_complete_reverse_game_247);
+
+        Test.add_func ("/Reversi/reverse/Complete game 248",
+                            test_complete_reverse_game_248);
+
+        Test.add_func ("/Reversi/reverse/Complete game 249",
+                            test_complete_reverse_game_249);
+
+        Test.add_func ("/Reversi/reverse/Complete game 250",
+                            test_complete_reverse_game_250);
+
+        Test.add_func ("/Reversi/reverse/Complete game 251",
+                            test_complete_reverse_game_251);
+
+        Test.add_func ("/Reversi/reverse/Complete game 252",
+                            test_complete_reverse_game_252);
+
+        Test.add_func ("/Reversi/reverse/Complete game 253",
+                            test_complete_reverse_game_253);
+
+        Test.add_func ("/Reversi/reverse/Complete game 254",
+                            test_complete_reverse_game_254);
+
+        Test.add_func ("/Reversi/reverse/Complete game 255",
+                            test_complete_reverse_game_255);
+
+        Test.add_func ("/Reversi/reverse/Complete game 256",
+                            test_complete_reverse_game_256);
+
+        Test.add_func ("/Reversi/reverse/Complete game 257",
+                            test_complete_reverse_game_257);
+
+        Test.add_func ("/Reversi/reverse/Complete game 258",
+                            test_complete_reverse_game_258);
+
+        Test.add_func ("/Reversi/reverse/Complete game 259",
+                            test_complete_reverse_game_259);
+
+        Test.add_func ("/Reversi/reverse/Complete game 260",
+                            test_complete_reverse_game_260);
+
+        Test.add_func ("/Reversi/reverse/Complete game 261",
+                            test_complete_reverse_game_261);
+
+        Test.add_func ("/Reversi/reverse/Complete game 262",
+                            test_complete_reverse_game_262);
+
+        Test.add_func ("/Reversi/reverse/Complete game 263",
+                            test_complete_reverse_game_263);
+
+        Test.add_func ("/Reversi/reverse/Complete game 264",
+                            test_complete_reverse_game_264);
+
+        Test.add_func ("/Reversi/reverse/Complete game 265",
+                            test_complete_reverse_game_265);
+
+        Test.add_func ("/Reversi/reverse/Complete game 266",
+                            test_complete_reverse_game_266);
+
+        Test.add_func ("/Reversi/reverse/Complete game 267",
+                            test_complete_reverse_game_267);
+
+        Test.add_func ("/Reversi/reverse/Complete game 268",
+                            test_complete_reverse_game_268);
+
+        Test.add_func ("/Reversi/reverse/Complete game 269",
+                            test_complete_reverse_game_269);
+
+        Test.add_func ("/Reversi/reverse/Complete game 270",
+                            test_complete_reverse_game_270);
+
+        Test.add_func ("/Reversi/reverse/Complete game 271",
+                            test_complete_reverse_game_271);
+
+        Test.add_func ("/Reversi/reverse/Complete game 272",
+                            test_complete_reverse_game_272);
+
+        Test.add_func ("/Reversi/reverse/Complete game 273",
+                            test_complete_reverse_game_273);
+
+        Test.add_func ("/Reversi/reverse/Complete game 274",
+                            test_complete_reverse_game_274);
+
+        Test.add_func ("/Reversi/reverse/Complete game 275",
+                            test_complete_reverse_game_275);
+
+        Test.add_func ("/Reversi/reverse/Complete game 276",
+                            test_complete_reverse_game_276);
+
+        Test.add_func ("/Reversi/reverse/Complete game 277",
+                            test_complete_reverse_game_277);
+
+        Test.add_func ("/Reversi/reverse/Complete game 278",
+                            test_complete_reverse_game_278);
+
+        Test.add_func ("/Reversi/reverse/Complete game 279",
+                            test_complete_reverse_game_279);
+
+        Test.add_func ("/Reversi/reverse/Complete game 280",
+                            test_complete_reverse_game_280);
+
+        Test.add_func ("/Reversi/reverse/Complete game 281",
+                            test_complete_reverse_game_281);
+
+        Test.add_func ("/Reversi/reverse/Complete game 282",
+                            test_complete_reverse_game_282);
+
+        Test.add_func ("/Reversi/reverse/Complete game 283",
+                            test_complete_reverse_game_283);
+
+        Test.add_func ("/Reversi/reverse/Complete game 284",
+                            test_complete_reverse_game_284);
+
+        Test.add_func ("/Reversi/reverse/Complete game 285",
+                            test_complete_reverse_game_285);
+
+        Test.add_func ("/Reversi/reverse/Complete game 286",
+                            test_complete_reverse_game_286);
+
+        Test.add_func ("/Reversi/reverse/Complete game 287",
+                            test_complete_reverse_game_287);
+
+        Test.add_func ("/Reversi/reverse/Complete game 288",
+                            test_complete_reverse_game_288);
+
+        Test.add_func ("/Reversi/reverse/Complete game 289",
+                            test_complete_reverse_game_289);
+
+        Test.add_func ("/Reversi/reverse/Complete game 290",
+                            test_complete_reverse_game_290);
+
+        Test.add_func ("/Reversi/reverse/Complete game 291",
+                            test_complete_reverse_game_291);
+
+        Test.add_func ("/Reversi/reverse/Complete game 292",
+                            test_complete_reverse_game_292);
+
+        Test.add_func ("/Reversi/reverse/Complete game 293",
+                            test_complete_reverse_game_293);
+
+        Test.add_func ("/Reversi/reverse/Complete game 294",
+                            test_complete_reverse_game_294);
+
+        Test.add_func ("/Reversi/reverse/Complete game 295",
+                            test_complete_reverse_game_295);
+
+        Test.add_func ("/Reversi/reverse/Complete game 296",
+                            test_complete_reverse_game_296);
+
+        Test.add_func ("/Reversi/reverse/Complete game 297",
+                            test_complete_reverse_game_297);
+
+        Test.add_func ("/Reversi/reverse/Complete game 298",
+                            test_complete_reverse_game_298);
+
+        Test.add_func ("/Reversi/reverse/Complete game 299",
+                            test_complete_reverse_game_299);
+
+        Test.add_func ("/Reversi/reverse/Complete game 300",
+                            test_complete_reverse_game_300);
+
+        Test.add_func ("/Reversi/reverse/Complete game 301",
+                            test_complete_reverse_game_301);
+
+        Test.add_func ("/Reversi/reverse/Complete game 302",
+                            test_complete_reverse_game_302);
+
+        Test.add_func ("/Reversi/reverse/Complete game 303",
+                            test_complete_reverse_game_303);
+
+        Test.add_func ("/Reversi/reverse/Complete game 304",
+                            test_complete_reverse_game_304);
+
+        Test.add_func ("/Reversi/reverse/Complete game 305",
+                            test_complete_reverse_game_305);
+
+        Test.add_func ("/Reversi/reverse/Complete game 306",
+                            test_complete_reverse_game_306);
+
+        Test.add_func ("/Reversi/reverse/Complete game 307",
+                            test_complete_reverse_game_307);
+
+        Test.add_func ("/Reversi/reverse/Complete game 308",
+                            test_complete_reverse_game_308);
+
+        Test.add_func ("/Reversi/reverse/Complete game 309",
+                            test_complete_reverse_game_309);
+
+        Test.add_func ("/Reversi/reverse/Complete game 310",
+                            test_complete_reverse_game_310);
+
+        Test.add_func ("/Reversi/reverse/Complete game 311",
+                            test_complete_reverse_game_311);
+
+        Test.add_func ("/Reversi/reverse/Complete game 312",
+                            test_complete_reverse_game_312);
+
+        Test.add_func ("/Reversi/reverse/Complete game 313",
+                            test_complete_reverse_game_313);
+
+        Test.add_func ("/Reversi/reverse/Complete game 314",
+                            test_complete_reverse_game_314);
+
+        Test.add_func ("/Reversi/reverse/Complete game 315",
+                            test_complete_reverse_game_315);
+
+        Test.add_func ("/Reversi/reverse/Complete game 316",
+                            test_complete_reverse_game_316);
+
+        Test.add_func ("/Reversi/reverse/Complete game 317",
+                            test_complete_reverse_game_317);
+
+        Test.add_func ("/Reversi/reverse/Complete game 318",
+                            test_complete_reverse_game_318);
+
+        Test.add_func ("/Reversi/reverse/Complete game 319",
+                            test_complete_reverse_game_319);
+
+        Test.add_func ("/Reversi/reverse/Complete game 320",
+                            test_complete_reverse_game_320);
+
+        Test.add_func ("/Reversi/reverse/Complete game 321",
+                            test_complete_reverse_game_321);
+
+        Test.add_func ("/Reversi/reverse/Complete game 322",
+                            test_complete_reverse_game_322);
+
+        Test.add_func ("/Reversi/reverse/Complete game 323",
+                            test_complete_reverse_game_323);
+
+        Test.add_func ("/Reversi/reverse/Complete game 324",
+                            test_complete_reverse_game_324);
+
+        Test.add_func ("/Reversi/reverse/Complete game 325",
+                            test_complete_reverse_game_325);
+
+        Test.add_func ("/Reversi/reverse/Complete game 326",
+                            test_complete_reverse_game_326);
+
+        Test.add_func ("/Reversi/reverse/Complete game 327",
+                            test_complete_reverse_game_327);
+
+        Test.add_func ("/Reversi/reverse/Complete game 328",
+                            test_complete_reverse_game_328);
+
+        Test.add_func ("/Reversi/reverse/Complete game 329",
+                            test_complete_reverse_game_329);
+
+        Test.add_func ("/Reversi/reverse/Complete game 330",
+                            test_complete_reverse_game_330);
+
+        Test.add_func ("/Reversi/reverse/Complete game 331",
+                            test_complete_reverse_game_331);
+
+        Test.add_func ("/Reversi/reverse/Complete game 332",
+                            test_complete_reverse_game_332);
+
+        Test.add_func ("/Reversi/reverse/Complete game 333",
+                            test_complete_reverse_game_333);
+
+        Test.add_func ("/Reversi/reverse/Complete game 334",
+                            test_complete_reverse_game_334);
+
+        Test.add_func ("/Reversi/reverse/Complete game 335",
+                            test_complete_reverse_game_335);
+
+        Test.add_func ("/Reversi/reverse/Complete game 336",
+                            test_complete_reverse_game_336);
+
+        Test.add_func ("/Reversi/reverse/Complete game 337",
+                            test_complete_reverse_game_337);
+
+        Test.add_func ("/Reversi/reverse/Complete game 338",
+                            test_complete_reverse_game_338);
+
+        Test.add_func ("/Reversi/reverse/Complete game 339",
+                            test_complete_reverse_game_339);
+
+        Test.add_func ("/Reversi/reverse/Complete game 340",
+                            test_complete_reverse_game_340);
+
+        Test.add_func ("/Reversi/reverse/Complete game 341",
+                            test_complete_reverse_game_341);
+
+        Test.add_func ("/Reversi/reverse/Complete game 342",
+                            test_complete_reverse_game_342);
+
+        Test.add_func ("/Reversi/reverse/Complete game 343",
+                            test_complete_reverse_game_343);
+
+        Test.add_func ("/Reversi/reverse/Complete game 344",
+                            test_complete_reverse_game_344);
+
+        Test.add_func ("/Reversi/reverse/Complete game 345",
+                            test_complete_reverse_game_345);
+
+        Test.add_func ("/Reversi/reverse/Complete game 346",
+                            test_complete_reverse_game_346);
+
+        Test.add_func ("/Reversi/reverse/Complete game 347",
+                            test_complete_reverse_game_347);
+
+        Test.add_func ("/Reversi/reverse/Complete game 348",
+                            test_complete_reverse_game_348);
+
+        Test.add_func ("/Reversi/reverse/Complete game 349",
+                            test_complete_reverse_game_349);
+
+        Test.add_func ("/Reversi/reverse/Complete game 350",
+                            test_complete_reverse_game_350);
+
+        Test.add_func ("/Reversi/reverse/Complete game 351",
+                            test_complete_reverse_game_351);
+
+        Test.add_func ("/Reversi/reverse/Complete game 352",
+                            test_complete_reverse_game_352);
+
+        Test.add_func ("/Reversi/reverse/Complete game 353",
+                            test_complete_reverse_game_353);
+
+        Test.add_func ("/Reversi/reverse/Complete game 354",
+                            test_complete_reverse_game_354);
+
+        Test.add_func ("/Reversi/reverse/Complete game 355",
+                            test_complete_reverse_game_355);
+
+        Test.add_func ("/Reversi/reverse/Complete game 356",
+                            test_complete_reverse_game_356);
+
+        Test.add_func ("/Reversi/reverse/Complete game 357",
+                            test_complete_reverse_game_357);
+
+        Test.add_func ("/Reversi/reverse/Complete game 358",
+                            test_complete_reverse_game_358);
+
+        Test.add_func ("/Reversi/reverse/Complete game 359",
+                            test_complete_reverse_game_359);
+
+        Test.add_func ("/Reversi/reverse/Complete game 360",
+                            test_complete_reverse_game_360);
+
+        Test.add_func ("/Reversi/reverse/Complete game 361",
+                            test_complete_reverse_game_361);
+
+        Test.add_func ("/Reversi/reverse/Complete game 362",
+                            test_complete_reverse_game_362);
+
+        Test.add_func ("/Reversi/reverse/Complete game 363",
+                            test_complete_reverse_game_363);
+
+        Test.add_func ("/Reversi/reverse/Complete game 364",
+                            test_complete_reverse_game_364);
+
+        Test.add_func ("/Reversi/reverse/Complete game 365",
+                            test_complete_reverse_game_365);
+
+        Test.add_func ("/Reversi/reverse/Complete game 366",
+                            test_complete_reverse_game_366);
+
+        Test.add_func ("/Reversi/reverse/Complete game 367",
+                            test_complete_reverse_game_367);
+
+        Test.add_func ("/Reversi/reverse/Complete game 368",
+                            test_complete_reverse_game_368);
+
+        Test.add_func ("/Reversi/reverse/Complete game 369",
+                            test_complete_reverse_game_369);
+
+        Test.add_func ("/Reversi/reverse/Complete game 370",
+                            test_complete_reverse_game_370);
+
+        Test.add_func ("/Reversi/reverse/Complete game 371",
+                            test_complete_reverse_game_371);
+
+        Test.add_func ("/Reversi/reverse/Complete game 372",
+                            test_complete_reverse_game_372);
+
+        Test.add_func ("/Reversi/reverse/Complete game 373",
+                            test_complete_reverse_game_373);
+
+        Test.add_func ("/Reversi/reverse/Complete game 374",
+                            test_complete_reverse_game_374);
+
+        Test.add_func ("/Reversi/reverse/Complete game 375",
+                            test_complete_reverse_game_375);
+
+        Test.add_func ("/Reversi/reverse/Complete game 376",
+                            test_complete_reverse_game_376);
+
+        Test.add_func ("/Reversi/reverse/Complete game 377",
+                            test_complete_reverse_game_377);
+
+        Test.add_func ("/Reversi/reverse/Complete game 378",
+                            test_complete_reverse_game_378);
+
+        Test.add_func ("/Reversi/reverse/Complete game 379",
+                            test_complete_reverse_game_379);
+
+        Test.add_func ("/Reversi/reverse/Complete game 380",
+                            test_complete_reverse_game_380);
+
+        Test.add_func ("/Reversi/reverse/Complete game 381",
+                            test_complete_reverse_game_381);
+
+        Test.add_func ("/Reversi/reverse/Complete game 382",
+                            test_complete_reverse_game_382);
+
+        Test.add_func ("/Reversi/reverse/Complete game 383",
+                            test_complete_reverse_game_383);
+
+        Test.add_func ("/Reversi/reverse/Complete game 384",
+                            test_complete_reverse_game_384);
+
+        Test.add_func ("/Reversi/reverse/Complete game 385",
+                            test_complete_reverse_game_385);
+
+        Test.add_func ("/Reversi/reverse/Complete game 386",
+                            test_complete_reverse_game_386);
+
+        Test.add_func ("/Reversi/reverse/Complete game 387",
+                            test_complete_reverse_game_387);
+
+        Test.add_func ("/Reversi/reverse/Complete game 388",
+                            test_complete_reverse_game_388);
+
+        Test.add_func ("/Reversi/reverse/Complete game 389",
+                            test_complete_reverse_game_389);
+
+        Test.add_func ("/Reversi/reverse/Complete game 390",
+                            test_complete_reverse_game_390);
+
+        Test.add_func ("/Reversi/reverse/Complete game 391",
+                            test_complete_reverse_game_391);
+
+        Test.add_func ("/Reversi/reverse/Complete game 392",
+                            test_complete_reverse_game_392);
+
+        Test.add_func ("/Reversi/reverse/Complete game 393",
+                            test_complete_reverse_game_393);
+
+        Test.add_func ("/Reversi/reverse/Complete game 394",
+                            test_complete_reverse_game_394);
+
+        Test.add_func ("/Reversi/reverse/Complete game 395",
+                            test_complete_reverse_game_395);
+
+        Test.add_func ("/Reversi/reverse/Complete game 396",
+                            test_complete_reverse_game_396);
+
+        Test.add_func ("/Reversi/reverse/Complete game 397",
+                            test_complete_reverse_game_397);
+
+        Test.add_func ("/Reversi/reverse/Complete game 398",
+                            test_complete_reverse_game_398);
+
+        Test.add_func ("/Reversi/reverse/Complete game 399",
+                            test_complete_reverse_game_399);
+
+        Test.add_func ("/Reversi/reverse/Complete game 400",
+                            test_complete_reverse_game_400);
+
+        Test.add_func ("/Reversi/reverse/Complete game 401",
+                            test_complete_reverse_game_401);
+
+        Test.add_func ("/Reversi/reverse/Complete game 402",
+                            test_complete_reverse_game_402);
+
+        Test.add_func ("/Reversi/reverse/Complete game 403",
+                            test_complete_reverse_game_403);
+
+        Test.add_func ("/Reversi/reverse/Complete game 404",
+                            test_complete_reverse_game_404);
+
+        Test.add_func ("/Reversi/reverse/Complete game 405",
+                            test_complete_reverse_game_405);
+
+        Test.add_func ("/Reversi/reverse/Complete game 406",
+                            test_complete_reverse_game_406);
+
+        Test.add_func ("/Reversi/reverse/Complete game 407",
+                            test_complete_reverse_game_407);
+
+        Test.add_func ("/Reversi/reverse/Complete game 408",
+                            test_complete_reverse_game_408);
+
+        Test.add_func ("/Reversi/reverse/Complete game 409",
+                            test_complete_reverse_game_409);
+
+        Test.add_func ("/Reversi/reverse/Complete game 410",
+                            test_complete_reverse_game_410);
+
+        Test.add_func ("/Reversi/reverse/Complete game 411",
+                            test_complete_reverse_game_411);
+
+        Test.add_func ("/Reversi/reverse/Complete game 412",
+                            test_complete_reverse_game_412);
+
+        Test.add_func ("/Reversi/reverse/Complete game 413",
+                            test_complete_reverse_game_413);
+
+        Test.add_func ("/Reversi/reverse/Complete game 414",
+                            test_complete_reverse_game_414);
+
+        Test.add_func ("/Reversi/reverse/Complete game 415",
+                            test_complete_reverse_game_415);
+
+        Test.add_func ("/Reversi/reverse/Complete game 416",
+                            test_complete_reverse_game_416);
+
+        Test.add_func ("/Reversi/reverse/Complete game 417",
+                            test_complete_reverse_game_417);
+
+        Test.add_func ("/Reversi/reverse/Complete game 418",
+                            test_complete_reverse_game_418);
+
+        Test.add_func ("/Reversi/reverse/Complete game 419",
+                            test_complete_reverse_game_419);
+
+        Test.add_func ("/Reversi/reverse/Complete game 420",
+                            test_complete_reverse_game_420);
+
+        Test.add_func ("/Reversi/reverse/Complete game 421",
+                            test_complete_reverse_game_421);
+
+        Test.add_func ("/Reversi/reverse/Complete game 422",
+                            test_complete_reverse_game_422);
+
+        Test.add_func ("/Reversi/reverse/Complete game 423",
+                            test_complete_reverse_game_423);
+
+        Test.add_func ("/Reversi/reverse/Complete game 424",
+                            test_complete_reverse_game_424);
+
+        Test.add_func ("/Reversi/reverse/Complete game 425",
+                            test_complete_reverse_game_425);
+
+        Test.add_func ("/Reversi/reverse/Complete game 426",
+                            test_complete_reverse_game_426);
+
+        Test.add_func ("/Reversi/reverse/Complete game 427",
+                            test_complete_reverse_game_427);
+
+        Test.add_func ("/Reversi/reverse/Complete game 428",
+                            test_complete_reverse_game_428);
+
+        Test.add_func ("/Reversi/reverse/Complete game 429",
+                            test_complete_reverse_game_429);
+
+        Test.add_func ("/Reversi/reverse/Complete game 430",
+                            test_complete_reverse_game_430);
+
+        Test.add_func ("/Reversi/reverse/Complete game 431",
+                            test_complete_reverse_game_431);
+
+        Test.add_func ("/Reversi/reverse/Complete game 432",
+                            test_complete_reverse_game_432);
+
+        Test.add_func ("/Reversi/reverse/Complete game 433",
+                            test_complete_reverse_game_433);
+
+        Test.add_func ("/Reversi/reverse/Complete game 434",
+                            test_complete_reverse_game_434);
+
+        Test.add_func ("/Reversi/reverse/Complete game 435",
+                            test_complete_reverse_game_435);
+
+        Test.add_func ("/Reversi/reverse/Complete game 436",
+                            test_complete_reverse_game_436);
+
+        Test.add_func ("/Reversi/reverse/Complete game 437",
+                            test_complete_reverse_game_437);
+
+        Test.add_func ("/Reversi/reverse/Complete game 438",
+                            test_complete_reverse_game_438);
+
+        Test.add_func ("/Reversi/reverse/Complete game 439",
+                            test_complete_reverse_game_439);
+
+        Test.add_func ("/Reversi/reverse/Complete game 440",
+                            test_complete_reverse_game_440);
+
+        Test.add_func ("/Reversi/reverse/Complete game 441",
+                            test_complete_reverse_game_441);
+
+        Test.add_func ("/Reversi/reverse/Complete game 442",
+                            test_complete_reverse_game_442);
+
+        Test.add_func ("/Reversi/reverse/Complete game 443",
+                            test_complete_reverse_game_443);
+
+        Test.add_func ("/Reversi/reverse/Complete game 444",
+                            test_complete_reverse_game_444);
+
+        Test.add_func ("/Reversi/reverse/Complete game 445",
+                            test_complete_reverse_game_445);
+
+        Test.add_func ("/Reversi/reverse/Complete game 446",
+                            test_complete_reverse_game_446);
+
+        Test.add_func ("/Reversi/reverse/Complete game 447",
+                            test_complete_reverse_game_447);
+
+        Test.add_func ("/Reversi/reverse/Complete game 448",
+                            test_complete_reverse_game_448);
+
+        Test.add_func ("/Reversi/reverse/Complete game 449",
+                            test_complete_reverse_game_449);
+
+        Test.add_func ("/Reversi/reverse/Complete game 450",
+                            test_complete_reverse_game_450);
+
+        Test.add_func ("/Reversi/reverse/Complete game 451",
+                            test_complete_reverse_game_451);
+
+        Test.add_func ("/Reversi/reverse/Complete game 452",
+                            test_complete_reverse_game_452);
+
+        Test.add_func ("/Reversi/reverse/Complete game 453",
+                            test_complete_reverse_game_453);
+
+        Test.add_func ("/Reversi/reverse/Complete game 454",
+                            test_complete_reverse_game_454);
+
+        Test.add_func ("/Reversi/reverse/Complete game 455",
+                            test_complete_reverse_game_455);
+
+        Test.add_func ("/Reversi/reverse/Complete game 456",
+                            test_complete_reverse_game_456);
+
+        Test.add_func ("/Reversi/reverse/Complete game 457",
+                            test_complete_reverse_game_457);
+
+        Test.add_func ("/Reversi/reverse/Complete game 458",
+                            test_complete_reverse_game_458);
+
+        Test.add_func ("/Reversi/reverse/Complete game 459",
+                            test_complete_reverse_game_459);
+
+        Test.add_func ("/Reversi/reverse/Complete game 460",
+                            test_complete_reverse_game_460);
+
+        Test.add_func ("/Reversi/reverse/Complete game 461",
+                            test_complete_reverse_game_461);
+
+        Test.add_func ("/Reversi/reverse/Complete game 462",
+                            test_complete_reverse_game_462);
+
+        Test.add_func ("/Reversi/reverse/Complete game 463",
+                            test_complete_reverse_game_463);
+
+        Test.add_func ("/Reversi/reverse/Complete game 464",
+                            test_complete_reverse_game_464);
+
+        Test.add_func ("/Reversi/reverse/Complete game 465",
+                            test_complete_reverse_game_465);
+
+        Test.add_func ("/Reversi/reverse/Complete game 466",
+                            test_complete_reverse_game_466);
+
+        Test.add_func ("/Reversi/reverse/Complete game 467",
+                            test_complete_reverse_game_467);
+
+        Test.add_func ("/Reversi/reverse/Complete game 468",
+                            test_complete_reverse_game_468);
+
+        Test.add_func ("/Reversi/reverse/Complete game 469",
+                            test_complete_reverse_game_469);
+
+        Test.add_func ("/Reversi/reverse/Complete game 470",
+                            test_complete_reverse_game_470);
+
+        Test.add_func ("/Reversi/reverse/Complete game 471",
+                            test_complete_reverse_game_471);
+
+        Test.add_func ("/Reversi/reverse/Complete game 472",
+                            test_complete_reverse_game_472);
+
+        Test.add_func ("/Reversi/reverse/Complete game 473",
+                            test_complete_reverse_game_473);
+
+        Test.add_func ("/Reversi/reverse/Complete game 474",
+                            test_complete_reverse_game_474);
+
+        Test.add_func ("/Reversi/reverse/Complete game 475",
+                            test_complete_reverse_game_475);
+
+        Test.add_func ("/Reversi/reverse/Complete game 476",
+                            test_complete_reverse_game_476);
+
+        Test.add_func ("/Reversi/reverse/Complete game 477",
+                            test_complete_reverse_game_477);
+
+        Test.add_func ("/Reversi/reverse/Complete game 478",
+                            test_complete_reverse_game_478);
+
+        Test.add_func ("/Reversi/reverse/Complete game 479",
+                            test_complete_reverse_game_479);
+
+        Test.add_func ("/Reversi/reverse/Complete game 480",
+                            test_complete_reverse_game_480);
+
+        Test.add_func ("/Reversi/reverse/Complete game 481",
+                            test_complete_reverse_game_481);
+
+        Test.add_func ("/Reversi/reverse/Complete game 482",
+                            test_complete_reverse_game_482);
+
+        Test.add_func ("/Reversi/reverse/Complete game 483",
+                            test_complete_reverse_game_483);
+
+        Test.add_func ("/Reversi/reverse/Complete game 484",
+                            test_complete_reverse_game_484);
+
+        Test.add_func ("/Reversi/reverse/Complete game 485",
+                            test_complete_reverse_game_485);
+
+        Test.add_func ("/Reversi/reverse/Complete game 486",
+                            test_complete_reverse_game_486);
+
+        Test.add_func ("/Reversi/reverse/Complete game 487",
+                            test_complete_reverse_game_487);
+
+        Test.add_func ("/Reversi/reverse/Complete game 488",
+                            test_complete_reverse_game_488);
+
+        Test.add_func ("/Reversi/reverse/Complete game 489",
+                            test_complete_reverse_game_489);
+
+        Test.add_func ("/Reversi/reverse/Complete game 490",
+                            test_complete_reverse_game_490);
+
+        Test.add_func ("/Reversi/reverse/Complete game 491",
+                            test_complete_reverse_game_491);
+
+        Test.add_func ("/Reversi/reverse/Complete game 492",
+                            test_complete_reverse_game_492);
+
+        Test.add_func ("/Reversi/reverse/Complete game 493",
+                            test_complete_reverse_game_493);
+
+        Test.add_func ("/Reversi/reverse/Complete game 494",
+                            test_complete_reverse_game_494);
+
+        Test.add_func ("/Reversi/reverse/Complete game 495",
+                            test_complete_reverse_game_495);
+
+        Test.add_func ("/Reversi/reverse/Complete game 496",
+                            test_complete_reverse_game_496);
+
+        Test.add_func ("/Reversi/reverse/Complete game 497",
+                            test_complete_reverse_game_497);
+
+        Test.add_func ("/Reversi/reverse/Complete game 498",
+                            test_complete_reverse_game_498);
+
+        Test.add_func ("/Reversi/reverse/Complete game 499",
+                            test_complete_reverse_game_499);
+
+        Test.add_func ("/Reversi/reverse/Complete game 500",
+                            test_complete_reverse_game_500);
+
+        Test.add_func ("/Reversi/reverse/Complete game 501",
+                            test_complete_reverse_game_501);
+
+        Test.add_func ("/Reversi/reverse/Complete game 502",
+                            test_complete_reverse_game_502);
+
+        Test.add_func ("/Reversi/reverse/Complete game 503",
+                            test_complete_reverse_game_503);
+
+        Test.add_func ("/Reversi/reverse/Complete game 504",
+                            test_complete_reverse_game_504);
+
+        Test.add_func ("/Reversi/reverse/Complete game 505",
+                            test_complete_reverse_game_505);
+
+        Test.add_func ("/Reversi/reverse/Complete game 506",
+                            test_complete_reverse_game_506);
+
+        Test.add_func ("/Reversi/reverse/Complete game 507",
+                            test_complete_reverse_game_507);
+
+        Test.add_func ("/Reversi/reverse/Complete game 508",
+                            test_complete_reverse_game_508);
+
+        Test.add_func ("/Reversi/reverse/Complete game 509",
+                            test_complete_reverse_game_509);
+
+        Test.add_func ("/Reversi/reverse/Complete game 510",
+                            test_complete_reverse_game_510);
+
+        Test.add_func ("/Reversi/reverse/Complete game 511",
+                            test_complete_reverse_game_511);
+
+        Test.add_func ("/Reversi/reverse/Complete game 512",
+                            test_complete_reverse_game_512);
+
+        Test.add_func ("/Reversi/reverse/Complete game 513",
+                            test_complete_reverse_game_513);
+    }
+
+    /*\
+    * * perfs tests
+    \*/
+
+    private static inline void test_complete_reverse_game_1 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . D L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_2 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L L .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_3 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_4 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_5 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_6 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reverse_game_7 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_8 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_9 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L L .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_10 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_11 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_12 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_13 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_14 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L L L .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_15 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_16 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_17 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+    }
+
+    private static inline void test_complete_reverse_game_18 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_19 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_20 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_21 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_22 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_23 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_24 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_25 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_26 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_27 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_28 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_29 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . L . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_30 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_31 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_32 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_33 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_34 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+    }
+
+    private static inline void test_complete_reverse_game_35 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_36 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_37 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reverse_game_38 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_39 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_40 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_41 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+    }
+
+    private static inline void test_complete_reverse_game_42 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_43 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_44 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 2));
+    }
+
+    private static inline void test_complete_reverse_game_45 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . D L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_46 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . D L . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_47 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . D L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_48 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . L L L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_49 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L D . .",
+                           /* 5 */ " . . . L . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_50 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_51 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . L . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_52 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . L . L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_53 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+    }
+
+    private static inline void test_complete_reverse_game_54 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_55 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_56 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+    }
+
+    private static inline void test_complete_reverse_game_57 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_58 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_59 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_60 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_61 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_62 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L D .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_63 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_64 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L D D .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_65 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_66 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_67 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_68 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_69 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_70 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_71 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+    }
+
+    private static inline void test_complete_reverse_game_72 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_73 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_74 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_75 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_76 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_77 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_78 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_79 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_80 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_81 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_82 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 1));
+    }
+
+    private static inline void test_complete_reverse_game_83 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_84 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 1));
+    }
+
+    private static inline void test_complete_reverse_game_85 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_86 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . L . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_87 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_88 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_89 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . L . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_90 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_91 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_92 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+    }
+
+    private static inline void test_complete_reverse_game_93 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_94 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_95 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+    }
+
+    private static inline void test_complete_reverse_game_96 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . L . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_97 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_98 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_99 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_100 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_101 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . D . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_102 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . D D L . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_103 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_104 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_105 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_106 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . D L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_107 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D D D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_108 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_109 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D L D . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_110 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_111 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+    }
+
+    private static inline void test_complete_reverse_game_112 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . L . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_113 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . L . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_114 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_115 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_116 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+    }
+
+    private static inline void test_complete_reverse_game_117 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_118 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_119 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reverse_game_120 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_121 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_122 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_123 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_124 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_125 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_126 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_127 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reverse_game_128 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . L . . . . .",
+                           /* 2 */ " . . . L L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reverse_game_129 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reverse_game_130 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_131 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_132 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . L .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reverse_game_133 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . L .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_134 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+    }
+
+    private static inline void test_complete_reverse_game_135 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_136 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L . . .",
+                           /* 2 */ " . . . D L D . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_137 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D D D . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_138 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D D D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_139 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_140 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . D D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_141 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . D D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_142 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . D D . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 1));
+    }
+
+    private static inline void test_complete_reverse_game_143 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L D D . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 1));
+    }
+
+    private static inline void test_complete_reverse_game_144 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . L . . D . .",
+                           /* 2 */ " . . . L D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_145 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_146 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_147 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_148 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_149 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_150 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+    }
+
+    private static inline void test_complete_reverse_game_151 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_152 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_153 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+    }
+
+    private static inline void test_complete_reverse_game_154 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_155 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_156 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_157 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_158 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_159 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_160 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_161 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_162 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_163 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_164 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_165 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_166 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_167 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_168 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_169 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_170 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . L L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_171 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_172 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_173 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_174 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+    }
+
+    private static inline void test_complete_reverse_game_175 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . L L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_176 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_177 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_178 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_179 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_180 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_181 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . D D L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_182 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_183 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . L . . . . . .",
+                           /* 2 */ " . D L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_184 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_185 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_186 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_187 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_188 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_189 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+    }
+
+    private static inline void test_complete_reverse_game_190 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_191 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_192 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+    }
+
+    private static inline void test_complete_reverse_game_193 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L . L .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_194 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . L .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_195 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L D D . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_196 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L . . .",
+                           /* 3 */ " . . D L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_197 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L L L .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_198 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_199 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L D . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_200 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_201 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_202 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_203 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L . D . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_204 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_205 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_206 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_207 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_208 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_209 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reverse_game_210 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_211 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+    }
+
+    private static inline void test_complete_reverse_game_212 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_213 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_214 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_215 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+    }
+
+    private static inline void test_complete_reverse_game_216 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_217 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_218 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_219 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_220 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_221 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_222 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_223 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 4));
+    }
+
+    private static inline void test_complete_reverse_game_224 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 4));
+    }
+
+    private static inline void test_complete_reverse_game_225 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_226 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_227 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_228 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+    }
+
+    private static inline void test_complete_reverse_game_229 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_230 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_231 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . L L L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_232 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_233 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_234 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_235 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_236 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . L L L D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_237 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . L D .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_238 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_239 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_240 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_241 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_242 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_243 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+    }
+
+    private static inline void test_complete_reverse_game_244 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_245 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . L .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_246 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 1));
+    }
+
+    private static inline void test_complete_reverse_game_247 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 1));
+    }
+
+    private static inline void test_complete_reverse_game_248 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_249 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_250 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_251 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_252 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_253 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_254 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_255 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_256 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_257 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_258 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_259 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_260 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_261 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_262 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_263 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_264 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_265 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_266 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+    }
+
+    private static inline void test_complete_reverse_game_267 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_268 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . L . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_269 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D L . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_270 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L L L . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_271 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_272 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_273 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_274 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_275 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_276 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+    }
+
+    private static inline void test_complete_reverse_game_277 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+    }
+
+    private static inline void test_complete_reverse_game_278 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 6));
+    }
+
+    private static inline void test_complete_reverse_game_279 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_280 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D L . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_281 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_282 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . D D D L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_283 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_284 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_285 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . L . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_286 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_287 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_288 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . L . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_289 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . L . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_290 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_291 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_292 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L L L . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_293 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_294 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reverse_game_295 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_296 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_297 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reverse_game_298 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . D L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_299 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . D L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_300 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . L L L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_301 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . D L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+    }
+
+    private static inline void test_complete_reverse_game_302 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_303 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . L L L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_304 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_305 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_306 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_307 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_308 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_309 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_310 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . D .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_311 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_312 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . D .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_313 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_314 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reverse_game_315 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_316 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . D .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_317 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_318 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_319 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_320 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+    }
+
+    private static inline void test_complete_reverse_game_321 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_322 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_323 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_324 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_325 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_326 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_327 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_328 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_329 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_330 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_331 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+    }
+
+    private static inline void test_complete_reverse_game_332 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_333 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_334 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_335 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_336 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_337 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_338 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_339 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_340 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_341 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_342 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_343 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_344 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+    }
+
+    private static inline void test_complete_reverse_game_345 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_346 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+    }
+
+    private static inline void test_complete_reverse_game_347 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+    }
+
+    private static inline void test_complete_reverse_game_348 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . L . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+    }
+
+    private static inline void test_complete_reverse_game_349 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D L . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_350 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D L . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_351 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L L L . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_352 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_353 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_354 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_355 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_356 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_357 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_358 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_359 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_360 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+    }
+
+    private static inline void test_complete_reverse_game_361 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_362 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_363 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_364 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+    }
+
+    private static inline void test_complete_reverse_game_365 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_366 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . D D D L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+    }
+
+    private static inline void test_complete_reverse_game_367 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 6));
+    }
+
+    private static inline void test_complete_reverse_game_368 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 4));
+    }
+
+    private static inline void test_complete_reverse_game_369 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . L . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_370 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_371 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+    }
+
+    private static inline void test_complete_reverse_game_372 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . L . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+    }
+
+    private static inline void test_complete_reverse_game_373 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_374 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_375 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+    }
+
+    private static inline void test_complete_reverse_game_376 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L L L . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_377 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_378 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_379 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_380 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_381 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+    }
+
+    private static inline void test_complete_reverse_game_382 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_383 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+    }
+
+    private static inline void test_complete_reverse_game_384 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_385 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_386 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_387 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . D . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_388 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_389 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_390 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+    }
+
+    private static inline void test_complete_reverse_game_391 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+    }
+
+    private static inline void test_complete_reverse_game_392 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D D . L .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 4));
+    }
+
+    private static inline void test_complete_reverse_game_393 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_394 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_395 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L L L .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_396 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_397 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_398 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 1));
+    }
+
+    private static inline void test_complete_reverse_game_399 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_400 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_401 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_402 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_403 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_404 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L . D . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+    }
+
+    private static inline void test_complete_reverse_game_405 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_406 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_407 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+    }
+
+    private static inline void test_complete_reverse_game_408 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_409 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_410 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+    }
+
+    private static inline void test_complete_reverse_game_411 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reverse_game_412 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L L L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_413 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L D . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+    }
+
+    private static inline void test_complete_reverse_game_414 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L D . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_415 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L D . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_416 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_417 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_418 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_419 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_420 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_421 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reverse_game_422 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_423 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_424 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_425 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_426 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_427 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_428 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+    }
+
+    private static inline void test_complete_reverse_game_429 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_430 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_431 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reverse_game_432 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_433 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_434 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_435 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_436 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_437 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . L L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_438 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_439 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reverse_game_440 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_441 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_442 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_443 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_444 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_445 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_446 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . D . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_447 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . D . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 6));
+    }
+
+    private static inline void test_complete_reverse_game_448 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . D . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_449 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . D . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+    }
+
+    private static inline void test_complete_reverse_game_450 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . D . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_451 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . D . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_452 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . D . D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_453 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_454 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_455 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 0));
+    }
+
+    private static inline void test_complete_reverse_game_456 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_457 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_458 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_459 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_460 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_461 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_462 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_463 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reverse_game_464 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_465 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 1));
+    }
+
+    private static inline void test_complete_reverse_game_466 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_467 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_468 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_469 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 6));
+    }
+
+    private static inline void test_complete_reverse_game_470 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_471 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_472 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . D . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reverse_game_473 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_474 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_475 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reverse_game_476 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reverse_game_477 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . L .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_478 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . L .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_479 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+    }
+
+    private static inline void test_complete_reverse_game_480 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reverse_game_481 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L L L .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_482 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reverse_game_483 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_484 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reverse_game_485 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reverse_game_486 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_487 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L . D . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_488 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reverse_game_489 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_490 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+    }
+
+    private static inline void test_complete_reverse_game_491 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_492 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_493 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reverse_game_494 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_495 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reverse_game_496 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reverse_game_497 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_498 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_499 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reverse_game_500 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reverse_game_501 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reverse_game_502 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reverse_game_503 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_504 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . L L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reverse_game_505 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reverse_game_506 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_507 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reverse_game_508 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 1));
+    }
+
+    private static inline void test_complete_reverse_game_509 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 1));
+    }
+
+    private static inline void test_complete_reverse_game_510 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+    }
+
+    private static inline void test_complete_reverse_game_511 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_512 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reverse_game_513 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ true);
+        ComputerPlayer ai = new ComputerReverseHard (game, /* depth */ 2, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+    }
+}
diff --git a/src/perfs-tests-reversi.vala b/src/perfs-tests-reversi.vala
new file mode 100644
index 0000000..30267ff
--- /dev/null
+++ b/src/perfs-tests-reversi.vala
@@ -0,0 +1,38162 @@
+/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+   This file is part of GNOME Reversi, also known as Iagno.
+
+   Copyright 2019 — Arnaud Bonatti
+   File updated by `ninja update-perfs-tests`
+
+   GNOME Reversi is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
+
+   GNOME Reversi is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GNOME Reversi.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+namespace GeneratedTests
+{
+    private static void perfs_tests_reversi ()
+    {
+        /* crossing start position */
+        Test.add_func ("/Reversi/reversi/Complete game 1",
+                            test_complete_reversi_game_1);
+
+        Test.add_func ("/Reversi/reversi/Complete game 2",
+                            test_complete_reversi_game_2);
+
+        Test.add_func ("/Reversi/reversi/Complete game 3",
+                            test_complete_reversi_game_3);
+
+        Test.add_func ("/Reversi/reversi/Complete game 4",
+                            test_complete_reversi_game_4);
+
+        Test.add_func ("/Reversi/reversi/Complete game 5",
+                            test_complete_reversi_game_5);
+
+        Test.add_func ("/Reversi/reversi/Complete game 6",
+                            test_complete_reversi_game_6);
+
+        Test.add_func ("/Reversi/reversi/Complete game 7",
+                            test_complete_reversi_game_7);
+
+        Test.add_func ("/Reversi/reversi/Complete game 8",
+                            test_complete_reversi_game_8);
+
+        Test.add_func ("/Reversi/reversi/Complete game 9",
+                            test_complete_reversi_game_9);
+
+        Test.add_func ("/Reversi/reversi/Complete game 10",
+                            test_complete_reversi_game_10);
+
+        Test.add_func ("/Reversi/reversi/Complete game 11",
+                            test_complete_reversi_game_11);
+
+        Test.add_func ("/Reversi/reversi/Complete game 12",
+                            test_complete_reversi_game_12);
+
+        Test.add_func ("/Reversi/reversi/Complete game 13",
+                            test_complete_reversi_game_13);
+
+        Test.add_func ("/Reversi/reversi/Complete game 14",
+                            test_complete_reversi_game_14);
+
+        Test.add_func ("/Reversi/reversi/Complete game 15",
+                            test_complete_reversi_game_15);
+
+        Test.add_func ("/Reversi/reversi/Complete game 16",
+                            test_complete_reversi_game_16);
+
+        Test.add_func ("/Reversi/reversi/Complete game 17",
+                            test_complete_reversi_game_17);
+
+        Test.add_func ("/Reversi/reversi/Complete game 18",
+                            test_complete_reversi_game_18);
+
+        Test.add_func ("/Reversi/reversi/Complete game 19",
+                            test_complete_reversi_game_19);
+
+        Test.add_func ("/Reversi/reversi/Complete game 20",
+                            test_complete_reversi_game_20);
+
+        Test.add_func ("/Reversi/reversi/Complete game 21",
+                            test_complete_reversi_game_21);
+
+        Test.add_func ("/Reversi/reversi/Complete game 22",
+                            test_complete_reversi_game_22);
+
+        Test.add_func ("/Reversi/reversi/Complete game 23",
+                            test_complete_reversi_game_23);
+
+        Test.add_func ("/Reversi/reversi/Complete game 24",
+                            test_complete_reversi_game_24);
+
+        Test.add_func ("/Reversi/reversi/Complete game 25",
+                            test_complete_reversi_game_25);
+
+        Test.add_func ("/Reversi/reversi/Complete game 26",
+                            test_complete_reversi_game_26);
+
+        Test.add_func ("/Reversi/reversi/Complete game 27",
+                            test_complete_reversi_game_27);
+
+        Test.add_func ("/Reversi/reversi/Complete game 28",
+                            test_complete_reversi_game_28);
+
+        Test.add_func ("/Reversi/reversi/Complete game 29",
+                            test_complete_reversi_game_29);
+
+        Test.add_func ("/Reversi/reversi/Complete game 30",
+                            test_complete_reversi_game_30);
+
+        Test.add_func ("/Reversi/reversi/Complete game 31",
+                            test_complete_reversi_game_31);
+
+        Test.add_func ("/Reversi/reversi/Complete game 32",
+                            test_complete_reversi_game_32);
+
+        Test.add_func ("/Reversi/reversi/Complete game 33",
+                            test_complete_reversi_game_33);
+
+        Test.add_func ("/Reversi/reversi/Complete game 34",
+                            test_complete_reversi_game_34);
+
+        Test.add_func ("/Reversi/reversi/Complete game 35",
+                            test_complete_reversi_game_35);
+
+        Test.add_func ("/Reversi/reversi/Complete game 36",
+                            test_complete_reversi_game_36);
+
+        Test.add_func ("/Reversi/reversi/Complete game 37",
+                            test_complete_reversi_game_37);
+
+        Test.add_func ("/Reversi/reversi/Complete game 38",
+                            test_complete_reversi_game_38);
+
+        Test.add_func ("/Reversi/reversi/Complete game 39",
+                            test_complete_reversi_game_39);
+
+        Test.add_func ("/Reversi/reversi/Complete game 40",
+                            test_complete_reversi_game_40);
+
+        Test.add_func ("/Reversi/reversi/Complete game 41",
+                            test_complete_reversi_game_41);
+
+        Test.add_func ("/Reversi/reversi/Complete game 42",
+                            test_complete_reversi_game_42);
+
+        Test.add_func ("/Reversi/reversi/Complete game 43",
+                            test_complete_reversi_game_43);
+
+        Test.add_func ("/Reversi/reversi/Complete game 44",
+                            test_complete_reversi_game_44);
+
+        Test.add_func ("/Reversi/reversi/Complete game 45",
+                            test_complete_reversi_game_45);
+
+        Test.add_func ("/Reversi/reversi/Complete game 46",
+                            test_complete_reversi_game_46);
+
+        Test.add_func ("/Reversi/reversi/Complete game 47",
+                            test_complete_reversi_game_47);
+
+        Test.add_func ("/Reversi/reversi/Complete game 48",
+                            test_complete_reversi_game_48);
+
+        Test.add_func ("/Reversi/reversi/Complete game 49",
+                            test_complete_reversi_game_49);
+
+        Test.add_func ("/Reversi/reversi/Complete game 50",
+                            test_complete_reversi_game_50);
+
+        Test.add_func ("/Reversi/reversi/Complete game 51",
+                            test_complete_reversi_game_51);
+
+        Test.add_func ("/Reversi/reversi/Complete game 52",
+                            test_complete_reversi_game_52);
+
+        Test.add_func ("/Reversi/reversi/Complete game 53",
+                            test_complete_reversi_game_53);
+
+        Test.add_func ("/Reversi/reversi/Complete game 54",
+                            test_complete_reversi_game_54);
+
+        Test.add_func ("/Reversi/reversi/Complete game 55",
+                            test_complete_reversi_game_55);
+
+        Test.add_func ("/Reversi/reversi/Complete game 56",
+                            test_complete_reversi_game_56);
+
+        Test.add_func ("/Reversi/reversi/Complete game 57",
+                            test_complete_reversi_game_57);
+
+        Test.add_func ("/Reversi/reversi/Complete game 58",
+                            test_complete_reversi_game_58);
+
+        Test.add_func ("/Reversi/reversi/Complete game 59",
+                            test_complete_reversi_game_59);
+
+        Test.add_func ("/Reversi/reversi/Complete game 60",
+                            test_complete_reversi_game_60);
+
+        Test.add_func ("/Reversi/reversi/Complete game 61",
+                            test_complete_reversi_game_61);
+
+        Test.add_func ("/Reversi/reversi/Complete game 62",
+                            test_complete_reversi_game_62);
+
+        Test.add_func ("/Reversi/reversi/Complete game 63",
+                            test_complete_reversi_game_63);
+
+        Test.add_func ("/Reversi/reversi/Complete game 64",
+                            test_complete_reversi_game_64);
+
+        Test.add_func ("/Reversi/reversi/Complete game 65",
+                            test_complete_reversi_game_65);
+
+        Test.add_func ("/Reversi/reversi/Complete game 66",
+                            test_complete_reversi_game_66);
+
+        Test.add_func ("/Reversi/reversi/Complete game 67",
+                            test_complete_reversi_game_67);
+
+        Test.add_func ("/Reversi/reversi/Complete game 68",
+                            test_complete_reversi_game_68);
+
+        Test.add_func ("/Reversi/reversi/Complete game 69",
+                            test_complete_reversi_game_69);
+
+        Test.add_func ("/Reversi/reversi/Complete game 70",
+                            test_complete_reversi_game_70);
+
+        Test.add_func ("/Reversi/reversi/Complete game 71",
+                            test_complete_reversi_game_71);
+
+        Test.add_func ("/Reversi/reversi/Complete game 72",
+                            test_complete_reversi_game_72);
+
+        Test.add_func ("/Reversi/reversi/Complete game 73",
+                            test_complete_reversi_game_73);
+
+        Test.add_func ("/Reversi/reversi/Complete game 74",
+                            test_complete_reversi_game_74);
+
+        Test.add_func ("/Reversi/reversi/Complete game 75",
+                            test_complete_reversi_game_75);
+
+        Test.add_func ("/Reversi/reversi/Complete game 76",
+                            test_complete_reversi_game_76);
+
+        Test.add_func ("/Reversi/reversi/Complete game 77",
+                            test_complete_reversi_game_77);
+
+        Test.add_func ("/Reversi/reversi/Complete game 78",
+                            test_complete_reversi_game_78);
+
+        Test.add_func ("/Reversi/reversi/Complete game 79",
+                            test_complete_reversi_game_79);
+
+        Test.add_func ("/Reversi/reversi/Complete game 80",
+                            test_complete_reversi_game_80);
+
+        Test.add_func ("/Reversi/reversi/Complete game 81",
+                            test_complete_reversi_game_81);
+
+        Test.add_func ("/Reversi/reversi/Complete game 82",
+                            test_complete_reversi_game_82);
+
+        Test.add_func ("/Reversi/reversi/Complete game 83",
+                            test_complete_reversi_game_83);
+
+        Test.add_func ("/Reversi/reversi/Complete game 84",
+                            test_complete_reversi_game_84);
+
+        Test.add_func ("/Reversi/reversi/Complete game 85",
+                            test_complete_reversi_game_85);
+
+        Test.add_func ("/Reversi/reversi/Complete game 86",
+                            test_complete_reversi_game_86);
+
+        Test.add_func ("/Reversi/reversi/Complete game 87",
+                            test_complete_reversi_game_87);
+
+        Test.add_func ("/Reversi/reversi/Complete game 88",
+                            test_complete_reversi_game_88);
+
+        Test.add_func ("/Reversi/reversi/Complete game 89",
+                            test_complete_reversi_game_89);
+
+        Test.add_func ("/Reversi/reversi/Complete game 90",
+                            test_complete_reversi_game_90);
+
+        Test.add_func ("/Reversi/reversi/Complete game 91",
+                            test_complete_reversi_game_91);
+
+        Test.add_func ("/Reversi/reversi/Complete game 92",
+                            test_complete_reversi_game_92);
+
+        Test.add_func ("/Reversi/reversi/Complete game 93",
+                            test_complete_reversi_game_93);
+
+        Test.add_func ("/Reversi/reversi/Complete game 94",
+                            test_complete_reversi_game_94);
+
+        Test.add_func ("/Reversi/reversi/Complete game 95",
+                            test_complete_reversi_game_95);
+
+        Test.add_func ("/Reversi/reversi/Complete game 96",
+                            test_complete_reversi_game_96);
+
+        Test.add_func ("/Reversi/reversi/Complete game 97",
+                            test_complete_reversi_game_97);
+
+        Test.add_func ("/Reversi/reversi/Complete game 98",
+                            test_complete_reversi_game_98);
+
+        Test.add_func ("/Reversi/reversi/Complete game 99",
+                            test_complete_reversi_game_99);
+
+        Test.add_func ("/Reversi/reversi/Complete game 100",
+                            test_complete_reversi_game_100);
+
+        Test.add_func ("/Reversi/reversi/Complete game 101",
+                            test_complete_reversi_game_101);
+
+        Test.add_func ("/Reversi/reversi/Complete game 102",
+                            test_complete_reversi_game_102);
+
+        Test.add_func ("/Reversi/reversi/Complete game 103",
+                            test_complete_reversi_game_103);
+
+        Test.add_func ("/Reversi/reversi/Complete game 104",
+                            test_complete_reversi_game_104);
+
+        Test.add_func ("/Reversi/reversi/Complete game 105",
+                            test_complete_reversi_game_105);
+
+        Test.add_func ("/Reversi/reversi/Complete game 106",
+                            test_complete_reversi_game_106);
+
+        Test.add_func ("/Reversi/reversi/Complete game 107",
+                            test_complete_reversi_game_107);
+
+        Test.add_func ("/Reversi/reversi/Complete game 108",
+                            test_complete_reversi_game_108);
+
+        Test.add_func ("/Reversi/reversi/Complete game 109",
+                            test_complete_reversi_game_109);
+
+        Test.add_func ("/Reversi/reversi/Complete game 110",
+                            test_complete_reversi_game_110);
+
+        Test.add_func ("/Reversi/reversi/Complete game 111",
+                            test_complete_reversi_game_111);
+
+        Test.add_func ("/Reversi/reversi/Complete game 112",
+                            test_complete_reversi_game_112);
+
+        Test.add_func ("/Reversi/reversi/Complete game 113",
+                            test_complete_reversi_game_113);
+
+        Test.add_func ("/Reversi/reversi/Complete game 114",
+                            test_complete_reversi_game_114);
+
+        Test.add_func ("/Reversi/reversi/Complete game 115",
+                            test_complete_reversi_game_115);
+
+        Test.add_func ("/Reversi/reversi/Complete game 116",
+                            test_complete_reversi_game_116);
+
+        Test.add_func ("/Reversi/reversi/Complete game 117",
+                            test_complete_reversi_game_117);
+
+        Test.add_func ("/Reversi/reversi/Complete game 118",
+                            test_complete_reversi_game_118);
+
+        Test.add_func ("/Reversi/reversi/Complete game 119",
+                            test_complete_reversi_game_119);
+
+        Test.add_func ("/Reversi/reversi/Complete game 120",
+                            test_complete_reversi_game_120);
+
+        Test.add_func ("/Reversi/reversi/Complete game 121",
+                            test_complete_reversi_game_121);
+
+        Test.add_func ("/Reversi/reversi/Complete game 122",
+                            test_complete_reversi_game_122);
+
+        Test.add_func ("/Reversi/reversi/Complete game 123",
+                            test_complete_reversi_game_123);
+
+        Test.add_func ("/Reversi/reversi/Complete game 124",
+                            test_complete_reversi_game_124);
+
+        Test.add_func ("/Reversi/reversi/Complete game 125",
+                            test_complete_reversi_game_125);
+
+        Test.add_func ("/Reversi/reversi/Complete game 126",
+                            test_complete_reversi_game_126);
+
+        Test.add_func ("/Reversi/reversi/Complete game 127",
+                            test_complete_reversi_game_127);
+
+        Test.add_func ("/Reversi/reversi/Complete game 128",
+                            test_complete_reversi_game_128);
+
+        Test.add_func ("/Reversi/reversi/Complete game 129",
+                            test_complete_reversi_game_129);
+
+        Test.add_func ("/Reversi/reversi/Complete game 130",
+                            test_complete_reversi_game_130);
+
+        Test.add_func ("/Reversi/reversi/Complete game 131",
+                            test_complete_reversi_game_131);
+
+        Test.add_func ("/Reversi/reversi/Complete game 132",
+                            test_complete_reversi_game_132);
+
+        Test.add_func ("/Reversi/reversi/Complete game 133",
+                            test_complete_reversi_game_133);
+
+        Test.add_func ("/Reversi/reversi/Complete game 134",
+                            test_complete_reversi_game_134);
+
+        Test.add_func ("/Reversi/reversi/Complete game 135",
+                            test_complete_reversi_game_135);
+
+        Test.add_func ("/Reversi/reversi/Complete game 136",
+                            test_complete_reversi_game_136);
+
+        Test.add_func ("/Reversi/reversi/Complete game 137",
+                            test_complete_reversi_game_137);
+
+        Test.add_func ("/Reversi/reversi/Complete game 138",
+                            test_complete_reversi_game_138);
+
+        Test.add_func ("/Reversi/reversi/Complete game 139",
+                            test_complete_reversi_game_139);
+
+        Test.add_func ("/Reversi/reversi/Complete game 140",
+                            test_complete_reversi_game_140);
+
+        Test.add_func ("/Reversi/reversi/Complete game 141",
+                            test_complete_reversi_game_141);
+
+        Test.add_func ("/Reversi/reversi/Complete game 142",
+                            test_complete_reversi_game_142);
+
+        Test.add_func ("/Reversi/reversi/Complete game 143",
+                            test_complete_reversi_game_143);
+
+        Test.add_func ("/Reversi/reversi/Complete game 144",
+                            test_complete_reversi_game_144);
+
+        Test.add_func ("/Reversi/reversi/Complete game 145",
+                            test_complete_reversi_game_145);
+
+        Test.add_func ("/Reversi/reversi/Complete game 146",
+                            test_complete_reversi_game_146);
+
+        Test.add_func ("/Reversi/reversi/Complete game 147",
+                            test_complete_reversi_game_147);
+
+        Test.add_func ("/Reversi/reversi/Complete game 148",
+                            test_complete_reversi_game_148);
+
+        Test.add_func ("/Reversi/reversi/Complete game 149",
+                            test_complete_reversi_game_149);
+
+        Test.add_func ("/Reversi/reversi/Complete game 150",
+                            test_complete_reversi_game_150);
+
+        Test.add_func ("/Reversi/reversi/Complete game 151",
+                            test_complete_reversi_game_151);
+
+        Test.add_func ("/Reversi/reversi/Complete game 152",
+                            test_complete_reversi_game_152);
+
+        Test.add_func ("/Reversi/reversi/Complete game 153",
+                            test_complete_reversi_game_153);
+
+        Test.add_func ("/Reversi/reversi/Complete game 154",
+                            test_complete_reversi_game_154);
+
+        Test.add_func ("/Reversi/reversi/Complete game 155",
+                            test_complete_reversi_game_155);
+
+        Test.add_func ("/Reversi/reversi/Complete game 156",
+                            test_complete_reversi_game_156);
+
+        Test.add_func ("/Reversi/reversi/Complete game 157",
+                            test_complete_reversi_game_157);
+
+        Test.add_func ("/Reversi/reversi/Complete game 158",
+                            test_complete_reversi_game_158);
+
+        Test.add_func ("/Reversi/reversi/Complete game 159",
+                            test_complete_reversi_game_159);
+
+        Test.add_func ("/Reversi/reversi/Complete game 160",
+                            test_complete_reversi_game_160);
+
+        Test.add_func ("/Reversi/reversi/Complete game 161",
+                            test_complete_reversi_game_161);
+
+        Test.add_func ("/Reversi/reversi/Complete game 162",
+                            test_complete_reversi_game_162);
+
+        Test.add_func ("/Reversi/reversi/Complete game 163",
+                            test_complete_reversi_game_163);
+
+        Test.add_func ("/Reversi/reversi/Complete game 164",
+                            test_complete_reversi_game_164);
+
+        Test.add_func ("/Reversi/reversi/Complete game 165",
+                            test_complete_reversi_game_165);
+
+        Test.add_func ("/Reversi/reversi/Complete game 166",
+                            test_complete_reversi_game_166);
+
+        Test.add_func ("/Reversi/reversi/Complete game 167",
+                            test_complete_reversi_game_167);
+
+        Test.add_func ("/Reversi/reversi/Complete game 168",
+                            test_complete_reversi_game_168);
+
+        Test.add_func ("/Reversi/reversi/Complete game 169",
+                            test_complete_reversi_game_169);
+
+        Test.add_func ("/Reversi/reversi/Complete game 170",
+                            test_complete_reversi_game_170);
+
+        Test.add_func ("/Reversi/reversi/Complete game 171",
+                            test_complete_reversi_game_171);
+
+        Test.add_func ("/Reversi/reversi/Complete game 172",
+                            test_complete_reversi_game_172);
+
+        Test.add_func ("/Reversi/reversi/Complete game 173",
+                            test_complete_reversi_game_173);
+
+        Test.add_func ("/Reversi/reversi/Complete game 174",
+                            test_complete_reversi_game_174);
+
+        Test.add_func ("/Reversi/reversi/Complete game 175",
+                            test_complete_reversi_game_175);
+
+        Test.add_func ("/Reversi/reversi/Complete game 176",
+                            test_complete_reversi_game_176);
+
+        Test.add_func ("/Reversi/reversi/Complete game 177",
+                            test_complete_reversi_game_177);
+
+        Test.add_func ("/Reversi/reversi/Complete game 178",
+                            test_complete_reversi_game_178);
+
+        Test.add_func ("/Reversi/reversi/Complete game 179",
+                            test_complete_reversi_game_179);
+
+        Test.add_func ("/Reversi/reversi/Complete game 180",
+                            test_complete_reversi_game_180);
+
+        Test.add_func ("/Reversi/reversi/Complete game 181",
+                            test_complete_reversi_game_181);
+
+        Test.add_func ("/Reversi/reversi/Complete game 182",
+                            test_complete_reversi_game_182);
+
+        Test.add_func ("/Reversi/reversi/Complete game 183",
+                            test_complete_reversi_game_183);
+
+        Test.add_func ("/Reversi/reversi/Complete game 184",
+                            test_complete_reversi_game_184);
+
+        Test.add_func ("/Reversi/reversi/Complete game 185",
+                            test_complete_reversi_game_185);
+
+        Test.add_func ("/Reversi/reversi/Complete game 186",
+                            test_complete_reversi_game_186);
+
+        Test.add_func ("/Reversi/reversi/Complete game 187",
+                            test_complete_reversi_game_187);
+
+        Test.add_func ("/Reversi/reversi/Complete game 188",
+                            test_complete_reversi_game_188);
+
+        Test.add_func ("/Reversi/reversi/Complete game 189",
+                            test_complete_reversi_game_189);
+
+        Test.add_func ("/Reversi/reversi/Complete game 190",
+                            test_complete_reversi_game_190);
+
+        Test.add_func ("/Reversi/reversi/Complete game 191",
+                            test_complete_reversi_game_191);
+
+        Test.add_func ("/Reversi/reversi/Complete game 192",
+                            test_complete_reversi_game_192);
+
+        Test.add_func ("/Reversi/reversi/Complete game 193",
+                            test_complete_reversi_game_193);
+
+        Test.add_func ("/Reversi/reversi/Complete game 194",
+                            test_complete_reversi_game_194);
+
+        Test.add_func ("/Reversi/reversi/Complete game 195",
+                            test_complete_reversi_game_195);
+
+        Test.add_func ("/Reversi/reversi/Complete game 196",
+                            test_complete_reversi_game_196);
+
+        Test.add_func ("/Reversi/reversi/Complete game 197",
+                            test_complete_reversi_game_197);
+
+        Test.add_func ("/Reversi/reversi/Complete game 198",
+                            test_complete_reversi_game_198);
+
+        Test.add_func ("/Reversi/reversi/Complete game 199",
+                            test_complete_reversi_game_199);
+
+        Test.add_func ("/Reversi/reversi/Complete game 200",
+                            test_complete_reversi_game_200);
+
+        Test.add_func ("/Reversi/reversi/Complete game 201",
+                            test_complete_reversi_game_201);
+
+        Test.add_func ("/Reversi/reversi/Complete game 202",
+                            test_complete_reversi_game_202);
+
+        Test.add_func ("/Reversi/reversi/Complete game 203",
+                            test_complete_reversi_game_203);
+
+        Test.add_func ("/Reversi/reversi/Complete game 204",
+                            test_complete_reversi_game_204);
+
+        Test.add_func ("/Reversi/reversi/Complete game 205",
+                            test_complete_reversi_game_205);
+
+        Test.add_func ("/Reversi/reversi/Complete game 206",
+                            test_complete_reversi_game_206);
+
+        Test.add_func ("/Reversi/reversi/Complete game 207",
+                            test_complete_reversi_game_207);
+
+        Test.add_func ("/Reversi/reversi/Complete game 208",
+                            test_complete_reversi_game_208);
+
+        Test.add_func ("/Reversi/reversi/Complete game 209",
+                            test_complete_reversi_game_209);
+
+        Test.add_func ("/Reversi/reversi/Complete game 210",
+                            test_complete_reversi_game_210);
+
+        Test.add_func ("/Reversi/reversi/Complete game 211",
+                            test_complete_reversi_game_211);
+
+        Test.add_func ("/Reversi/reversi/Complete game 212",
+                            test_complete_reversi_game_212);
+
+        Test.add_func ("/Reversi/reversi/Complete game 213",
+                            test_complete_reversi_game_213);
+
+        Test.add_func ("/Reversi/reversi/Complete game 214",
+                            test_complete_reversi_game_214);
+
+        Test.add_func ("/Reversi/reversi/Complete game 215",
+                            test_complete_reversi_game_215);
+
+        Test.add_func ("/Reversi/reversi/Complete game 216",
+                            test_complete_reversi_game_216);
+
+        Test.add_func ("/Reversi/reversi/Complete game 217",
+                            test_complete_reversi_game_217);
+
+        Test.add_func ("/Reversi/reversi/Complete game 218",
+                            test_complete_reversi_game_218);
+
+        Test.add_func ("/Reversi/reversi/Complete game 219",
+                            test_complete_reversi_game_219);
+
+        Test.add_func ("/Reversi/reversi/Complete game 220",
+                            test_complete_reversi_game_220);
+
+        Test.add_func ("/Reversi/reversi/Complete game 221",
+                            test_complete_reversi_game_221);
+
+        Test.add_func ("/Reversi/reversi/Complete game 222",
+                            test_complete_reversi_game_222);
+
+        Test.add_func ("/Reversi/reversi/Complete game 223",
+                            test_complete_reversi_game_223);
+
+        Test.add_func ("/Reversi/reversi/Complete game 224",
+                            test_complete_reversi_game_224);
+
+        Test.add_func ("/Reversi/reversi/Complete game 225",
+                            test_complete_reversi_game_225);
+
+        Test.add_func ("/Reversi/reversi/Complete game 226",
+                            test_complete_reversi_game_226);
+
+        Test.add_func ("/Reversi/reversi/Complete game 227",
+                            test_complete_reversi_game_227);
+
+        Test.add_func ("/Reversi/reversi/Complete game 228",
+                            test_complete_reversi_game_228);
+
+        Test.add_func ("/Reversi/reversi/Complete game 229",
+                            test_complete_reversi_game_229);
+
+        Test.add_func ("/Reversi/reversi/Complete game 230",
+                            test_complete_reversi_game_230);
+
+        Test.add_func ("/Reversi/reversi/Complete game 231",
+                            test_complete_reversi_game_231);
+
+        Test.add_func ("/Reversi/reversi/Complete game 232",
+                            test_complete_reversi_game_232);
+
+        /* parallel start position */
+        Test.add_func ("/Reversi/reversi/Complete game 233",
+                            test_complete_reversi_game_233);
+
+        Test.add_func ("/Reversi/reversi/Complete game 234",
+                            test_complete_reversi_game_234);
+
+        Test.add_func ("/Reversi/reversi/Complete game 235",
+                            test_complete_reversi_game_235);
+
+        Test.add_func ("/Reversi/reversi/Complete game 236",
+                            test_complete_reversi_game_236);
+
+        Test.add_func ("/Reversi/reversi/Complete game 237",
+                            test_complete_reversi_game_237);
+
+        Test.add_func ("/Reversi/reversi/Complete game 238",
+                            test_complete_reversi_game_238);
+
+        Test.add_func ("/Reversi/reversi/Complete game 239",
+                            test_complete_reversi_game_239);
+
+        Test.add_func ("/Reversi/reversi/Complete game 240",
+                            test_complete_reversi_game_240);
+
+        Test.add_func ("/Reversi/reversi/Complete game 241",
+                            test_complete_reversi_game_241);
+
+        Test.add_func ("/Reversi/reversi/Complete game 242",
+                            test_complete_reversi_game_242);
+
+        Test.add_func ("/Reversi/reversi/Complete game 243",
+                            test_complete_reversi_game_243);
+
+        Test.add_func ("/Reversi/reversi/Complete game 244",
+                            test_complete_reversi_game_244);
+
+        Test.add_func ("/Reversi/reversi/Complete game 245",
+                            test_complete_reversi_game_245);
+
+        Test.add_func ("/Reversi/reversi/Complete game 246",
+                            test_complete_reversi_game_246);
+
+        Test.add_func ("/Reversi/reversi/Complete game 247",
+                            test_complete_reversi_game_247);
+
+        Test.add_func ("/Reversi/reversi/Complete game 248",
+                            test_complete_reversi_game_248);
+
+        Test.add_func ("/Reversi/reversi/Complete game 249",
+                            test_complete_reversi_game_249);
+
+        Test.add_func ("/Reversi/reversi/Complete game 250",
+                            test_complete_reversi_game_250);
+
+        Test.add_func ("/Reversi/reversi/Complete game 251",
+                            test_complete_reversi_game_251);
+
+        Test.add_func ("/Reversi/reversi/Complete game 252",
+                            test_complete_reversi_game_252);
+
+        Test.add_func ("/Reversi/reversi/Complete game 253",
+                            test_complete_reversi_game_253);
+
+        Test.add_func ("/Reversi/reversi/Complete game 254",
+                            test_complete_reversi_game_254);
+
+        Test.add_func ("/Reversi/reversi/Complete game 255",
+                            test_complete_reversi_game_255);
+
+        Test.add_func ("/Reversi/reversi/Complete game 256",
+                            test_complete_reversi_game_256);
+
+        Test.add_func ("/Reversi/reversi/Complete game 257",
+                            test_complete_reversi_game_257);
+
+        Test.add_func ("/Reversi/reversi/Complete game 258",
+                            test_complete_reversi_game_258);
+
+        Test.add_func ("/Reversi/reversi/Complete game 259",
+                            test_complete_reversi_game_259);
+
+        Test.add_func ("/Reversi/reversi/Complete game 260",
+                            test_complete_reversi_game_260);
+
+        Test.add_func ("/Reversi/reversi/Complete game 261",
+                            test_complete_reversi_game_261);
+
+        Test.add_func ("/Reversi/reversi/Complete game 262",
+                            test_complete_reversi_game_262);
+
+        Test.add_func ("/Reversi/reversi/Complete game 263",
+                            test_complete_reversi_game_263);
+
+        Test.add_func ("/Reversi/reversi/Complete game 264",
+                            test_complete_reversi_game_264);
+
+        Test.add_func ("/Reversi/reversi/Complete game 265",
+                            test_complete_reversi_game_265);
+
+        Test.add_func ("/Reversi/reversi/Complete game 266",
+                            test_complete_reversi_game_266);
+
+        Test.add_func ("/Reversi/reversi/Complete game 267",
+                            test_complete_reversi_game_267);
+
+        Test.add_func ("/Reversi/reversi/Complete game 268",
+                            test_complete_reversi_game_268);
+
+        Test.add_func ("/Reversi/reversi/Complete game 269",
+                            test_complete_reversi_game_269);
+
+        Test.add_func ("/Reversi/reversi/Complete game 270",
+                            test_complete_reversi_game_270);
+
+        Test.add_func ("/Reversi/reversi/Complete game 271",
+                            test_complete_reversi_game_271);
+
+        Test.add_func ("/Reversi/reversi/Complete game 272",
+                            test_complete_reversi_game_272);
+
+        Test.add_func ("/Reversi/reversi/Complete game 273",
+                            test_complete_reversi_game_273);
+
+        Test.add_func ("/Reversi/reversi/Complete game 274",
+                            test_complete_reversi_game_274);
+
+        Test.add_func ("/Reversi/reversi/Complete game 275",
+                            test_complete_reversi_game_275);
+
+        Test.add_func ("/Reversi/reversi/Complete game 276",
+                            test_complete_reversi_game_276);
+
+        Test.add_func ("/Reversi/reversi/Complete game 277",
+                            test_complete_reversi_game_277);
+
+        Test.add_func ("/Reversi/reversi/Complete game 278",
+                            test_complete_reversi_game_278);
+
+        Test.add_func ("/Reversi/reversi/Complete game 279",
+                            test_complete_reversi_game_279);
+
+        Test.add_func ("/Reversi/reversi/Complete game 280",
+                            test_complete_reversi_game_280);
+
+        Test.add_func ("/Reversi/reversi/Complete game 281",
+                            test_complete_reversi_game_281);
+
+        Test.add_func ("/Reversi/reversi/Complete game 282",
+                            test_complete_reversi_game_282);
+
+        Test.add_func ("/Reversi/reversi/Complete game 283",
+                            test_complete_reversi_game_283);
+
+        Test.add_func ("/Reversi/reversi/Complete game 284",
+                            test_complete_reversi_game_284);
+
+        Test.add_func ("/Reversi/reversi/Complete game 285",
+                            test_complete_reversi_game_285);
+
+        Test.add_func ("/Reversi/reversi/Complete game 286",
+                            test_complete_reversi_game_286);
+
+        Test.add_func ("/Reversi/reversi/Complete game 287",
+                            test_complete_reversi_game_287);
+
+        Test.add_func ("/Reversi/reversi/Complete game 288",
+                            test_complete_reversi_game_288);
+
+        Test.add_func ("/Reversi/reversi/Complete game 289",
+                            test_complete_reversi_game_289);
+
+        Test.add_func ("/Reversi/reversi/Complete game 290",
+                            test_complete_reversi_game_290);
+
+        Test.add_func ("/Reversi/reversi/Complete game 291",
+                            test_complete_reversi_game_291);
+
+        Test.add_func ("/Reversi/reversi/Complete game 292",
+                            test_complete_reversi_game_292);
+
+        Test.add_func ("/Reversi/reversi/Complete game 293",
+                            test_complete_reversi_game_293);
+
+        Test.add_func ("/Reversi/reversi/Complete game 294",
+                            test_complete_reversi_game_294);
+
+        Test.add_func ("/Reversi/reversi/Complete game 295",
+                            test_complete_reversi_game_295);
+
+        Test.add_func ("/Reversi/reversi/Complete game 296",
+                            test_complete_reversi_game_296);
+
+        Test.add_func ("/Reversi/reversi/Complete game 297",
+                            test_complete_reversi_game_297);
+
+        Test.add_func ("/Reversi/reversi/Complete game 298",
+                            test_complete_reversi_game_298);
+
+        Test.add_func ("/Reversi/reversi/Complete game 299",
+                            test_complete_reversi_game_299);
+
+        Test.add_func ("/Reversi/reversi/Complete game 300",
+                            test_complete_reversi_game_300);
+
+        Test.add_func ("/Reversi/reversi/Complete game 301",
+                            test_complete_reversi_game_301);
+
+        Test.add_func ("/Reversi/reversi/Complete game 302",
+                            test_complete_reversi_game_302);
+
+        Test.add_func ("/Reversi/reversi/Complete game 303",
+                            test_complete_reversi_game_303);
+
+        Test.add_func ("/Reversi/reversi/Complete game 304",
+                            test_complete_reversi_game_304);
+
+        Test.add_func ("/Reversi/reversi/Complete game 305",
+                            test_complete_reversi_game_305);
+
+        Test.add_func ("/Reversi/reversi/Complete game 306",
+                            test_complete_reversi_game_306);
+
+        Test.add_func ("/Reversi/reversi/Complete game 307",
+                            test_complete_reversi_game_307);
+
+        Test.add_func ("/Reversi/reversi/Complete game 308",
+                            test_complete_reversi_game_308);
+
+        Test.add_func ("/Reversi/reversi/Complete game 309",
+                            test_complete_reversi_game_309);
+
+        Test.add_func ("/Reversi/reversi/Complete game 310",
+                            test_complete_reversi_game_310);
+
+        Test.add_func ("/Reversi/reversi/Complete game 311",
+                            test_complete_reversi_game_311);
+
+        Test.add_func ("/Reversi/reversi/Complete game 312",
+                            test_complete_reversi_game_312);
+
+        Test.add_func ("/Reversi/reversi/Complete game 313",
+                            test_complete_reversi_game_313);
+
+        Test.add_func ("/Reversi/reversi/Complete game 314",
+                            test_complete_reversi_game_314);
+
+        Test.add_func ("/Reversi/reversi/Complete game 315",
+                            test_complete_reversi_game_315);
+
+        Test.add_func ("/Reversi/reversi/Complete game 316",
+                            test_complete_reversi_game_316);
+
+        Test.add_func ("/Reversi/reversi/Complete game 317",
+                            test_complete_reversi_game_317);
+
+        Test.add_func ("/Reversi/reversi/Complete game 318",
+                            test_complete_reversi_game_318);
+
+        Test.add_func ("/Reversi/reversi/Complete game 319",
+                            test_complete_reversi_game_319);
+
+        Test.add_func ("/Reversi/reversi/Complete game 320",
+                            test_complete_reversi_game_320);
+
+        Test.add_func ("/Reversi/reversi/Complete game 321",
+                            test_complete_reversi_game_321);
+
+        Test.add_func ("/Reversi/reversi/Complete game 322",
+                            test_complete_reversi_game_322);
+
+        Test.add_func ("/Reversi/reversi/Complete game 323",
+                            test_complete_reversi_game_323);
+
+        Test.add_func ("/Reversi/reversi/Complete game 324",
+                            test_complete_reversi_game_324);
+
+        Test.add_func ("/Reversi/reversi/Complete game 325",
+                            test_complete_reversi_game_325);
+
+        Test.add_func ("/Reversi/reversi/Complete game 326",
+                            test_complete_reversi_game_326);
+
+        Test.add_func ("/Reversi/reversi/Complete game 327",
+                            test_complete_reversi_game_327);
+
+        Test.add_func ("/Reversi/reversi/Complete game 328",
+                            test_complete_reversi_game_328);
+
+        Test.add_func ("/Reversi/reversi/Complete game 329",
+                            test_complete_reversi_game_329);
+
+        Test.add_func ("/Reversi/reversi/Complete game 330",
+                            test_complete_reversi_game_330);
+
+        Test.add_func ("/Reversi/reversi/Complete game 331",
+                            test_complete_reversi_game_331);
+
+        Test.add_func ("/Reversi/reversi/Complete game 332",
+                            test_complete_reversi_game_332);
+
+        Test.add_func ("/Reversi/reversi/Complete game 333",
+                            test_complete_reversi_game_333);
+
+        Test.add_func ("/Reversi/reversi/Complete game 334",
+                            test_complete_reversi_game_334);
+
+        Test.add_func ("/Reversi/reversi/Complete game 335",
+                            test_complete_reversi_game_335);
+
+        Test.add_func ("/Reversi/reversi/Complete game 336",
+                            test_complete_reversi_game_336);
+
+        Test.add_func ("/Reversi/reversi/Complete game 337",
+                            test_complete_reversi_game_337);
+
+        Test.add_func ("/Reversi/reversi/Complete game 338",
+                            test_complete_reversi_game_338);
+
+        Test.add_func ("/Reversi/reversi/Complete game 339",
+                            test_complete_reversi_game_339);
+
+        Test.add_func ("/Reversi/reversi/Complete game 340",
+                            test_complete_reversi_game_340);
+
+        Test.add_func ("/Reversi/reversi/Complete game 341",
+                            test_complete_reversi_game_341);
+
+        Test.add_func ("/Reversi/reversi/Complete game 342",
+                            test_complete_reversi_game_342);
+
+        Test.add_func ("/Reversi/reversi/Complete game 343",
+                            test_complete_reversi_game_343);
+
+        Test.add_func ("/Reversi/reversi/Complete game 344",
+                            test_complete_reversi_game_344);
+
+        Test.add_func ("/Reversi/reversi/Complete game 345",
+                            test_complete_reversi_game_345);
+
+        Test.add_func ("/Reversi/reversi/Complete game 346",
+                            test_complete_reversi_game_346);
+
+        Test.add_func ("/Reversi/reversi/Complete game 347",
+                            test_complete_reversi_game_347);
+
+        Test.add_func ("/Reversi/reversi/Complete game 348",
+                            test_complete_reversi_game_348);
+
+        Test.add_func ("/Reversi/reversi/Complete game 349",
+                            test_complete_reversi_game_349);
+
+        Test.add_func ("/Reversi/reversi/Complete game 350",
+                            test_complete_reversi_game_350);
+
+        Test.add_func ("/Reversi/reversi/Complete game 351",
+                            test_complete_reversi_game_351);
+
+        Test.add_func ("/Reversi/reversi/Complete game 352",
+                            test_complete_reversi_game_352);
+
+        Test.add_func ("/Reversi/reversi/Complete game 353",
+                            test_complete_reversi_game_353);
+
+        Test.add_func ("/Reversi/reversi/Complete game 354",
+                            test_complete_reversi_game_354);
+
+        Test.add_func ("/Reversi/reversi/Complete game 355",
+                            test_complete_reversi_game_355);
+
+        Test.add_func ("/Reversi/reversi/Complete game 356",
+                            test_complete_reversi_game_356);
+
+        Test.add_func ("/Reversi/reversi/Complete game 357",
+                            test_complete_reversi_game_357);
+
+        Test.add_func ("/Reversi/reversi/Complete game 358",
+                            test_complete_reversi_game_358);
+
+        Test.add_func ("/Reversi/reversi/Complete game 359",
+                            test_complete_reversi_game_359);
+
+        Test.add_func ("/Reversi/reversi/Complete game 360",
+                            test_complete_reversi_game_360);
+
+        Test.add_func ("/Reversi/reversi/Complete game 361",
+                            test_complete_reversi_game_361);
+
+        Test.add_func ("/Reversi/reversi/Complete game 362",
+                            test_complete_reversi_game_362);
+
+        Test.add_func ("/Reversi/reversi/Complete game 363",
+                            test_complete_reversi_game_363);
+
+        Test.add_func ("/Reversi/reversi/Complete game 364",
+                            test_complete_reversi_game_364);
+
+        Test.add_func ("/Reversi/reversi/Complete game 365",
+                            test_complete_reversi_game_365);
+
+        Test.add_func ("/Reversi/reversi/Complete game 366",
+                            test_complete_reversi_game_366);
+
+        Test.add_func ("/Reversi/reversi/Complete game 367",
+                            test_complete_reversi_game_367);
+
+        Test.add_func ("/Reversi/reversi/Complete game 368",
+                            test_complete_reversi_game_368);
+
+        Test.add_func ("/Reversi/reversi/Complete game 369",
+                            test_complete_reversi_game_369);
+
+        Test.add_func ("/Reversi/reversi/Complete game 370",
+                            test_complete_reversi_game_370);
+
+        Test.add_func ("/Reversi/reversi/Complete game 371",
+                            test_complete_reversi_game_371);
+
+        Test.add_func ("/Reversi/reversi/Complete game 372",
+                            test_complete_reversi_game_372);
+
+        Test.add_func ("/Reversi/reversi/Complete game 373",
+                            test_complete_reversi_game_373);
+
+        Test.add_func ("/Reversi/reversi/Complete game 374",
+                            test_complete_reversi_game_374);
+
+        Test.add_func ("/Reversi/reversi/Complete game 375",
+                            test_complete_reversi_game_375);
+
+        Test.add_func ("/Reversi/reversi/Complete game 376",
+                            test_complete_reversi_game_376);
+
+        Test.add_func ("/Reversi/reversi/Complete game 377",
+                            test_complete_reversi_game_377);
+
+        Test.add_func ("/Reversi/reversi/Complete game 378",
+                            test_complete_reversi_game_378);
+
+        Test.add_func ("/Reversi/reversi/Complete game 379",
+                            test_complete_reversi_game_379);
+
+        Test.add_func ("/Reversi/reversi/Complete game 380",
+                            test_complete_reversi_game_380);
+
+        Test.add_func ("/Reversi/reversi/Complete game 381",
+                            test_complete_reversi_game_381);
+
+        Test.add_func ("/Reversi/reversi/Complete game 382",
+                            test_complete_reversi_game_382);
+
+        Test.add_func ("/Reversi/reversi/Complete game 383",
+                            test_complete_reversi_game_383);
+
+        Test.add_func ("/Reversi/reversi/Complete game 384",
+                            test_complete_reversi_game_384);
+
+        Test.add_func ("/Reversi/reversi/Complete game 385",
+                            test_complete_reversi_game_385);
+
+        Test.add_func ("/Reversi/reversi/Complete game 386",
+                            test_complete_reversi_game_386);
+
+        Test.add_func ("/Reversi/reversi/Complete game 387",
+                            test_complete_reversi_game_387);
+
+        Test.add_func ("/Reversi/reversi/Complete game 388",
+                            test_complete_reversi_game_388);
+
+        Test.add_func ("/Reversi/reversi/Complete game 389",
+                            test_complete_reversi_game_389);
+
+        Test.add_func ("/Reversi/reversi/Complete game 390",
+                            test_complete_reversi_game_390);
+
+        Test.add_func ("/Reversi/reversi/Complete game 391",
+                            test_complete_reversi_game_391);
+
+        Test.add_func ("/Reversi/reversi/Complete game 392",
+                            test_complete_reversi_game_392);
+
+        Test.add_func ("/Reversi/reversi/Complete game 393",
+                            test_complete_reversi_game_393);
+
+        Test.add_func ("/Reversi/reversi/Complete game 394",
+                            test_complete_reversi_game_394);
+
+        Test.add_func ("/Reversi/reversi/Complete game 395",
+                            test_complete_reversi_game_395);
+
+        Test.add_func ("/Reversi/reversi/Complete game 396",
+                            test_complete_reversi_game_396);
+
+        Test.add_func ("/Reversi/reversi/Complete game 397",
+                            test_complete_reversi_game_397);
+
+        Test.add_func ("/Reversi/reversi/Complete game 398",
+                            test_complete_reversi_game_398);
+
+        Test.add_func ("/Reversi/reversi/Complete game 399",
+                            test_complete_reversi_game_399);
+
+        Test.add_func ("/Reversi/reversi/Complete game 400",
+                            test_complete_reversi_game_400);
+
+        Test.add_func ("/Reversi/reversi/Complete game 401",
+                            test_complete_reversi_game_401);
+
+        Test.add_func ("/Reversi/reversi/Complete game 402",
+                            test_complete_reversi_game_402);
+
+        Test.add_func ("/Reversi/reversi/Complete game 403",
+                            test_complete_reversi_game_403);
+
+        Test.add_func ("/Reversi/reversi/Complete game 404",
+                            test_complete_reversi_game_404);
+
+        Test.add_func ("/Reversi/reversi/Complete game 405",
+                            test_complete_reversi_game_405);
+
+        Test.add_func ("/Reversi/reversi/Complete game 406",
+                            test_complete_reversi_game_406);
+
+        Test.add_func ("/Reversi/reversi/Complete game 407",
+                            test_complete_reversi_game_407);
+
+        Test.add_func ("/Reversi/reversi/Complete game 408",
+                            test_complete_reversi_game_408);
+
+        Test.add_func ("/Reversi/reversi/Complete game 409",
+                            test_complete_reversi_game_409);
+
+        Test.add_func ("/Reversi/reversi/Complete game 410",
+                            test_complete_reversi_game_410);
+
+        Test.add_func ("/Reversi/reversi/Complete game 411",
+                            test_complete_reversi_game_411);
+
+        Test.add_func ("/Reversi/reversi/Complete game 412",
+                            test_complete_reversi_game_412);
+
+        Test.add_func ("/Reversi/reversi/Complete game 413",
+                            test_complete_reversi_game_413);
+
+        Test.add_func ("/Reversi/reversi/Complete game 414",
+                            test_complete_reversi_game_414);
+
+        Test.add_func ("/Reversi/reversi/Complete game 415",
+                            test_complete_reversi_game_415);
+
+        Test.add_func ("/Reversi/reversi/Complete game 416",
+                            test_complete_reversi_game_416);
+
+        Test.add_func ("/Reversi/reversi/Complete game 417",
+                            test_complete_reversi_game_417);
+
+        Test.add_func ("/Reversi/reversi/Complete game 418",
+                            test_complete_reversi_game_418);
+
+        Test.add_func ("/Reversi/reversi/Complete game 419",
+                            test_complete_reversi_game_419);
+
+        Test.add_func ("/Reversi/reversi/Complete game 420",
+                            test_complete_reversi_game_420);
+
+        Test.add_func ("/Reversi/reversi/Complete game 421",
+                            test_complete_reversi_game_421);
+
+        Test.add_func ("/Reversi/reversi/Complete game 422",
+                            test_complete_reversi_game_422);
+
+        Test.add_func ("/Reversi/reversi/Complete game 423",
+                            test_complete_reversi_game_423);
+
+        Test.add_func ("/Reversi/reversi/Complete game 424",
+                            test_complete_reversi_game_424);
+
+        Test.add_func ("/Reversi/reversi/Complete game 425",
+                            test_complete_reversi_game_425);
+
+        Test.add_func ("/Reversi/reversi/Complete game 426",
+                            test_complete_reversi_game_426);
+
+        Test.add_func ("/Reversi/reversi/Complete game 427",
+                            test_complete_reversi_game_427);
+
+        Test.add_func ("/Reversi/reversi/Complete game 428",
+                            test_complete_reversi_game_428);
+
+        Test.add_func ("/Reversi/reversi/Complete game 429",
+                            test_complete_reversi_game_429);
+
+        Test.add_func ("/Reversi/reversi/Complete game 430",
+                            test_complete_reversi_game_430);
+
+        Test.add_func ("/Reversi/reversi/Complete game 431",
+                            test_complete_reversi_game_431);
+
+        Test.add_func ("/Reversi/reversi/Complete game 432",
+                            test_complete_reversi_game_432);
+
+        Test.add_func ("/Reversi/reversi/Complete game 433",
+                            test_complete_reversi_game_433);
+
+        Test.add_func ("/Reversi/reversi/Complete game 434",
+                            test_complete_reversi_game_434);
+
+        Test.add_func ("/Reversi/reversi/Complete game 435",
+                            test_complete_reversi_game_435);
+
+        Test.add_func ("/Reversi/reversi/Complete game 436",
+                            test_complete_reversi_game_436);
+
+        Test.add_func ("/Reversi/reversi/Complete game 437",
+                            test_complete_reversi_game_437);
+
+        Test.add_func ("/Reversi/reversi/Complete game 438",
+                            test_complete_reversi_game_438);
+
+        Test.add_func ("/Reversi/reversi/Complete game 439",
+                            test_complete_reversi_game_439);
+
+        Test.add_func ("/Reversi/reversi/Complete game 440",
+                            test_complete_reversi_game_440);
+
+        Test.add_func ("/Reversi/reversi/Complete game 441",
+                            test_complete_reversi_game_441);
+
+        Test.add_func ("/Reversi/reversi/Complete game 442",
+                            test_complete_reversi_game_442);
+
+        Test.add_func ("/Reversi/reversi/Complete game 443",
+                            test_complete_reversi_game_443);
+
+        Test.add_func ("/Reversi/reversi/Complete game 444",
+                            test_complete_reversi_game_444);
+
+        Test.add_func ("/Reversi/reversi/Complete game 445",
+                            test_complete_reversi_game_445);
+
+        Test.add_func ("/Reversi/reversi/Complete game 446",
+                            test_complete_reversi_game_446);
+
+        Test.add_func ("/Reversi/reversi/Complete game 447",
+                            test_complete_reversi_game_447);
+
+        Test.add_func ("/Reversi/reversi/Complete game 448",
+                            test_complete_reversi_game_448);
+
+        Test.add_func ("/Reversi/reversi/Complete game 449",
+                            test_complete_reversi_game_449);
+
+        Test.add_func ("/Reversi/reversi/Complete game 450",
+                            test_complete_reversi_game_450);
+
+        Test.add_func ("/Reversi/reversi/Complete game 451",
+                            test_complete_reversi_game_451);
+
+        Test.add_func ("/Reversi/reversi/Complete game 452",
+                            test_complete_reversi_game_452);
+
+        Test.add_func ("/Reversi/reversi/Complete game 453",
+                            test_complete_reversi_game_453);
+
+        Test.add_func ("/Reversi/reversi/Complete game 454",
+                            test_complete_reversi_game_454);
+
+        Test.add_func ("/Reversi/reversi/Complete game 455",
+                            test_complete_reversi_game_455);
+
+        Test.add_func ("/Reversi/reversi/Complete game 456",
+                            test_complete_reversi_game_456);
+
+        Test.add_func ("/Reversi/reversi/Complete game 457",
+                            test_complete_reversi_game_457);
+
+        Test.add_func ("/Reversi/reversi/Complete game 458",
+                            test_complete_reversi_game_458);
+
+        Test.add_func ("/Reversi/reversi/Complete game 459",
+                            test_complete_reversi_game_459);
+
+        Test.add_func ("/Reversi/reversi/Complete game 460",
+                            test_complete_reversi_game_460);
+
+        Test.add_func ("/Reversi/reversi/Complete game 461",
+                            test_complete_reversi_game_461);
+
+        Test.add_func ("/Reversi/reversi/Complete game 462",
+                            test_complete_reversi_game_462);
+
+        Test.add_func ("/Reversi/reversi/Complete game 463",
+                            test_complete_reversi_game_463);
+
+        Test.add_func ("/Reversi/reversi/Complete game 464",
+                            test_complete_reversi_game_464);
+
+        Test.add_func ("/Reversi/reversi/Complete game 465",
+                            test_complete_reversi_game_465);
+
+        Test.add_func ("/Reversi/reversi/Complete game 466",
+                            test_complete_reversi_game_466);
+
+        Test.add_func ("/Reversi/reversi/Complete game 467",
+                            test_complete_reversi_game_467);
+
+        Test.add_func ("/Reversi/reversi/Complete game 468",
+                            test_complete_reversi_game_468);
+
+        Test.add_func ("/Reversi/reversi/Complete game 469",
+                            test_complete_reversi_game_469);
+
+        Test.add_func ("/Reversi/reversi/Complete game 470",
+                            test_complete_reversi_game_470);
+
+        Test.add_func ("/Reversi/reversi/Complete game 471",
+                            test_complete_reversi_game_471);
+
+        Test.add_func ("/Reversi/reversi/Complete game 472",
+                            test_complete_reversi_game_472);
+
+        Test.add_func ("/Reversi/reversi/Complete game 473",
+                            test_complete_reversi_game_473);
+
+        Test.add_func ("/Reversi/reversi/Complete game 474",
+                            test_complete_reversi_game_474);
+
+        Test.add_func ("/Reversi/reversi/Complete game 475",
+                            test_complete_reversi_game_475);
+
+        Test.add_func ("/Reversi/reversi/Complete game 476",
+                            test_complete_reversi_game_476);
+
+        Test.add_func ("/Reversi/reversi/Complete game 477",
+                            test_complete_reversi_game_477);
+
+        Test.add_func ("/Reversi/reversi/Complete game 478",
+                            test_complete_reversi_game_478);
+
+        Test.add_func ("/Reversi/reversi/Complete game 479",
+                            test_complete_reversi_game_479);
+
+        Test.add_func ("/Reversi/reversi/Complete game 480",
+                            test_complete_reversi_game_480);
+
+        Test.add_func ("/Reversi/reversi/Complete game 481",
+                            test_complete_reversi_game_481);
+
+        Test.add_func ("/Reversi/reversi/Complete game 482",
+                            test_complete_reversi_game_482);
+
+        Test.add_func ("/Reversi/reversi/Complete game 483",
+                            test_complete_reversi_game_483);
+
+        Test.add_func ("/Reversi/reversi/Complete game 484",
+                            test_complete_reversi_game_484);
+
+        Test.add_func ("/Reversi/reversi/Complete game 485",
+                            test_complete_reversi_game_485);
+
+        Test.add_func ("/Reversi/reversi/Complete game 486",
+                            test_complete_reversi_game_486);
+
+        Test.add_func ("/Reversi/reversi/Complete game 487",
+                            test_complete_reversi_game_487);
+
+        Test.add_func ("/Reversi/reversi/Complete game 488",
+                            test_complete_reversi_game_488);
+
+        Test.add_func ("/Reversi/reversi/Complete game 489",
+                            test_complete_reversi_game_489);
+
+        Test.add_func ("/Reversi/reversi/Complete game 490",
+                            test_complete_reversi_game_490);
+
+        Test.add_func ("/Reversi/reversi/Complete game 491",
+                            test_complete_reversi_game_491);
+
+        Test.add_func ("/Reversi/reversi/Complete game 492",
+                            test_complete_reversi_game_492);
+
+        Test.add_func ("/Reversi/reversi/Complete game 493",
+                            test_complete_reversi_game_493);
+
+        Test.add_func ("/Reversi/reversi/Complete game 494",
+                            test_complete_reversi_game_494);
+
+        Test.add_func ("/Reversi/reversi/Complete game 495",
+                            test_complete_reversi_game_495);
+    }
+
+    /*\
+    * * perfs tests
+    \*/
+
+    private static inline void test_complete_reversi_game_1 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . D L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_2 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L L .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_3 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_4 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_5 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_6 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . D . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_7 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_8 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_9 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L L .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_10 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_11 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_12 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_13 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_14 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L L L .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_15 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_16 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_17 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_18 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_19 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_20 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_21 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_22 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_23 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_24 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_25 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_26 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_27 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_28 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_29 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . L . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_30 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_31 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_32 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_33 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_34 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_35 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_36 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_37 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_38 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+    }
+
+    private static inline void test_complete_reversi_game_39 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_40 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_41 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 5));
+    }
+
+    private static inline void test_complete_reversi_game_42 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_43 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_44 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_45 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . D L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_46 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . D L . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_47 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . D L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_48 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . L L L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_49 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L D . .",
+                           /* 5 */ " . . . L . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_50 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_51 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . L . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_52 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . L . L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_53 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_54 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_55 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_56 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+    }
+
+    private static inline void test_complete_reversi_game_57 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_58 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_59 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_60 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_61 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_62 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L D .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_63 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_64 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L D D .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_65 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_66 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_67 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . D D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_68 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_69 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_70 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_71 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_72 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_73 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_74 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_75 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_76 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_77 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_78 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_79 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_80 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_81 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_82 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 5));
+    }
+
+    private static inline void test_complete_reversi_game_83 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_84 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . D .",
+                           /* 3 */ " . . . L L D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_85 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_86 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . L . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_87 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . D . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_88 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_89 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . L . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_90 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_91 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_92 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_93 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_94 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_95 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+    }
+
+    private static inline void test_complete_reversi_game_96 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . L . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_97 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_98 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_99 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_100 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . L L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_101 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . D . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_102 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . D D L . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_103 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_104 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_105 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . D . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_106 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . D L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_107 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D D D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_108 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_109 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D L D . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_110 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_111 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_112 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . L . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_113 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . L . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_114 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_115 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_116 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_117 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_118 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_119 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_120 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_121 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_122 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_123 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_124 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_125 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+    }
+
+    private static inline void test_complete_reversi_game_126 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_127 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_128 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . L . . . . .",
+                           /* 2 */ " . . . L L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_129 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_130 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_131 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_132 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . L .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_133 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . L .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_134 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_135 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_136 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L . . .",
+                           /* 2 */ " . . . D L D . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_137 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D D D . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_138 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D D D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_139 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_140 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . D D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_141 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . D D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_142 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . D D . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_143 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L D D . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_144 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . L . . D . .",
+                           /* 2 */ " . . . L D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_145 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_146 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_147 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_148 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_149 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_150 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_151 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_152 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_153 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_154 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_155 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_156 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_157 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_158 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_159 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_160 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_161 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_162 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_163 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+    }
+
+    private static inline void test_complete_reversi_game_164 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_165 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_166 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_167 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_168 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_169 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_170 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . L L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_171 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_172 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_173 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_174 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_175 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . . L L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_176 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_177 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_178 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_179 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_180 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_181 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . L . . . .",
+                           /* 2 */ " . D D L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_182 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . D D D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_183 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . L . . . . . .",
+                           /* 2 */ " . D L D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_184 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_185 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_186 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_187 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_188 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_189 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_190 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_191 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_192 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_193 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L . L .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_194 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . L .",
+                           /* 3 */ " . . D D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_195 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L D D . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_196 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L . . .",
+                           /* 3 */ " . . D L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_197 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L L L .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_198 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_199 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L D . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_200 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_201 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_202 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_203 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L . D . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_204 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+    }
+
+    private static inline void test_complete_reversi_game_205 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_206 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_207 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_208 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_209 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_210 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_211 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_212 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_213 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_214 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_215 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_216 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_217 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_218 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_219 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_220 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_221 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_222 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_223 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_224 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_225 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_226 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_227 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_228 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_229 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_230 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L L D . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_231 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . L L L D . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_232 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_233 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . L D .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_234 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_235 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_236 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_237 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_238 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_239 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_240 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_241 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . L .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_242 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_243 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_244 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_245 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_246 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_247 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_248 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_249 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_250 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_251 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_252 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_253 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_254 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_255 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_256 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_257 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 0));
+    }
+
+    private static inline void test_complete_reversi_game_258 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_259 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_260 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_261 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_262 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_263 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_264 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . L . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_265 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D L . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_266 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L L L . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_267 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_268 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_269 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_270 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_271 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_272 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_273 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_274 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_275 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_276 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D L . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_277 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_278 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . D D D L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_279 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_280 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_281 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . L . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_282 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_283 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_284 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . L . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_285 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L . L . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_286 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_287 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_288 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L L L . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_289 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . . . L . .",
+                           /* 6 */ " . . . . . . L .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+    }
+
+    private static inline void test_complete_reversi_game_290 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_291 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_292 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_293 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_294 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . D L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_295 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . D L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_296 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . L L L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_297 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . D L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_298 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_299 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . L L L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_300 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_301 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_302 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_303 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_304 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_305 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_306 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . D .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+    }
+
+    private static inline void test_complete_reversi_game_307 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_308 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . D .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+    }
+
+    private static inline void test_complete_reversi_game_309 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_310 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_311 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . D .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_312 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . D .",
+                           /* 4 */ " . . . L L L L .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_313 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_314 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_315 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_316 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_317 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_318 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . D .",
+                           /* 4 */ " . . . L L D . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_319 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L L . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_320 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_321 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . L D . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_322 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D L . .",
+                           /* 5 */ " . . . . D D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_323 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_324 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_325 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_326 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_327 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_328 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_329 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_330 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_331 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_332 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_333 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+    }
+
+    private static inline void test_complete_reversi_game_334 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_335 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_336 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_337 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_338 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_339 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_340 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_341 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . D L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_342 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_343 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_344 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . L . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_345 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D L . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_346 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . D L . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_347 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L L L . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_348 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_349 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_350 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_351 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_352 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_353 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_354 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+    }
+
+    private static inline void test_complete_reversi_game_355 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_356 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . L L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+    }
+
+    private static inline void test_complete_reversi_game_357 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_358 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_359 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_360 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . D L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_361 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D D L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_362 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . D D D L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_363 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . D D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_364 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_365 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . L . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_366 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_367 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . D L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_368 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . L . D D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_369 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_370 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_371 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . D L . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_372 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . L L L . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_373 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_374 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . . . D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_375 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L L L . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_376 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_377 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D . . . . .",
+                           /* 2 */ " . . . D . L . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_378 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . D L . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_379 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_380 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_381 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_382 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_383 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . . D . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_384 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_385 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_386 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_387 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_388 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D D . L .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_389 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_390 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_391 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L L L .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_392 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_393 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_394 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_395 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_396 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_397 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_398 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_399 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_400 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L . D . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_401 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_402 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_403 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_404 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_405 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . L L L . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_406 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_407 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_408 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L L L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_409 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L D . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_410 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L D . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_411 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . L D . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_412 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+    }
+
+    private static inline void test_complete_reversi_game_413 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_414 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_415 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_416 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . D . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_417 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_418 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_419 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_420 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_421 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_422 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_423 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_424 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_425 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_426 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_427 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_428 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_429 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_430 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_431 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D L . . . .",
+                           /* 6 */ " . . . . L . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_432 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_433 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . L L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_434 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L D L . . .",
+                           /* 5 */ " . . D D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_435 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_436 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_437 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_438 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_439 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_440 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_441 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . D . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_442 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . D . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reversi_game_443 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . D . D L . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_444 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . D . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_445 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . D . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_446 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . D . D D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_447 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . D . L D . . .",
+                           /* 4 */ " . . D L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_448 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . D . D D . . .",
+                           /* 4 */ " . L L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+    }
+
+    private static inline void test_complete_reversi_game_449 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_450 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_451 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+    }
+
+    private static inline void test_complete_reversi_game_452 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L L L L .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 7));
+    }
+
+    private static inline void test_complete_reversi_game_453 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_454 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+    }
+
+    private static inline void test_complete_reversi_game_455 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D D L . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_456 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L L L . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . . D D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_457 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . . L D . . .",
+                           /* 6 */ " . . . L . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_458 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L L L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_459 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_460 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L D . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_461 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L . . .",
+                           /* 3 */ " . . D D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_462 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . D D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . . L . . . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_463 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . . . . .",
+                           /* 3 */ " . . L D D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . . D . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_464 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . L D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+    }
+
+    private static inline void test_complete_reversi_game_465 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_466 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 6));
+    }
+
+    private static inline void test_complete_reversi_game_467 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_468 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D D L . .",
+                           /* 5 */ " . . D . . . L .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_469 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L D . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_470 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . L D D D . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_471 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D D D . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_472 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L D D . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_473 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . L .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_474 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . L .",
+                           /* 3 */ " . . . D D L . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_475 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_476 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L . . .",
+                           /* 3 */ " . . . L D D . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+    }
+
+    private static inline void test_complete_reversi_game_477 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L L L .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+    }
+
+    private static inline void test_complete_reversi_game_478 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 7));
+    }
+
+    private static inline void test_complete_reversi_game_479 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . L . L D . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_480 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . L D . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+    }
+
+    private static inline void test_complete_reversi_game_481 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+    }
+
+    private static inline void test_complete_reversi_game_482 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . L L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_483 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . L . D . . .",
+                           /* 3 */ " . . . L L . . .",
+                           /* 4 */ " . . . D L . . .",
+                           /* 5 */ " . . D . . . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 7));
+    }
+
+    private static inline void test_complete_reversi_game_484 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . D . .",
+                           /* 2 */ " . . . . D . . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . . L L . . .",
+                           /* 5 */ " . . L . . . . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 2, 4));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 5));
+    }
+
+    private static inline void test_complete_reversi_game_485 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_486 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_487 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 0));
+    }
+
+    private static inline void test_complete_reversi_game_488 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . . D . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_489 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . . L . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+    }
+
+    private static inline void test_complete_reversi_game_490 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . L . . D . .",
+                           /* 6 */ " . L . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 4, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 2, 0));
+    }
+
+    private static inline void test_complete_reversi_game_491 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . L . . .",
+                           /* 6 */ " . . . . . L . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 6, 6));
+    }
+
+    private static inline void test_complete_reversi_game_492 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . . . .",
+                           /* 3 */ " . . . D D . . .",
+                           /* 4 */ " . . L L L L . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_493 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . . L . .",
+                           /* 3 */ " . . . D L . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 6, 1));
+    }
+
+    private static inline void test_complete_reversi_game_494 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . . L . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 6, 0));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 2));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 0, 7));
+    }
+
+    private static inline void test_complete_reversi_game_495 ()
+    {
+                                  /* 0 1 2 3 4 5 6 7 */
+        string [] board = {/* 0 */ " . . . . . . . .",
+                           /* 1 */ " . . . . . . . .",
+                           /* 2 */ " . . . L . . . .",
+                           /* 3 */ " . . . L D . . .",
+                           /* 4 */ " . . L L D . . .",
+                           /* 5 */ " . . D . D . . .",
+                           /* 6 */ " . . . . . . . .",
+                           /* 7 */ " . . . . . . . ."};
+
+        Game game = new Game.from_strings (board, Player.DARK, /* reverse */ false);
+        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 1, /* fixed heuristic */ true);
+
+        assert_true (ai_move (ai, 2, 1));
+        assert_true (ai_move (ai, 2, 6));
+        assert_true (ai_move (ai, 2, 2));
+        assert_true (ai_move (ai, 5, 6));
+        assert_true (ai_move (ai, 4, 6));
+        assert_true (ai_move (ai, 5, 2));
+        assert_true (ai_move (ai, 5, 4));
+        assert_true (ai_move (ai, 4, 2));
+        assert_true (ai_move (ai, 6, 2));
+        assert_true (ai_move (ai, 3, 1));
+        assert_true (ai_move (ai, 2, 0));
+        assert_true (ai_move (ai, 1, 2));
+        assert_true (ai_move (ai, 1, 3));
+        assert_true (ai_move (ai, 1, 4));
+        assert_true (ai_move (ai, 0, 2));
+        assert_true (ai_move (ai, 4, 0));
+        assert_true (ai_move (ai, 2, 3));
+        assert_true (ai_move (ai, 5, 1));
+        assert_true (ai_move (ai, 5, 3));
+        assert_true (ai_move (ai, 7, 2));
+        assert_true (ai_move (ai, 5, 0));
+        assert_true (ai_move (ai, 3, 0));
+        assert_true (ai_move (ai, 4, 1));
+        assert_true (ai_move (ai, 6, 3));
+        assert_true (ai_move (ai, 6, 4));
+        assert_true (ai_move (ai, 0, 3));
+        assert_true (ai_move (ai, 2, 7));
+        assert_true (ai_move (ai, 0, 1));
+        assert_true (ai_move (ai, 0, 5));
+        assert_true (ai_move (ai, 1, 5));
+        assert_true (ai_move (ai, 7, 3));
+        assert_true (ai_move (ai, 3, 5));
+        assert_true (ai_move (ai, 7, 1));
+        assert_true (ai_move (ai, 5, 7));
+        assert_true (ai_move (ai, 4, 7));
+        assert_true (ai_move (ai, 5, 5));
+        assert_true (ai_move (ai, 6, 5));
+        assert_true (ai_move (ai, 3, 7));
+        assert_true (ai_move (ai, 6, 7));
+        assert_true (ai_move (ai, 3, 6));
+        assert_true (ai_move (ai, 6, 1));
+        assert_true (ai_move (ai, 7, 4));
+        assert_true (ai_move (ai, 7, 5));
+        assert_true (ai_move (ai, 1, 1));
+        assert_true (ai_move (ai, 0, 4));
+        assert_true (ai_move (ai, 0, 6));
+        assert_true (ai_move (ai, 1, 6));
+        assert_true (ai_move (ai, 1, 0));
+        assert_true (ai_move (ai, 0, 0));
+        assert_true (ai_move (ai, 0, 7));
+        assert_true (ai_move (ai, 1, 7));
+        assert_true (ai_move (ai, 7, 7));
+        assert_true (game.pass ());
+        assert_true (ai_move (ai, 7, 6));
+        assert_true (ai_move (ai, 6, 6));
+        assert_true (ai_move (ai, 7, 0));
+        assert_true (ai_move (ai, 6, 0));
+    }
+}
diff --git a/src/test-iagno.vala b/src/test-iagno.vala
index 432d5fd..18e41ea 100644
--- a/src/test-iagno.vala
+++ b/src/test-iagno.vala
@@ -1,5 +1,5 @@
-/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
+/* -*- Mode: vala; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
    This file is part of GNOME Reversi, also known as Iagno.
 
    Copyright 2013, 2014 Michael Catanzaro
@@ -19,57 +19,40 @@
    along with GNOME Reversi.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-private class TestIagno : Object
+namespace TestReversi
 {
     private static int main (string [] args)
     {
         Test.init (ref args);
 
-        Test.add_func ("/Iagno/test tests",
-                            test_tests);
+        Test.add_func ("/Reversi/test tests",
+                                 test_tests);
 
-        // if meson is configured with -Dperfs_tests=true,
-        // both tests are performed, else only short_tests
-        if (Test.perf ())
-            perfs_tests ();
-        else
-            short_tests ();
+        short_tests ();
 
         return Test.run ();
     }
 
     private static void short_tests ()
     {
-        Test.add_func ("/Iagno/Pass then Undo",
+        Test.add_func ("/Reversi/Pass then Undo",
                             test_undo_after_pass);
-        Test.add_func ("/Iagno/Undo at Start",
+        Test.add_func ("/Reversi/Undo at Start",
                             test_undo_at_start);
-        Test.add_func ("/Iagno/Current Color after Pass",
+        Test.add_func ("/Reversi/Current Color after Pass",
                             test_current_color_after_pass);
-        Test.add_func ("/Iagno/AI Search 1",
+        Test.add_func ("/Reversi/AI Search 1",
                             test_ai_search_1);
-        Test.add_func ("/Iagno/AI Search 2",
+        Test.add_func ("/Reversi/AI Search 2",
                             test_ai_search_2);
-        Test.add_func ("/Iagno/AI Search 3",
+        Test.add_func ("/Reversi/AI Search 3",
                             test_ai_search_3);
-        Test.add_func ("/Iagno/AI Search 4",
+        Test.add_func ("/Reversi/AI Search 4",
                             test_ai_search_4);
-        Test.add_func ("/Iagno/AI Search 5",
+        Test.add_func ("/Reversi/AI Search 5",
                             test_ai_search_5);
     }
 
-    private static void perfs_tests ()
-    {
-        Test.add_func ("/Iagno/Complete game 1",
-                            test_complete_game_1);
-        Test.add_func ("/Iagno/Complete game 2",
-                            test_complete_game_2);
-        Test.add_func ("/Iagno/Complete game 3",
-                            test_complete_game_3);
-        Test.add_func ("/Iagno/Complete game 4",
-                            test_complete_game_4);
-    }
-
     private static void test_tests ()
     {
         assert_true (1 + 1 == 2);
@@ -116,13 +99,14 @@ private class TestIagno : Object
         assert_true (game.number_of_moves == 2);
         game.undo (2);
         assert_true (game.number_of_moves == 0);
-        assert_true (game.to_string ().strip () == string.joinv ("\n", board).strip ());
+        string? [] board2 = (string? []) board; // TODO report bug
+        assert_true (game.to_string ().strip () == string.joinv ("\n", board2).strip ());
         assert_true (game.place_tile (7, 2));
         assert_true (game.number_of_moves == 1);
         assert_true (!game.current_player_can_move);
         game.undo (1);
         assert_true (game.number_of_moves == 0);
-        assert_true (game.to_string ().strip () == string.joinv ("\n", board).strip ());
+        assert_true (game.to_string ().strip () == string.joinv ("\n", board2).strip ());
     }
 
     private static void test_undo_at_start ()
@@ -232,303 +216,4 @@ private class TestIagno : Object
         assert_true (ai_move (ai, 0, 5));
         /* didn't crash */
     }
-
-    /*\
-    * * perfs tests
-    \*/
-
-    private static void test_complete_game_1 ()
-    {
-        /* human starts              0 1 2 3 4 5 6 7 */
-        string [] board = {/* 0 */ " . . . . . . . .",
-                           /* 1 */ " . . . L . . . .",
-                           /* 2 */ " . . . . L . . .",
-                           /* 3 */ " . . . L D L . .",
-                           /* 4 */ " . . . D D D . .",
-                           /* 5 */ " . . . . . . . .",
-                           /* 6 */ " . . . . . . . .",
-                           /* 7 */ " . . . . . . . ." };
-
-        Game game = new Game.from_strings (board, Player.DARK);
-        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 6);
-
-        assert_true (game.place_tile (4, 1));
-        assert_true (ai_move (ai, 5, 5));
-        assert_true (game.place_tile (4, 5));
-        assert_true (ai_move (ai, 3, 5));
-        assert_true (game.place_tile (2, 5));
-        assert_true (ai_move (ai, 2, 4));
-        assert_true (game.place_tile (4, 6));
-        assert_true (ai_move (ai, 2, 6));
-        assert_true (game.place_tile (1, 4));
-        assert_true (ai_move (ai, 0, 4));
-        assert_true (game.place_tile (2, 3));
-        assert_true (ai_move (ai, 1, 3));
-        assert_true (game.place_tile (1, 5));
-        assert_true (ai_move (ai, 2, 2));
-        assert_true (game.place_tile (3, 2));
-        assert_true (ai_move (ai, 5, 2));
-        assert_true (game.place_tile (6, 4));
-        assert_true (ai_move (ai, 5, 6));
-        assert_true (game.place_tile (3, 0));
-        assert_true (ai_move (ai, 0, 5));
-        assert_true (game.place_tile (3, 6));
-        assert_true (ai_move (ai, 5, 7));
-        assert_true (game.place_tile (0, 3));
-        assert_true (ai_move (ai, 0, 2));
-        assert_true (game.place_tile (6, 5));
-        assert_true (ai_move (ai, 1, 2));
-        assert_true (game.place_tile (3, 7));
-        assert_true (ai_move (ai, 2, 7));
-        assert_true (game.place_tile (4, 7));
-        assert_true (ai_move (ai, 6, 6));
-        assert_true (game.place_tile (2, 1));
-        assert_true (ai_move (ai, 2, 0));
-        assert_true (game.place_tile (1, 0));
-        assert_true (ai_move (ai, 1, 1));
-        assert_true (game.place_tile (6, 2));
-        assert_true (ai_move (ai, 4, 0));
-        assert_true (game.place_tile (5, 0));
-        assert_true (ai_move (ai, 7, 3));
-        assert_true (game.place_tile (6, 3));
-        assert_true (ai_move (ai, 7, 2));
-        assert_true (game.place_tile (5, 1));
-        assert_true (ai_move (ai, 6, 1));
-        assert_true (game.place_tile (7, 4));
-        assert_true (ai_move (ai, 7, 5));
-        assert_true (game.place_tile (7, 1));
-        assert_true (ai_move (ai, 7, 0));
-        assert_true (game.place_tile (7, 7));
-        assert_true (ai_move (ai, 6, 7));
-        assert_true (game.place_tile (7, 6));
-        assert_true (ai_move (ai, 6, 0));
-        assert_true (game.place_tile (0, 0));
-        assert_true (ai_move (ai, 0, 1));
-        assert_true (game.place_tile (0, 6));
-        assert_true (ai_move (ai, 1, 6));
-        assert_true (game.place_tile (1, 7));
-        assert_true (ai_move (ai, 0, 7));
-    }
-
-    private static void test_complete_game_2 ()
-    {
-        /* human starts              0 1 2 3 4 5 6 7 */
-        string [] board = {/* 0 */ " . . . . . . . .",
-                           /* 1 */ " . . . . . . . .",
-                           /* 2 */ " . . . D . . . .",
-                           /* 3 */ " . . L L L L . .",
-                           /* 4 */ " . . . D D D . .",
-                           /* 5 */ " . . . . . . . .",
-                           /* 6 */ " . . . . . . . .",
-                           /* 7 */ " . . . . . . . ." };
-
-        Game game = new Game.from_strings (board, Player.DARK);
-        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 6);
-
-        assert_true (game.place_tile (4, 2));
-        assert_true (ai_move (ai, 5, 5));
-        assert_true (game.place_tile (6, 4));
-        assert_true (ai_move (ai, 5, 2));
-        assert_true (game.place_tile (6, 5));
-        assert_true (ai_move (ai, 2, 2));
-        assert_true (game.place_tile (3, 1));
-        assert_true (ai_move (ai, 4, 5));
-        assert_true (game.place_tile (3, 5));
-        assert_true (ai_move (ai, 6, 3));
-        assert_true (game.place_tile (2, 4));
-        assert_true (ai_move (ai, 3, 6));
-        assert_true (game.place_tile (7, 3));
-        assert_true (ai_move (ai, 2, 5));
-        assert_true (game.place_tile (3, 7));
-        assert_true (ai_move (ai, 7, 5));
-        assert_true (game.place_tile (5, 6));
-        assert_true (ai_move (ai, 5, 7));
-        assert_true (game.place_tile (6, 2));
-        assert_true (ai_move (ai, 4, 6));
-        assert_true (game.place_tile (4, 7));
-        assert_true (ai_move (ai, 2, 7));
-        assert_true (game.place_tile (1, 3));
-        assert_true (ai_move (ai, 1, 2));
-        assert_true (game.place_tile (0, 2));
-        assert_true (ai_move (ai, 2, 1));
-        assert_true (game.place_tile (2, 0));
-        assert_true (ai_move (ai, 1, 1));
-        assert_true (game.place_tile (2, 6));
-        assert_true (ai_move (ai, 1, 7));
-        assert_true (game.place_tile (4, 1));
-        assert_true (ai_move (ai, 7, 4));
-        assert_true (game.place_tile (7, 6));
-        assert_true (ai_move (ai, 0, 4));
-        assert_true (game.place_tile (0, 3));
-        assert_true (ai_move (ai, 0, 1));
-        assert_true (game.place_tile (1, 4));
-        assert_true (ai_move (ai, 6, 6));
-        assert_true (game.place_tile (1, 6));
-        assert_true (ai_move (ai, 4, 0));
-        assert_true (game.place_tile (3, 0));
-        assert_true (ai_move (ai, 1, 0));
-        assert_true (game.place_tile (5, 1));
-        assert_true (ai_move (ai, 7, 2));
-        assert_true (game.place_tile (7, 7));
-        assert_true (ai_move (ai, 6, 0));
-        assert_true (game.place_tile (6, 1));
-        assert_true (ai_move (ai, 6, 7));
-        assert_true (game.place_tile (0, 7));
-        assert_true (ai_move (ai, 5, 0));
-        assert_true (game.place_tile (0, 0));
-        assert_true (ai_move (ai, 0, 6));
-        assert_true (game.place_tile (0, 5));
-        assert_true (ai_move (ai, 1, 5));
-        assert_true (game.place_tile (7, 0));
-        assert_true (ai_move (ai, 7, 1));
-    }
-
-    private static void test_complete_game_3 ()
-    {
-        /* AI starts                 0 1 2 3 4 5 6 7 */
-        string [] board = {/* 0 */ " . . . . . . . .",
-                           /* 1 */ " . . . . . . . .",
-                           /* 2 */ " . . . . . D . .",
-                           /* 3 */ " . . . L D D . .",
-                           /* 4 */ " . . . D L D . .",
-                           /* 5 */ " . . . . . L . .",
-                           /* 6 */ " . . . . . . . .",
-                           /* 7 */ " . . . . . . . ." };
-
-        Game game = new Game.from_strings (board, Player.DARK);
-        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 6);
-
-        assert_true (ai_move (ai, 3, 5));
-        assert_true (game.place_tile (6, 3));
-        assert_true (ai_move (ai, 3, 2));
-        assert_true (game.place_tile (2, 3));
-        assert_true (ai_move (ai, 1, 4));
-        assert_true (game.place_tile (4, 5));
-        assert_true (ai_move (ai, 6, 5));
-        assert_true (game.place_tile (2, 6));
-        assert_true (ai_move (ai, 2, 5));
-        assert_true (game.place_tile (3, 6));
-        assert_true (ai_move (ai, 2, 2));
-        assert_true (game.place_tile (0, 3));
-        assert_true (ai_move (ai, 6, 2));
-        assert_true (game.place_tile (1, 3));
-        assert_true (ai_move (ai, 0, 5));
-        assert_true (game.place_tile (4, 1));
-        assert_true (ai_move (ai, 5, 1));
-        assert_true (game.place_tile (6, 4));
-        assert_true (ai_move (ai, 1, 5));
-        assert_true (game.place_tile (5, 0));
-        assert_true (ai_move (ai, 7, 3));
-        assert_true (game.place_tile (2, 4));
-        assert_true (ai_move (ai, 3, 0));
-        assert_true (game.place_tile (4, 2));
-        assert_true (ai_move (ai, 3, 1));
-        assert_true (game.place_tile (0, 4));
-        assert_true (ai_move (ai, 0, 2));
-        assert_true (game.place_tile (1, 2));
-        assert_true (ai_move (ai, 4, 7));
-        assert_true (game.place_tile (2, 7));
-        assert_true (ai_move (ai, 0, 6));
-        assert_true (game.place_tile (4, 6));
-        assert_true (ai_move (ai, 5, 7));
-        assert_true (game.place_tile (5, 6));
-        assert_true (ai_move (ai, 2, 1));
-        assert_true (game.place_tile (2, 0));
-        assert_true (ai_move (ai, 1, 0));
-        assert_true (game.place_tile (7, 5));
-        assert_true (ai_move (ai, 6, 7));
-        assert_true (game.place_tile (7, 2));
-        assert_true (ai_move (ai, 7, 6));
-        assert_true (game.place_tile (7, 7));
-        assert_true (ai_move (ai, 3, 7));
-        assert_true (game.place_tile (7, 4));
-        assert_true (ai_move (ai, 1, 1));
-        assert_true (game.place_tile (6, 6));
-        assert_true (ai_move (ai, 6, 1));
-        assert_true (game.place_tile (0, 0));
-        assert_true (ai_move (ai, 1, 7));
-        assert_true (game.place_tile (4, 0));
-        assert_true (ai_move (ai, 6, 0));
-        assert_true (game.place_tile (0, 7));
-        assert_true (ai_move (ai, 0, 1));
-        assert_true (game.place_tile (1, 6));
-        assert_true (ai_move (ai, 7, 1));
-        assert_true (game.place_tile (7, 0));
-    }
-
-    private static void test_complete_game_4 ()
-    {
-        /* AI starts                 0 1 2 3 4 5 6 7 */
-        string [] board = {/* 0 */ " . . . . . . . .",
-                           /* 1 */ " . . . . . . . .",
-                           /* 2 */ " . . . D . L . .",
-                           /* 3 */ " . . . D L . . .",
-                           /* 4 */ " . . L L D . . .",
-                           /* 5 */ " . . . . D . . .",
-                           /* 6 */ " . . . . . . . .",
-                           /* 7 */ " . . . . . . . ." };
-
-        Game game = new Game.from_strings (board, Player.DARK);
-        ComputerPlayer ai = new ComputerReversiHard (game, /* depth */ 6);
-
-        assert_true (ai_move (ai, 5, 4));
-        assert_true (game.place_tile (6, 4));
-        assert_true (ai_move (ai, 1, 5));
-        assert_true (game.place_tile (2, 2));
-        assert_true (ai_move (ai, 3, 5));
-        assert_true (game.place_tile (1, 4));
-        assert_true (ai_move (ai, 6, 3));
-        assert_true (game.place_tile (4, 2));
-        assert_true (ai_move (ai, 4, 1));
-        assert_true (game.place_tile (5, 5));
-        assert_true (ai_move (ai, 2, 3));
-        assert_true (game.place_tile (4, 0));
-        assert_true (ai_move (ai, 5, 6));
-        assert_true (game.place_tile (2, 6));
-        assert_true (ai_move (ai, 2, 5));
-        assert_true (game.place_tile (0, 4));
-        assert_true (ai_move (ai, 0, 6));
-        assert_true (game.place_tile (1, 3));
-        assert_true (ai_move (ai, 5, 1));
-        assert_true (game.place_tile (6, 7));
-        assert_true (ai_move (ai, 3, 6));
-        assert_true (game.place_tile (3, 7));
-        assert_true (ai_move (ai, 5, 0));
-        assert_true (game.place_tile (6, 5));
-        assert_true (ai_move (ai, 3, 0));
-        assert_true (game.place_tile (3, 1));
-        assert_true (ai_move (ai, 0, 2));
-        assert_true (game.place_tile (5, 3));
-        assert_true (ai_move (ai, 7, 4));
-        assert_true (game.place_tile (7, 2));
-        assert_true (ai_move (ai, 7, 5));
-        assert_true (game.place_tile (4, 6));
-        assert_true (ai_move (ai, 1, 2));
-        assert_true (game.place_tile (7, 3));
-        assert_true (ai_move (ai, 6, 2));
-        assert_true (game.place_tile (7, 6));
-        assert_true (ai_move (ai, 2, 7));
-        assert_true (game.place_tile (1, 7));
-        assert_true (ai_move (ai, 2, 0));
-        assert_true (game.place_tile (7, 1));
-        assert_true (ai_move (ai, 6, 6));
-        assert_true (game.place_tile (0, 3));
-        assert_true (ai_move (ai, 0, 5));
-        assert_true (game.place_tile (7, 7));
-        assert_true (ai_move (ai, 6, 1));
-        assert_true (game.place_tile (7, 0));
-        assert_true (ai_move (ai, 6, 0));
-        assert_true (game.place_tile (1, 0));
-        assert_true (ai_move (ai, 1, 6));
-        assert_true (game.place_tile (2, 1));
-        assert_true (game.pass ());
-        assert_true (game.place_tile (0, 7));
-        assert_true (game.pass ());
-        assert_true (game.place_tile (0, 1));
-        assert_true (ai_move (ai, 1, 1));
-        assert_true (game.place_tile (0, 0));
-        assert_true (game.pass ());
-        assert_true (game.place_tile (4, 7));
-        assert_true (ai_move (ai, 5, 7));
-    }
 }



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]