1412 lines
59 KiB
Plaintext
1412 lines
59 KiB
Plaintext
{
|
|
"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": [
|
|
"<Figure size 300x300 with 1 Axes>"
|
|
]
|
|
},
|
|
"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
|
|
}
|