Tres en raya en Python

Invent Your Own Computer Games with Python es un libro gratuito y libre que te enseña a programar juegos de ordenador en Python. Cada ciertos capítulos te muestra el código completo de un nuevo juego y luego te explica los conceptos de programación de dicho código.

Uno de los juegos más sencillos y más interesantes para aprender es el Tres en Raya, aquí os paso el código completo para ejecutarlo en Python 3 en adelante.

# Tic Tac Toe import random def drawBoard(board): # This function prints out the board that it was passed. # "board" is a list of 10 strings representing the board (ignore index 0) print(' | |') print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9]) print(' | |') print('-----------') print(' | |') print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6]) print(' | |') print('-----------') print(' | |') print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3]) print(' | |') def inputPlayerLetter(): # Let's the player type which letter they want to be. # Returns a list with the player's letter as the first item, and the # computer's letter as the second. letter = '' while not (letter == 'X' or letter == 'O'): print('Do you want to be X or O?') letter = input().upper() # the first element in the tuple is the player's letter, the second is # the computer's letter. if letter == 'X': return ['X', 'O'] else: return ['O', 'X'] def whoGoesFirst(): # Randomly choose the player who goes first. if random.randint(0, 1) == 0: return 'computer' else: return 'player' def playAgain(): # This function returns True if the player wants to play again, otherwise # it returns False. print('Do you want to play again? (yes or no)') return input().lower().startswith('y') def makeMove(board, letter, move): board[move] = letter def isWinner(bo, le): # Given a board and a player's letter, this function returns True if that # player has won. We use bo instead of board and le instead of letter so # we don't have to type as much. return ((bo[7] == le and bo[8] == le and bo[9] == le) or # across the top (bo[4] == le and bo[5] == le and bo[6] == le) or # across the middle (bo[1] == le and bo[2] == le and bo[3] == le) or # across the bottom (bo[7] == le and bo[4] == le and bo[1] == le) or # down the left side (bo[8] == le and bo[5] == le and bo[2] == le) or # down the middle (bo[9] == le and bo[6] == le and bo[3] == le) or # down the right side (bo[7] == le and bo[5] == le and bo[3] == le) or # diagonal (bo[9] == le and bo[5] == le and bo[1] == le)) # diagonal def getBoardCopy(board): # Make a duplicate of the board list and return it the duplicate. dupeBoard = [] for i in board: dupeBoard.append(i) return dupeBoard def isSpaceFree(board, move): # Return true if the passed move is free on the passed board. return board[move] == ' ' def getPlayerMove(board): # Let the player type in his move. move = ' ' while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)): print('What is your next move? (1-9)') move = input() return int(move) def chooseRandomMoveFromList(board, movesList): # Returns a valid move from the passed list on the passed board. # Returns None if there is no valid move. possibleMoves = [] for i in movesList: if isSpaceFree(board, i): possibleMoves.append(i) if len(possibleMoves) != 0: return random.choice(possibleMoves) else: return None def getComputerMove(board, computerLetter): # Given a board and the computer's letter, determine where to move and # return that move. if computerLetter == 'X': playerLetter = 'O' else: playerLetter = 'X' # Here is our algorithm for our Tic Tac Toe AI: # First, check if we can win in the next move for i in range(1, 10): copy = getBoardCopy(board) if isSpaceFree(copy, i): makeMove(copy, computerLetter, i) if isWinner(copy, computerLetter): return i # Check if the player could win on his next move, and block them. for i in range(1, 10): copy = getBoardCopy(board) if isSpaceFree(copy, i): makeMove(copy, playerLetter, i) if isWinner(copy, playerLetter): return i # Try to take one of the corners, if they are free. move = chooseRandomMoveFromList(board, [1, 3, 7, 9]) if move != None: return move # Try to take the center, if it is free. if isSpaceFree(board, 5): return 5 # Move on one of the sides. return chooseRandomMoveFromList(board, [2, 4, 6, 8]) def isBoardFull(board): # Return True if every space on the board has been taken. Otherwise # return False. for i in range(1, 10): if isSpaceFree(board, i): return False return True print('Welcome to Tic Tac Toe!') while True: # Reset the board theBoard = [' '] * 10 playerLetter, computerLetter = inputPlayerLetter() turn = whoGoesFirst() print('The ' + turn + ' will go first.') gameIsPlaying = True while gameIsPlaying: if turn == 'player': # Player's turn. drawBoard(theBoard) move = getPlayerMove(theBoard) makeMove(theBoard, playerLetter, move) if isWinner(theBoard, playerLetter): drawBoard(theBoard) print('Hooray! You have won the game!') gameIsPlaying = False else: if isBoardFull(theBoard): drawBoard(theBoard) print('The game is a tie!') break else: turn = 'computer' else: # Computer's turn. move = getComputerMove(theBoard, computerLetter) makeMove(theBoard, computerLetter, move) if isWinner(theBoard, computerLetter): drawBoard(theBoard) print('The computer has beaten you! You lose.') gameIsPlaying = False else: if isBoardFull(theBoard): drawBoard(theBoard) print('The game is a tie!') break else: turn = 'player' if not playAgain(): break read more

