{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Deep Reversi AI\n", "\n", "The game is not" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%load_ext blackcellmagic" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import abc\n", "from typing import Final\n", "from scipy.ndimage import binary_dilation\n", "from tqdm.auto import tqdm\n", "import matplotlib.pyplot as plt\n", "from abc import ABC" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Constants" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "ENEMY: Final[int] = -1\n", "PLAYER: Final[int] = 1\n", "BOARD_SIZE: Final[int] = 8" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-1, -1],\n", " [-1, 0],\n", " [-1, 1],\n", " [ 0, -1],\n", " [ 0, 1],\n", " [ 1, -1],\n", " [ 1, 0],\n", " [ 1, 1]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "DIRECTIONS: Final[np.ndarray] = np.array(\n", " [[i, j] for i in range(-1, 2) for j in range(-1, 2) if j != 0 or i != 0], dtype=int\n", ")\n", "DIRECTIONS" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating new boards" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, -1, 1, 0, 0, 0],\n", " [ 0, 0, 0, 1, -1, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_new_games(number_of_games: int):\n", " empty = np.zeros([number_of_games, BOARD_SIZE, BOARD_SIZE], dtype=int)\n", " empty[:, 3:5, 3:5] = np.array([[-1, 1], [1, -1]])\n", " return empty\n", "\n", "\n", "get_new_games(1)[0]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "test_number_of_games = 3\n", "assert get_new_games(test_number_of_games).shape == (\n", " test_number_of_games,\n", " BOARD_SIZE,\n", " BOARD_SIZE,\n", ")\n", "np.testing.assert_equal(\n", " get_new_games(test_number_of_games).sum(axis=1),\n", " np.zeros(\n", " [\n", " test_number_of_games,\n", " 8,\n", " ]\n", " ),\n", ")\n", "np.testing.assert_equal(\n", " get_new_games(test_number_of_games).sum(axis=2),\n", " np.zeros(\n", " [\n", " test_number_of_games,\n", " 8,\n", " ]\n", " ),\n", ")\n", "assert np.all(get_new_games(test_number_of_games)[:, 3:4, 3:4] != 0)\n", "del test_number_of_games" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAASIAAAEiCAYAAABdvt+2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/P9b71AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAdeElEQVR4nO3de1BU58EG8GdhyerAsgpKlIgiYEUxOCjGWsZUTCSuQkwnY9uMNhpp64UAubURO2nTprpmoh1bL2gVLx3jrZ2YJowg8f5lEkWMWpMQIxAqKRqTirtA2u3Cnu+PA6sIC5xlz3mF8/xmztiFs/u8L9AnZ8+ei0GSJAlERAIFiB4AERGLiIiEYxERkXAsIiISjkVERMKxiIhIOBYREQnHIiIi4YxaB7rdbtTW1sJsNsNgMGgdT0QakSQJ9fX1iIyMREBA59s8mhdRbW0toqKitI4lIkFqamowbNiwTtfRvIjMZvPtByEahzfc8b/1lC06n3MXky06vyW7zf/nvdC8iDxvx0IAvKRx+FoA9QDMAF7UUbbofM5dn3NfA6AB3doFw53VRCQci4iIhGMREZFwLCIiEo5FRETCsYiISDgWEREJxyIiIuEUF9GpU6eQkZGByMhIGAwGvP322yoMi4j0RHERNTY2Yvz48di4caMa4yEiHVJ8iofVaoXValVjLESkU6qfa+Z0OuF0Oj2PHQ6H2pFE1MuovrPaZrPBYrF4Fl4ChIjupnoR5eXlwW63e5aamhq1I4mol1H9rZnJZILJZFI7hoh6MR5HRETCKd4iamhoQEVFhefxF198gQsXLiAsLAzDhw/36+CISB8UF1FZWRlSU1M9j1944QUAwIIFC7Bz506/DYyI9ENxEU2bNg2SJKkxFiLSKe4jIiLhWEREJByLiIiEYxERkXAsIiISjkVERMKxiIhIOBYREQlnkDQ+OtHhcMBiscgPzFomA2gAIAEwAAjRUbbofM5dn3Ovl/+x2+0IDQ3tdFXVz77vVL2gXEmn2aLzOXdxROd3QWwRcYtIH/mcuz7nrqD4xBVRCIAXNc5cC/mHo7ds0fmcuz7nvgZyEXYDd1YTkXAsIiISjkVERMKxiIhIOBYREQnHIiIi4VhERCQci4iIhFNURDabDZMmTYLZbEZERASeeOIJXL58Wa2xEZFOKCqikydPIisrC6dPn8Z7770Hl8uFtLQ0NDY2qjU+ItIBRad4FBcXt3m8c+dORERE4Ny5c3j44Yf9OjAi0o8enWtmt9sBAGFhYV7XcTqdcDqdnscOh6MnkUTUB/m8s9rtduO5555DSkoKxo0b53U9m80Gi8XiWaKionyNJKI+yuciysrKwscff4x9+/Z1ul5eXh7sdrtnqamp8TWSiPoon96aPfvssygsLMSpU6cwbNiwTtc1mUwwmUw+DY6I9EFREUmShOzsbBw8eBAnTpzAyJEj1RoXEemIoiLKysrCnj178Pe//x1msxnXr18HAFgsFvTv31+VARJR36doH1F+fj7sdjumTZuGoUOHepb9+/erNT4i0gHFb82IiPyN55oRkXAsIiISjkVERMKxiIhIOBYREQnHIiIi4VhERCQci4iIhDNIGh+l6HA4YLFY5AdmLZMh34dbAmCAfC9wvWSLzufc9Tn3evkfu92O0NDQTlft0YXReqxeUK6k02zR+Zy7OKLzuyC2iLhFpI98zl2fc1dQfOKKKATAixpnroX8w9Fbtuh8zl2fc18DuQi7gTuriUg4FhERCcciIiLhWEREJByLiIiEYxERkXAsIiISTvHF8xMTExEaGorQ0FBMmTIFRUVFao2NiHRCURENGzYMq1evxrlz51BWVobp06djzpw5+OSTT9QaHxHpgKIjqzMyMto8XrlyJfLz83H69GkkJCT4dWBEpB8+n+LR3NyMv/71r2hsbMSUKVP8OSYi0hnFRXTp0iVMmTIF//3vfxESEoKDBw9i7NixXtd3Op1wOp2exw6Hw7eRElGfpfhTs9GjR+PChQs4c+YMli5digULFuDTTz/1ur7NZoPFYvEsUVFRPRowEfU9iovovvvuQ1xcHCZOnAibzYbx48fjj3/8o9f18/LyYLfbPUtNTU2PBkxEfU+PLwPidrvbvPW6m8lkgslk6mkMEfVhioooLy8PVqsVw4cPR319Pfbs2YMTJ07g8OHDao2PiHRAURHduHEDTz/9NK5duwaLxYLExEQcPnwYM2bMUGt8RKQDioqooKBArXEQkY7xXDMiEo5FRETCsYiISDgWEREJxyIiIuFYREQkHIuIiIRjERGRcAZJkiQtAx0OBywWi/zArGUyeA90zp1z11K9/I/dbkdoaGinq/b4pNceqReUK+k0W3Q+5y6O6PwuiC0ibhHpI59z1+fcFRSfuCIKAfCixplr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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_othello_board(board, ax=None):\n", " size = 3\n", " plot_all = False\n", " if ax is None:\n", " plot_all = True\n", " fig, ax = plt.subplots(figsize=(size, size))\n", "\n", " ax.set_facecolor(\"green\")\n", " for i in range(BOARD_SIZE):\n", " for j in range(BOARD_SIZE):\n", " if board[i, j] == -1:\n", " color = \"white\"\n", " elif board[i, j] == 1:\n", " color = \"black\"\n", " else:\n", " continue\n", " ax.scatter(j, i, s=300 if plot_all else 150, c=color)\n", " for i in range(-1, 8):\n", " ax.axhline(i + 0.5, color=\"black\", lw=2)\n", " ax.axvline(i + 0.5, color=\"black\", lw=2)\n", " ax.set_xlim(-0.5, 7.5)\n", " ax.set_ylim(7.5, -0.5)\n", " ax.set_xticks(np.arange(8))\n", " ax.set_xticklabels(list(\"ABCDEFGH\"))\n", " ax.set_yticks(np.arange(8))\n", " ax.set_yticklabels(list(\"12345678\"))\n", " if plot_all:\n", " plt.tight_layout()\n", " plt.show()\n", "\n", "\n", "plot_othello_board(get_new_games(1)[0])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def plot_othello_boards(boards: np.ndarray) -> None:\n", " assert boards.shape[0] < 70\n", " plots_per_row = 4\n", " rows = int(np.ceil(boards.shape[0] / plots_per_row))\n", " fig, axs = plt.subplots(rows, plots_per_row, figsize=(12, 3 * rows))\n", " for game_index, ax in enumerate(axs.flatten()):\n", " if game_index >= boards.shape[0]:\n", " fig.delaxes(ax)\n", " else:\n", " plot_othello_board(boards[game_index], ax)\n", " plt.tight_layout()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([[[1, 1, 1],\n", " [1, 0, 1],\n", " [1, 1, 1]]])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SURROUNDING: Final = np.array([[[1, 1, 1], [1, 0, 1], [1, 1, 1]]])\n", "SURROUNDING" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[[False, False, False, False, False, False, False, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, False, True, False, False, False, False],\n", " [False, False, True, False, False, False, False, False],\n", " [False, False, False, False, False, True, False, False],\n", " [False, False, False, False, True, False, False, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, False, False, False, False, False, False]]])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def recursive_steps(_array, rec_direction, rec_position, step_one=True) -> bool:\n", " rec_position = rec_position + rec_direction\n", " if np.any((rec_position >= BOARD_SIZE) | (rec_position < 0)):\n", " return False\n", " next_field = _array[tuple(rec_position.tolist())]\n", " if next_field == 0:\n", " return False\n", " if next_field == -1:\n", " return recursive_steps(_array, rec_direction, rec_position, step_one=False)\n", " if next_field == 1:\n", " return not step_one\n", "\n", "\n", "def get_possible_turns(boards: np.ndarray) -> np.ndarray:\n", " try:\n", " _poss_turns = boards == 0\n", " _poss_turns &= binary_dilation(boards == -1, SURROUNDING)\n", " except RuntimeError as err:\n", " print(boards)\n", " print(boards == -1)\n", " print(\"err\")\n", " raise err\n", " for game in range(boards.shape[0]):\n", " for idx in range(BOARD_SIZE):\n", " for idy in range(BOARD_SIZE):\n", "\n", " position = idx, idy\n", " if _poss_turns[game, idx, idy]:\n", " _poss_turns[game, idx, idy] = any(\n", " recursive_steps(boards[game, :, :], direction, position)\n", " for direction in DIRECTIONS\n", " )\n", " return _poss_turns\n", "\n", "\n", "# %timeit get_possible_turns(get_new_games(10))\n", "# %timeit get_possible_turns(get_new_games(100))\n", "get_possible_turns(get_new_games(3))[:1]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([2, 2, 2]), array([2, 2, 2]))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def evaluate_boards(array: np.ndarray):\n", " return np.sum(array == 1, axis=(1, 2)), np.sum(array == -1, axis=(1, 2))\n", "\n", "\n", "evaluate_boards(get_new_games(3))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def move_possible(board: np.ndarray, move: np.ndarray) -> bool:\n", " if np.all(move == -1):\n", " return not np.any(get_possible_turns(np.reshape(board, (1, 8, 8))))\n", " return any(\n", " recursive_steps(board[:, :], direction, move) for direction in DIRECTIONS\n", " )\n", "\n", "\n", "assert move_possible(get_new_games(1)[0], np.array([2, 3])) is True\n", "assert move_possible(get_new_games(1)[0], np.array([3, 2])) is True\n", "assert move_possible(get_new_games(1)[0], np.array([2, 2])) is False\n", "assert move_possible(np.zeros((8, 8)), np.array([3, 2])) is False\n", "assert move_possible(np.ones((8, 8)) * 1, np.array([-1, -1])) is True\n", "assert move_possible(np.ones((8, 8)) * -1, np.array([-1, -1])) is True\n", "assert move_possible(np.ones((8, 8)) * 0, np.array([-1, -1])) is True" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "def moves_possible(boards: np.ndarray, moves: np.ndarray) -> np.ndarray:\n", " arr_moves_possible = np.zeros(boards.shape[0], dtype=bool)\n", " for game in range(boards.shape[0]):\n", " if np.all(moves[game] == -1):\n", " try:\n", " arr_moves_possible[game] = not np.any(\n", " get_possible_turns(np.reshape(boards[game], (1, 8, 8)))\n", " )\n", " except Exception as err:\n", " print(test)\n", " raise err\n", " else:\n", " arr_moves_possible[game] = any(\n", " recursive_steps(boards[game, :, :], direction, moves[game])\n", " for direction in DIRECTIONS\n", " )\n", " return arr_moves_possible\n", "\n", "\n", "np.testing.assert_array_equal(\n", " moves_possible(np.ones((3, 8, 8)) * 1, np.array([[-1, -1]] * 3)),\n", " np.array([True] * 3),\n", ")\n", "\n", "np.testing.assert_array_equal(\n", " moves_possible(get_new_games(3), np.array([[2, 3], [3, 2], [3, 2]])),\n", " np.array([True] * 3),\n", ")\n", "np.testing.assert_array_equal(\n", " moves_possible(get_new_games(3), np.array([[2, 2], [1, 1], [0, 0]])),\n", " np.array([False] * 3),\n", ")\n", "np.testing.assert_array_equal(\n", " moves_possible(np.ones((3, 8, 8)) * -1, np.array([[-1, -1]] * 3)),\n", " np.array([True] * 3),\n", ")\n", "np.testing.assert_array_equal(\n", " moves_possible(np.zeros((3, 8, 8)), np.array([[-1, -1]] * 3)), np.array([True] * 3)\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 1, 0, 0, 0, 0],\n", " [ 0, 0, 0, 1, 1, 0, 0, 0],\n", " [ 0, 0, 0, 1, -1, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class InvalidTurn(ValueError):\n", " pass\n", "\n", "\n", "def do_moves(boards: np.ndarray, moves: np.ndarray) -> np.ndarray:\n", " def _do_directional_move(\n", " board: np.ndarray, rec_move: np.ndarray, rev_direction, step_one=True\n", " ) -> bool:\n", " rec_position = rec_move + rev_direction\n", " if np.any((rec_position >= 8) | (rec_position < 0)):\n", " return False\n", " next_field = board[tuple(rec_position.tolist())]\n", " if next_field == 0:\n", " return False\n", " if next_field == 1:\n", " return not step_one\n", " if next_field == -1:\n", " if _do_directional_move(board, rec_position, rev_direction, step_one=False):\n", " board[tuple(rec_position.tolist())] = 1\n", " return True\n", " return False\n", "\n", " def _do_move(_board: np.ndarray, move: np.ndarray) -> None:\n", " if np.all(move == -1):\n", " return\n", " if _board[tuple(move.tolist())] != 0:\n", " raise InvalidTurn\n", " action = False\n", " for direction in DIRECTIONS:\n", " if _do_directional_move(_board, move, direction):\n", " action = True\n", " if not action:\n", " raise InvalidTurn()\n", " _board[tuple(move.tolist())] = 1\n", "\n", " boards = boards.copy()\n", " for game in range(boards.shape[0]):\n", " _do_move(boards[game], moves[game])\n", " return boards\n", "\n", "\n", "boards = get_new_games(10)\n", "do_moves(boards, np.array([[2, 3]] * 10))[0]" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "class GamePolicy(ABC):\n", "\n", " IMPOSSIBLE: np.ndarray = np.array([-1, -1], dtype=int)\n", "\n", " @abc.abstractproperty\n", " def policy_name(self) -> str:\n", " raise NotImplementedError()\n", "\n", " @abc.abstractmethod\n", " def internal_policy(self, boards: np.ndarray) -> np.ndarray:\n", " raise NotImplementedError()\n", "\n", " def get_policy(self, boards: np.ndarray) -> np.ndarray:\n", " policies = self.internal_policy(boards)\n", " possible_turns = get_possible_turns(boards)\n", " poss_turns_debug = possible_turns[0]\n", " policies[possible_turns == False] = -1.0\n", " max_indices = [\n", " np.unravel_index(policy.argmax(), policy.shape) for policy in policies\n", " ]\n", " policy_vector = np.array(max_indices)\n", " # todo check if no turn is possible and return [-1, -1]\n", " a1 = np.all(policy_vector[:] == 0, 1)\n", " a2 = policies[:, 0, 0] == -1.0\n", " no_turn_possible = np.all(policy_vector == 0, 1) & (policies[:, 0, 0] == -1.0)\n", " if np.any(no_turn_possible):\n", " cases = np.where(no_turn_possible)\n", " print(cases)\n", " print(\"Test\")\n", "\n", " policy_vector[no_turn_possible] = GamePolicy.IMPOSSIBLE\n", " return policy_vector" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "class RandomPolicy(GamePolicy):\n", " @property\n", " def policy_name(self) -> str:\n", " return \"random\"\n", "\n", " def internal_policy(self, boards: np.ndarray) -> np.ndarray:\n", " random_values = np.random.rand(*boards.shape)\n", " return random_values\n", " # return np.argmax(random_values, (1, 2))\n", "\n", "\n", "rndpolicy = RandomPolicy()\n", "assert rndpolicy.policy_name == \"random\"" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, -1, 1, 0, 0, 0],\n", " [ 0, 0, 0, 1, 1, 0, 0, 0],\n", " [ 0, 0, 0, 0, 1, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def single_turn(current_boards: np, policy: GamePolicy) -> np.ndarray:\n", " policy_results = policy.get_policy(current_boards)\n", " poss = moves_possible(current_boards, policy_results)\n", " if not np.all(poss):\n", " false_values = np.where(poss == False)\n", " bad_boards = current_boards[false_values]\n", " bad_policy = policy_results[false_values]\n", " print(\"test\")\n", "\n", " try:\n", " assert np.all(moves_possible(current_boards, policy_results)), (\n", " current_boards[(moves_possible(current_boards, policy_results) == False)],\n", " policy_results[(moves_possible(current_boards, policy_results) == False)],\n", " np.where(moves_possible(current_boards, policy_results) == False),\n", " )\n", " except AssertionError as err:\n", " raise err\n", "\n", " return do_moves(current_boards, policy_results)\n", "\n", "\n", "single_turn(get_new_games(10), RandomPolicy())[0]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array([1], dtype=int64),)\n", "Test\n", "(array([1], dtype=int64),)\n", "Test\n", "(array([0, 4, 5, 7, 8], dtype=int64),)\n", "Test\n" ] }, { "data": { "text/plain": [ "array([[[[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " ...,\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]]],\n", "\n", "\n", " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 1., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " ...,\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 1., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]]],\n", "\n", "\n", " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., -1., 0., 0.],\n", " [ 0., 0., 0., ..., -1., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., -1., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " ...,\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., -1., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 1., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]]],\n", "\n", "\n", " ...,\n", "\n", "\n", " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " ...,\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]]],\n", "\n", "\n", " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " ...,\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]]],\n", "\n", "\n", " [[[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " ...,\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]],\n", "\n", " [[ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " ...,\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.],\n", " [ 0., 0., 0., ..., 0., 0., 0.]]]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def simulate_game(\n", " nr_of_games: int,\n", " policies: tuple[GamePolicy, GamePolicy],\n", ") -> np.ndarray:\n", " history_stack = np.zeros((70, nr_of_games, 8, 8))\n", " current_boards = get_new_games(nr_of_games)\n", " index_counter = 0\n", " for i in range(60):\n", " policy_index = i % 2\n", " policy = policies[policy_index]\n", " if policy_index == 0:\n", " current_boards = current_boards * -1\n", " try:\n", " current_boards = single_turn(current_boards, policy)\n", " except RuntimeError as err:\n", " print(\"Err\")\n", " print(history_stack)\n", " raise err\n", " if policy_index == 0:\n", " current_boards = current_boards * -1\n", "\n", " history_stack[index_counter] = current_boards\n", " index_counter += 1\n", " return history_stack\n", "\n", "\n", "simulate_game(10, (RandomPolicy(), RandomPolicy()))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([[[ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, -1, 0, -1, 0, 0],\n", " [ 0, 0, 1, 1, 1, 1, 0, 0],\n", " [ 0, 0, 0, -1, 1, 0, 0, 0],\n", " [ 0, 0, -1, -1, -1, 0, 0, 0],\n", " [ 0, 0, 1, -1, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0]],\n", "\n", " [[ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, -1, -1, -1, 0],\n", " [ 0, 0, 1, 0, -1, 0, 0, 0],\n", " [ 0, 0, 0, 1, -1, 0, 0, 0],\n", " [ 0, 0, 0, -1, 1, -1, -1, 0],\n", " [ 0, 0, -1, 0, 0, 1, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0]]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.array(\n", " [\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, -1, 0, -1, 0, 0],\n", " [0, 0, 1, 1, 1, 1, 0, 0],\n", " [0, 0, 0, -1, 1, 0, 0, 0],\n", " [0, 0, -1, -1, -1, 0, 0, 0],\n", " [0, 0, 1, -1, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, -1, -1, -1, 0],\n", " [0, 0, 1, 0, -1, 0, 0, 0],\n", " [0, 0, 0, 1, -1, 0, 0, 0],\n", " [0, 0, 0, -1, 1, -1, -1, 0],\n", " [0, 0, -1, 0, 0, 1, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " ]\n", ")\n", "arr" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([[[False, False, True, True, True, True, True, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, True, False, False, False, False, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, True, False, False, True, True, False, False],\n", " [False, False, False, True, False, False, False, False],\n", " [False, False, False, False, False, False, False, False]],\n", "\n", " [[False, False, False, False, True, False, True, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, False, False, False, True, False, True],\n", " [False, False, True, False, False, False, False, True],\n", " [False, False, False, True, False, False, False, False],\n", " [False, False, False, False, False, False, False, False],\n", " [False, False, False, False, False, False, False, False]]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "get_possible_turns(arr)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([ True, True])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "moves_possible(arr, RandomPolicy().get_policy(arr))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([[0, 4],\n", " [4, 7]], dtype=int64)" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "RandomPolicy().get_policy(arr)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "\n", "def create_test_game():\n", " test_array = [\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 2, 0, 0, 0],\n", " [0, 0, 0, 2, 1, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 2, 0, 0, 0],\n", " [0, 0, 0, 2, 1, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 2, 0, 0, 0],\n", " [0, 0, 1, 1, 1, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 2, 0, 0, 0],\n", " [0, 0, 2, 1, 1, 0, 0, 0],\n", " [0, 2, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 2, 0, 0, 0],\n", " [0, 0, 2, 1, 1, 0, 0, 0],\n", " [0, 2, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 2, 0, 0, 0],\n", " [0, 0, 2, 1, 1, 0, 0, 0],\n", " [0, 2, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 2, 0, 0, 0],\n", " [0, 0, 2, 2, 2, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 0, 0, 0],\n", " [0, 0, 0, 1, 1, 1, 0, 0],\n", " [0, 0, 2, 2, 2, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 2, 2, 0, 0],\n", " [0, 0, 2, 2, 2, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 2, 2, 0, 0],\n", " [0, 0, 2, 2, 1, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 1, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 2, 2, 0, 0],\n", " [0, 0, 2, 2, 1, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 2, 2, 0, 0],\n", " [0, 1, 1, 1, 1, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 2, 2, 0, 0],\n", " [2, 2, 2, 2, 2, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 1, 1, 1, 0],\n", " [2, 2, 2, 2, 2, 2, 0, 0],\n", " [0, 2, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 1, 1, 1, 1, 0],\n", " [2, 2, 2, 1, 2, 2, 0, 0],\n", " [0, 2, 0, 1, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 0, 0, 0],\n", " [0, 0, 0, 2, 2, 2, 0, 0],\n", " [0, 0, 0, 2, 2, 1, 1, 0],\n", " [2, 2, 2, 1, 2, 2, 0, 0],\n", " [0, 2, 0, 1, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 1, 0, 0],\n", " [0, 0, 0, 2, 2, 1, 0, 0],\n", " [0, 0, 0, 2, 2, 1, 1, 0],\n", " [2, 2, 2, 1, 2, 2, 0, 0],\n", " [0, 2, 0, 1, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 1, 0, 0],\n", " [0, 0, 0, 2, 2, 2, 2, 0],\n", " [0, 0, 0, 2, 2, 2, 1, 0],\n", " [2, 2, 2, 1, 2, 2, 0, 0],\n", " [0, 2, 0, 1, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 1, 0, 0],\n", " [0, 0, 0, 2, 1, 2, 2, 0],\n", " [0, 0, 0, 2, 2, 1, 1, 0],\n", " [2, 2, 2, 1, 1, 1, 1, 0],\n", " [0, 2, 0, 1, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 1, 0, 0],\n", " [0, 0, 0, 2, 1, 2, 2, 0],\n", " [0, 0, 0, 2, 2, 1, 2, 0],\n", " [2, 2, 2, 2, 2, 2, 2, 2],\n", " [0, 2, 0, 1, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " [0, 0, 2, 1, 0, 1, 0, 0],\n", " [0, 0, 0, 2, 1, 2, 2, 0],\n", " [0, 0, 0, 2, 1, 1, 2, 0],\n", " [2, 2, 2, 2, 1, 2, 2, 2],\n", " [0, 2, 0, 1, 1, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " [\n", " [0, 0, 0, 0, 2, 0, 0, 0],\n", " [0, 0, 2, 2, 0, 2, 0, 0],\n", " [0, 0, 0, 2, 1, 2, 2, 0],\n", " [0, 0, 0, 2, 1, 1, 2, 0],\n", " [2, 2, 2, 2, 1, 2, 2, 2],\n", " [0, 2, 0, 1, 1, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 2, 0, 0],\n", " [0, 0, 0, 0, 0, 0, 0, 0],\n", " ],\n", " ]\n", " test_array = np.array(test_array)\n", "\n", " # swapp 2 by one. 2 was only there for homogenous formating and easier readability while coading.\n", " test_array[test_array == 2] = -1\n", " assert np.all(\n", " np.count_nonzero(test_array, axis=(1, 2))\n", " == np.arange(4, 4 + test_array.shape[0])\n", " )\n", "\n", " # validated that only one stone is added per turn\n", " zero_array = test_array == 0\n", " diff = zero_array != np.roll(zero_array, 1, axis=0)\n", " turns = np.where(diff[1:])\n", " arr = np.array(turns)[0]\n", " assert len(arr) == len(set(arr))\n", "\n", " return test_array" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "plot_othello_boards(create_test_game()[-3:])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "array = create_test_game()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.8" } }, "nbformat": 4, "nbformat_minor": 4 }