{"id":2167,"date":"2020-06-29T00:38:56","date_gmt":"2020-06-29T05:38:56","guid":{"rendered":"https:\/\/naps.com.mx\/blog\/?p=2167"},"modified":"2020-07-01T17:12:08","modified_gmt":"2020-07-01T22:12:08","slug":"tic-tac-toe-en-python-usar-funciones","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/tic-tac-toe-en-python-usar-funciones\/","title":{"rendered":"Tic tac toe en Python: Aprende a usar funciones en Python."},"content":{"rendered":"<p>Haremos el juego Tic Tac Toe en Python, para ejemplificar el uso de funciones en Python.<\/p>\n<p><!--more--><\/p>\n<p>\u00c9ste art\u00edculo est\u00e1 disponible en video. M\u00edralo aqu\u00ed:\u00a0<a href=\"https:\/\/youtu.be\/w0LqU99RRy8\" target=\"_blank\" rel=\"noopener\">https:\/\/youtu.be\/w0LqU99RRy8<\/a><\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Tic-tac-toe-en-Python.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2173\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Tic-tac-toe-en-Python.png\" alt=\"Tic tac toe en Python\" width=\"1000\" height=\"625\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Tic-tac-toe-en-Python.png 1000w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Tic-tac-toe-en-Python-300x188.png 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/06\/Tic-tac-toe-en-Python-768x480.png 768w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<h2>Importar librer\u00edas y declarar variables<\/h2>\n<p>Vamos a utilizar la librer\u00eda <em>deque<\/em> que nos permite crear y utilizar una cola en Python (<a href=\"https:\/\/books.google.com.mx\/books?id=JnR9hQA3SncC&amp;lpg=PA173&amp;dq=deque%20python&amp;pg=PA173#v=onepage&amp;q=deque%20python&amp;f=false\" target=\"_blank\" rel=\"noopener\">Martelli, 2006<\/a>). Una cola es una <a href=\"https:\/\/naps.com.mx\/blog\/listas-en-python\/\">lista<\/a> de datos a la que le podemos aplicar el m\u00e9todo <em>rotate<\/em>, para rotar los elementos a la izquierda o a la derecha. \u00c9sto nos servir\u00e1 para cambiar (rotar) el turno del jugador.<\/p>\n<p>Tambi\u00e9n crearemos el tablero, que ser\u00e1 una <a href=\"https:\/\/naps.com.mx\/blog\/multilistas-en-python-listas-de-listas\/\">multilista<\/a> o lista de listas.<\/p>\n<pre class=\"lang:python decode:true \">from collections import deque\r\n\r\nturno = deque([\"0\", \"X\"])\r\ntablero = [\r\n\t[\" \", \" \", \" \"],\r\n\t[\" \", \" \", \" \"],\r\n\t[\" \", \" \", \" \"],\r\n]<\/pre>\n<h2>Funciones del juego Tic tac toe en Python<\/h2>\n<h2>Funciones para el tablero y para rotar el turno<\/h2>\n<p>Crearemos una funci\u00f3n para mostrar el tablero. \u00c9sta imprimir\u00e1 (utilizando un <a href=\"https:\/\/naps.com.mx\/blog\/uso-de-for-en-python-usando-listas\/\">for<\/a>) la multilista que contiene el tablero.<\/p>\n<p>Otra funci\u00f3n ser\u00e1 la de actualizar el tablero. \u00c9sta funci\u00f3n agregar\u00e1 una X o un O a un espacio dentro de la multilista.<\/p>\n<p>La funci\u00f3n rotar turno utiliza el m\u00e9todo <em>rotate<\/em> para rotar los valores de X y O y devuelve el que queda en la posici\u00f3n [0].<\/p>\n<pre class=\"lang:python decode:true\">def mostrar_tablero():\r\n\tprint(\"\")\r\n\tfor fila in tablero:\t\t\r\n\t\tprint (fila)\r\n\r\ndef actualizar_tablero(posicion, jugador):\r\n\ttablero[posicion[0]][posicion[1]] = jugador\r\n\r\ndef rotar_turno():\r\n\tturno.rotate()\r\n\treturn turno[0]<\/pre>\n<h2>Funciones para procesar y verificar la posici\u00f3n<\/h2>\n<p>Tenemos una funci\u00f3n para procesar la posici\u00f3n, \u00e9sta convierte una cadena dada como \u00ab1,1\u00bb en una lista que contendr\u00e1 los valores [0,0]. \u00c9sto es necesario porque la multilista empieza en 0 y no en 1 (como lo ve el usuario).<\/p>\n<p>La funci\u00f3n posicion_correcta determina si la posici\u00f3n dada contiene un valor correcto. Por ejemplo, la posici\u00f3n dada \u00ab4,4\u00bb no ser\u00eda correcta, pues no existe la l\u00ednea 4 en el juego.<\/p>\n<pre class=\"lang:python decode:true \">def procesar_posicion(posicion):\r\n\tfila, columna = posicion.split(\",\")\r\n\treturn [int(fila)-1, int(columna)-1]\r\n\r\ndef posicion_correcta(posicion):\r\n\tif 0 &lt;= posicion[0] &lt;= 2 and 0 &lt;= posicion[1] &lt;= 2:\r\n\t\tif tablero[posicion[0]][posicion[1]] == \" \":\r\n\t\t\treturn True\r\n\treturn False<\/pre>\n<h2>Funci\u00f3n para verificar si se ha ganado el juego Tic Tac Toe en Python<\/h2>\n<p>La siguiente funci\u00f3n recibe como valor de par\u00e1metro el jugador (\u00abX\u00bb o \u00abO\u00bb) y revisa la multilista analizando todo el tablero.<\/p>\n<p>Primero compara las filas, luego las columnas y por \u00faltimo las diagonales. No compara si existe empate entre los jugadores (se deja como ejercicio al lector).<\/p>\n<pre class=\"lang:python decode:true \">def ha_ganado(j):\r\n\t#compara las filas del tablero\r\n\tif tablero[0] == [j,j,j] or tablero[1] == [j,j,j] or tablero[2] == [j,j,j]:\r\n\t\treturn True\r\n\t#compara las columnas\r\n\telif tablero[0][0] == j and tablero[1][0] == j and tablero[2][0] == j:\r\n\t\treturn True\r\n\telif tablero[0][1] == j and tablero[1][1] == j and tablero[2][1] == j:\r\n\t\treturn True\r\n\telif tablero[0][2] == j and tablero[1][2] == j and tablero[2][2] == j:\r\n\t\treturn True\r\n\t#compara las diagonales\r\n\telif tablero[0][0] == j and tablero[1][1] == j and tablero[2][2] == j:\r\n\t\treturn True\r\n\telif tablero[0][2] == j and tablero[1][1] == j and tablero[2][0] == j:\r\n\t\treturn True\r\n\treturn False<\/pre>\n<h2>Funci\u00f3n principal del juego Tic Tac Toe en Python<\/h2>\n<p>La funci\u00f3n principal, a la que llamamos juego, utiliza un ciclo <em>While<\/em> infinito para preguntar al usuario la posici\u00f3n (fila, columna) en el tablero en la que desea dejar la marca del jugador en turno. El ciclo finaliza con <em>break<\/em> cuando recibe la cadena &#8216;salir&#8217; o cuando un jugador gana el partido. Se emplea un bloque <em>try<\/em> <em>except<\/em> para convertir la cadena dada (por ejemplo, &#8216;1,1&#8217;) en una lista. Si se introduce un valor diferente, (como abcxyz) al no poder convertirlo a dos elementos de lista separ\u00e1ndolos por comas, se generar\u00e1 un error que ser\u00e1 atrapado en el bloque <em>except<\/em>. Se invoca la funci\u00f3n principal juego() misma que llama a todas las dem\u00e1s.<\/p>\n<pre class=\"lang:python decode:true \">def juego():\r\n\tmostrar_tablero()\r\n\tjugador = rotar_turno()\r\n\twhile True:\r\n\t\tposicion = input(\"Juega {}, elige una posicion (fila, columna) de 1 a 3. 'salir' para salir\".format(jugador))\r\n\t\tif posicion == 'salir':\r\n\t\t\tprint (\"Adios!!!\")\r\n\t\t\tbreak\r\n\t\ttry:\r\n\t\t\tposicion_l = procesar_posicion (posicion)\t\t\t\r\n\t\texcept:\r\n\t\t\tprint (\"Error, posicion {} no es v\u00e1lida. \".format(posicion))\r\n\t\t\tcontinue\r\n\t\tif posicion_correcta(posicion_l):\r\n\t\t\tactualizar_tablero(posicion_l, jugador)\r\n\t\t\tmostrar_tablero()\r\n\t\t\tif ha_ganado(jugador):\r\n\t\t\t\tprint (\"Jugador de {} ha ganado!!!\".format(jugador))\r\n\t\t\t\tbreak\r\n\t\t\tjugador = rotar_turno()\r\n\t\telse:\r\n\t\t\tprint (\"Posicion {} no v\u00e1lida\".format(posicion))\r\n\t\r\njuego()<\/pre>\n<p>\u00c9ste art\u00edculo est\u00e1 disponible en video. Cons\u00faltalo aqu\u00ed:<\/p>\n<p><iframe loading=\"lazy\" width=\"806\" height=\"453\" src=\"https:\/\/www.youtube.com\/embed\/w0LqU99RRy8\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Haremos el juego Tic Tac Toe en Python, para ejemplificar el uso de funciones en Python.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[301,188],"tags":[287,299,300],"class_list":["post-2167","post","type-post","status-publish","format-standard","hentry","category-curso-python-analisis-datos","category-programacion-basica","tag-curso-python","tag-funciones-en-python","tag-tic-tac-toe"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=2167"}],"version-history":[{"count":7,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2167\/revisions"}],"predecessor-version":[{"id":2188,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2167\/revisions\/2188"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=2167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=2167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=2167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}