Leer más » 2 Comentarios

Ballmer

Leer más » 2 Comentarios

Lo mejor de mi RSS del 26 de agosto al 1 de septiembre de 2013

Leer más » 1 Comentario

Lo mejor de mi timeline del 24 al 30 de agosto

La cosa va de Androids y Xiaomis 🙂

Leer más » 1 Comentario

Formularios de contacto en WordPress. Instalación, configuración y uso

Los formularios de contacto son algo tan básico en el día a día de cualquier web, que cuanto más fáciles y estándares puedas hacerlo mejor será para ti y para tu cliente si es que estás desarrollando la web para un tercero. Los formularios de contacto, suelen tener dos problemas:

  1. Un spammer puede hacer uso de ellos
  2. Los mensajes enviados pueden quedar en la carpeta Spam

La solución que os proponemos hoy, es fácil de implementar y supera estos dos problemas. Empecemos.

Instalación de plugins

En concreto, debemos utilizar tres plugins:

  • JetPack que nos dará la posibilidad de crear el formulario de contacto fácilmente
  • Akismet que hará la revisión anti spam para evitar que spammers usen el formulario para hacernos llegar spam
  • Configure SMTP para usar un servidor de SMTP y estar seguros de que los mensajes llegarán correctamente a nuestra bandeja de entrada

Configuración SMTP

Una vez instalado el último plugin, nos vamos a Ajustes -> SMTP y ahí configuramos servidor, usuario y contraseña de la cuenta de correo que usaremos para enviar correos. read more

Leer más » 2 Comentarios

Ejemplo de interfaz gráfica sencilla en Python con Tkinter

Está claro que para interfaces de gran envergadura existen soluciones como PyGTK, wxPython o PyQT. Sin embargo, para aplicaciones sencillas puedes utilizar la interfaz Tkinter de la librería estándar de Python.

Aquí te muestro un ejemplo sencillo:

import Tkinter

if __name__ == '__main__':
    root = Tkinter.Tk()
    root.title('Button')
    Tkinter.Label(text='I am a button').pack(pady=15)
    Tkinter.Button( text='Button').pack(side=Tkinter.BOTTOM)
    root.mainloop()

Y éste es el resultado: read more

Leer más » 2 Comentarios

Cuánto tiempo

Leer más » 4 Comentarios

Comprobar el estado de una pila sin un voltímetro

Este es un rápido truco para comprobar el estado de una pila (batería) alcalina, no nos sirve en el caso de baterías del tipo Ión-litio. Es posible que os preguntéis qué tiene que ver esto con Linux o con el mundo del Open Source, pues directamente nada, fue algo que encontré a través de YouTube y, teniendo en cuenta la cantidad de aparatitos que tenemos en casa, he considerado compartirlo aquí en Linux Hispano.

alcalina_linux_hispano

El funcionamiento es simple, dejamos caer una pila sobre una mesa, si rebota y se mantiene en pie está en buen estado y sigue teniendo carga, en caso contrario podremos deshacernos de ella (siempre reciclando) o cargarla en caso de ser recargable. read more

Leer más » 6 Comentarios

Lo mejor de mi RSS del 19 al 25 de agosto de 2013

Ya estoy de vuelta con las pilas cargadas y seguimos como el resto del año con la sección semanal de los mejores enlaces de la blogosfera linuxera en español (y no tan linuxera a veces, pero siempre sobre temas libres).

Leer más » 1 Comentario

Depurar AJAX o funciones del cron en WordPress con un log

Si trabajáis con WordPress, probablemente en más de una ocasión hayáis hecho esto en el wp-config.php para ver los errores que estáis buscando:

define('WP_DEBUG', true);

Sin embargo, hacer esto y solamente esto tiene una serie de problemas y limitaciones:

  • No podemos depurar el AJAX que ejecutamos llamando a admin-ajax, porque el error no se vierte en la pantalla
  • Si tenemos tareas programadas, tampoco veremos si generan errores
  • En un sitio en producción no podremos mostrar por seguridad y por funcionalidad mensajes, por lo que deberemos guardar los errores en un log

Con la solución de guardar los errores en el log, evitamos todos estos problemas y le damos una solución rápida y práctica. read more

Leer más » 1 Comentario