{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "40V8i2-ajn-X"
      },
      "outputs": [],
      "source": [
        "def is_moves_left(board):\n",
        "    for row in board:\n",
        "        for cell in row:\n",
        "            if cell == '':\n",
        "                return True\n",
        "    return False"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "def evaluate(b):\n",
        "    for row in range(6):\n",
        "        for col in range(4):\n",
        "            if b[row][col] == b[row][col+1] == b[row][col+2] == b[row][col+3] == 'o':\n",
        "                return 10\n",
        "        for col in range(7):\n",
        "            for row in range(3):\n",
        "                if b[row][col] == b[row+1][col] == b[row+2][col] == b[row+3][col] == 'o':\n",
        "                    return 10\n",
        "        for row in range(3):\n",
        "            for col in range(4):\n",
        "                if b[row][col] == b[row+1][col+1] == b[row+2][col+2] == b[row+3][col+3] == 'o':\n",
        "                    return 10\n",
        "        for row in range(3, 6):\n",
        "            for col in range(3):\n",
        "                if b[row][col] == b[row - 1][col+1] == b[row-2][col+2] == b[row - 3][col+3] == 'o':\n",
        "                    return 10\n",
        "\n",
        "        return 0"
      ],
      "metadata": {
        "id": "jyEDs1ycj1RB"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def minimax(board, depth, is_max):\n",
        "    score = evaluate(board)\n",
        "\n",
        "    if score == 10:\n",
        "        return score - depth\n",
        "    if not is_moves_left(board):\n",
        "        return 0\n",
        "    if is_max:\n",
        "        best_value = -float('inf')\n",
        "        for col in range(7):\n",
        "            for row in range(5, -1, -1):\n",
        "                if board[row][col] == '':\n",
        "                    board[row][col] = 'x'\n",
        "                    best_val = max(best_val, minimax(\n",
        "                        board, depth+1, not is_max))\n",
        "                    board[row][col] = ''\n",
        "                    break\n",
        "        return best_val\n",
        "    else:\n",
        "        best_value = float('inf')\n",
        "        for col in range(7):\n",
        "            for row in range(5, -1, -1):\n",
        "                if board[row][col] == '':\n",
        "                    board[row][col] = 'o'\n",
        "                    best_val = max(best_val, minimax(\n",
        "                        board, depth+1, not is_max))\n",
        "                    board[row][col] = ''\n",
        "                    break\n",
        "        return best_val"
      ],
      "metadata": {
        "id": "67DDoe1cj2m5"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def find_optimal_move(board):\n",
        "    best_move = None\n",
        "    best_val = -float('inf')\n",
        "\n",
        "    for col in range(7):\n",
        "        for row in range(5, -1, -1):\n",
        "            if board[row][col] == '':\n",
        "                board[row][col] = 'o'\n",
        "                move_val = minimax(board, 0, False)\n",
        "                board[row][col] = ''\n",
        "\n",
        "                if move_val > best_val:\n",
        "                    best_val = move_val\n",
        "                    best_move = (row, col)\n",
        "                break\n",
        "    return best_move"
      ],
      "metadata": {
        "id": "1YeEDoU8j4vg"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "board = [\n",
        "    ['x', 'x', 'o', '', '', '', 'x'],\n",
        "    ['o', 'o', 'o', 'x', '', '', 'x'],\n",
        "    ['x', 'o', '', '', '', '', ''],\n",
        "    ['x', 'o', 'o', '', '', '', ''],\n",
        "    ['x', 'x', 'x', 'o', '', '', ''],\n",
        "    ['o', 'o', 'x', 'o', 'x', '', '']\n",
        "]\n",
        "optimal_move = find_optimal_move(board)\n",
        "if optimal_move:\n",
        "    print(\"The optimal move for player O to win is:\", optimal_move)\n",
        "else:\n",
        "    print(\"Player O cannot win with the current board confguration\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ht7Mpn00j4oe",
        "outputId": "00b955c3-94c3-4c56-bda7-e4eb9b9abef8"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "The optimal move for player O to win is: (2, 2)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "3kvfg9jZj4ew"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}