Skip to content

Instantly share code, notes, and snippets.

@jmcalvomartin
Last active April 22, 2021 08:29
Show Gist options
  • Save jmcalvomartin/1564442ef6ca56e7c89ca0b96c410905 to your computer and use it in GitHub Desktop.
Save jmcalvomartin/1564442ef6ca56e7c89ca0b96c410905 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "7TMpT_lofSv4"
},
"source": [
"# ChessAI\n",
"\n",
"<img src=\"https://wwwassets.rand.org/content/rand/blog/2020/01/what-chess-can-teach-us-about-the-future-of-ai-and/jcr:content/par/blogpost.aspectcrop.868x455.rt.jpg/1578091999483.jpg\" width=50%>\n",
"\n",
"**Objetivo**<br>\n",
"Crear un programa en Python donde **una máquina jugará contra si misma**. La escalabilidad de la nota se basará en mejorar la **aleatoriedad** de la cual se parte con la lista de movimientos permitidos en el escenario inicial.\n",
"\n",
"\n",
"\n",
"Se pide realizar el programa partiendo de las partidas aleatorias, recogiendo al ganador y número de movimientos.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EwOB_dnbHYbH"
},
"source": [
"# Empezamos a programar a nuestro jugador, el **Agente**\n",
"\n",
"Necesitamos instalar la libreria **chess** ya que Google Colab no la tiene en su Core"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 5466,
"status": "ok",
"timestamp": 1618850605609,
"user": {
"displayName": "Jorge Calvo",
"photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gg8pdoMjjPpCHRH5uQUOj7SnCMquo8M-N2AfXgB-Q=s64",
"userId": "10226705508239215505"
},
"user_tz": -120
},
"id": "QBuhOuFmpfXR",
"outputId": "21c520cc-57b2-4e38-8d92-bc676700fdca"
},
"outputs": [],
"source": [
"#!pip install chess\n",
"\n",
"import chess\n",
"import chess.svg\n",
"import random\n",
"import matplotlib.pyplot as plt\n",
"import time\n",
"from IPython.display import display, clear_output, HTML, SVG"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fOBZ5hXF1bw0"
},
"source": [
"### Usaremos la biblioteca de ajedrez de la siguiente manera:\n",
"\n",
"1. Cree una instancia de chess.Board\n",
"1. La instancia de chess.Board genera automáticamente todos los movimientos posibles para el jugador actual\n",
"1. El jugador actual elige un movimiento\n",
"1. Vaya al paso 2 y repita hasta ganar, perder o empatar.\n",
"\n",
"Hemos reducido el hecho de jugar una partida de ajedrez válida a simplemente seleccionar un movimiento en cada turno. Para jugar una buena partida de ajedrez, querrás elegir \"la mejor jugada\" en cada turno.\n",
"\n",
"Un jugador será una función que toma una instancia del tablero como argumento y devuelve un movimiento codificado como una cadena en el formato de la Interfaz Universal de Ajedrez (uci)\n",
"\n",
"```python\n",
"def player(board):\n",
" ### ¿Que puede ocurrir aqui dentro?\n",
" return move_code\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"id": "MURZRYPLpnwe"
},
"outputs": [],
"source": [
"def random_player(black_board):\n",
" move = random.choice(list(black_board.legal_moves))\n",
" return move.uci()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rU25_DZgNrIX"
},
"source": [
"## Función para mostar el tablero\n",
"Esta función nos muestra el estado del tablero en un momento puntual de la programación durante un tiempo determinado"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"id": "Vzn6Qf2el6pZ"
},
"outputs": [],
"source": [
"def tablero(view_board,espera):\n",
" display(view_board)\n",
" #SVG(chess.svg.board(board=view_board,size=400)) \n",
" clear_output(wait=True)\n",
" time.sleep(espera)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Cz1Xfpgsft01"
},
"source": [
"## Función para puntuar las piezas\n",
"Generamos una función donde pasamos el tablero de juego y el movimiento a realizar. Esta función nos devuleve una puntuación en función a la pieza"
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"id": "KXNvdkabf0cS"
},
"outputs": [],
"source": [
"def puntuar(board,move):\n",
" \n",
" target=str(move)[2:]\n",
" \n",
" try: #Controlamos cuando corona al final del tablero\n",
" pos=str(board.piece_at(chess.parse_square(target)))\n",
" except Exception:\n",
" return 0\n",
"\n",
" if pos == \"Q\" or \"q\":\n",
" return 9\n",
" if pos == \"K\" or \"k\":\n",
" return 20\n",
" if pos == \"R\" or \"r\":\n",
" return 5\n",
" if pos == \"B\" or \"b\":\n",
" return 4\n",
" if pos == \"N\" or \"n\":\n",
" return 3\n",
" if pos == \"P\" or \"p\":\n",
" return 1"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-rnHFebg1vjv"
},
"source": [
"## Función para evaluar a nuestro agente "
]
},
{
"cell_type": "code",
"execution_count": 95,
"metadata": {
"id": "6DkrOFNcJrq7"
},
"outputs": [],
"source": [
"def play(games):\n",
" \n",
" results=[]\n",
" win=0\n",
" loss=0\n",
"\n",
" for g in range(games):\n",
" board = chess.Board() # Reinicio la partida\n",
" favoritos={} # Inicializo un diccionario para guardar los movimiento favoritos\n",
"\n",
" while board.is_game_over() is False: # Que la máquina juegue hasta que se llegue al final del juego (Mientras game_over sea Falso)\n",
" \n",
" for x in list(board.legal_moves): #Recorro la lista de movimientos legales y guardo cada movimiento en x\n",
" score=0 #inicializamos la puntuación\n",
" \n",
" if (board.gives_check(x)==True) & (board.turn is True): # Si el movimiento X provocaría un jaque y solo me fijo en el movimiento de las Blancas\n",
" score+=8+puntuar(board,x) # Si el IF se cumple guardo ese movimiento en mi diccionario junto con la puntuación 4 + la puntuación de la pieza\n",
" \n",
" if (board.is_capture(x)==True) & (board.turn is True):\n",
" score+=6+puntuar(board,x) # Si el IF se cumple guardo ese movimiento en mi diccionario junto con la puntuación 3 + la puntuación de la pieza\n",
"\n",
" if (board.is_zeroing(x)==True) & (board.turn is True):\n",
" score+=2+puntuar(board,x)\n",
" \n",
" if (board.has_insufficient_material(chess.BLACK)==True) & (board.turn is True):\n",
" score+=4+puntuar(board,x)\n",
" \n",
"\n",
" #print(f\"La puntuación del {x.uci()} es {score}\")\n",
" if score !=0 : favoritos[x]=score # Si no obtengo ninguna puntuación NO lo guardo en favoritos\n",
" \n",
"\n",
" if (len(favoritos)>0) & (board.turn is True): # Tenemos que comprobar que se ha guardado algún movimiento en favoritos. Si no hay ninguno en Favoritos salta al ELSE y hace uno aleatorio\n",
" ordenado=sorted(favoritos.items(), key=lambda item: item[1],reverse=True) # Ordeno mi diccionario para colocar el primero con la puntuación más alta\n",
" #print(ordenado) # print para que me muestre la lita ordenada OPCIONAL\n",
" move=ordenado[0][0] # Del diccionario elijo el primer valor y de ese primer valor el primer par por eso el doble [0], es decir de (\"b2b3\": 2) me quedo con b2b3\n",
" #print(\"Movimiento Elegido: \" + move.uci() + \" La puntuación es: \" + str(ordenado[0][1])) # Imprimo el movimiento y puntuación para ver cual es \n",
" board.push_uci(move.uci()) # Ejecuto el movimiento elegido\n",
" #print(f\"Movimentos elegido: {move.uci()}\") \n",
" favoritos={} # Borro el diccionario de favoritos para el siguiente turno\n",
" \n",
" else:\n",
" #print(f\"Movimiento aleatorio\")\n",
" board.push_uci(random_player(board)) # Movimiento aleatorio que se realiza en el caso de que la lista de favoritos esté vacia.\n",
" \n",
" #tablero(board,2) # dibujo el tablero al finalizar cada jugada\n",
" \n",
" #print(\"El resultado es \" + board.result()) # 1-0 Ganan blancas, 1/2-1/2 Empate y 0-1 Ganan Negras\n",
" \n",
" results.append(board.result()) #Guardo los resultados obtenidos\n",
" \n",
" #Sumo los ganados y los perdidos\n",
" if board.result()== \"1-0\":\n",
" win +=1\n",
" display(HTML('<h2>Partida Ganada')) \n",
" if board.result()== \"0-1\":\n",
" loss +=1\n",
" display(HTML('<h2>Partida Perdida'))\n",
" if board.result()== \"1/2-1/2\":\n",
" display(HTML('<h2>Partida Empatada'))\n",
" \n",
" print(f\"Partida {g} de 100\")\n",
" print(f\"Número de movimientos totales: {len(board.move_stack)}\")\n",
" tablero(board,0.1)\n",
" \n",
"\n",
" display(HTML('<h1>Resultados</h1>'))\n",
" print(f\"Partidas ganadas: {win}\")\n",
" print(f\"Partidas perdidas: {loss}\")\n",
" print(f\"Partidas empatadas: {games-win-loss}\") \n",
" print(f\"Partidas jugadas: {games}\")\n",
"\n",
" plt.hist(results, label=\"Resultados\", color=\"b\")\n",
" plt.legend()\n",
" plt.title(\"Resultados\")\n",
" plt.xlabel(\"Resultados\")\n",
" plt.ylabel(\"Juegos\")\n",
" plt.show()\n",
"\n",
" plt.plot(results)\n",
" plt.xlabel(\"Juegos\")\n",
" plt.ylabel(\"Resultados\")\n",
" plt.title(\"Resultados\")\n",
" plt.show()\n",
" return print(f\"Probabilidad del agente: {win/games*100} %\") \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 97,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 664
},
"executionInfo": {
"elapsed": 16528,
"status": "ok",
"timestamp": 1618851692271,
"user": {
"displayName": "Jorge Calvo",
"photoUrl": "https://lh3.googleusercontent.com/a-/AOh14Gg8pdoMjjPpCHRH5uQUOj7SnCMquo8M-N2AfXgB-Q=s64",
"userId": "10226705508239215505"
},
"user_tz": -120
},
"id": "iRF3Pz_9DZS0",
"outputId": "03b0e1c9-ed9d-4e4f-98fd-bc4bd8b02958"
},
"outputs": [
{
"data": {
"text/html": [
"<h1>Resultados</h1>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Partidas ganadas: 27\n",
"Partidas perdidas: 1\n",
"Partidas empatadas: 72\n",
"Partidas jugadas: 100\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Probabilidad del agente: 27.0 %\n"
]
}
],
"source": [
"play(100)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"authorship_tag": "ABX9TyN4ABC1c/sSFsbKvHe8ggx6",
"collapsed_sections": [],
"name": "Evaluation_ChessAgent.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"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.7.7"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment