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

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

Fibonacci recursivo en Python

La recursividad es un concepto importante en programación y es fundamental conocerlo, un ejemplo que se usa mucho es con Fibonacci. Ésta es una implementación para calcular el orden de Fibonacci mediante recursividad en Python:

#!/usr/bin/env python

def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    fibonacci = fib(10)
    print('Fibonacci de orden 10:')
    print(fibonacci)

Si tienes otra propuesta o alternativa será bien agradecida. ¡Participa y comenta! read more

Leer más » 5 Comentarios

Escribir ficheros de datos en Python

En este sencillo ejemplo el programa escribe en un fichero llamado datos.csv el nombre, la edad y la altura de tres personas con su correspondiente identificador. Una vez que se haya creado este archivo de datos en formato csv, éste se puede procesar con hojas de cálculo como LibreOffice Calc.

Aquí tienes el código:

#!/usr/bin/env python

def main():
    f = open('datos.csv','w')
    f.write('ID,Nombre,Edad,Altura (cm)\n')
    f.write('00,Javier,23,177\n')
    f.write('01,Nacho,28,182\n')
    f.write('02,David,34,190') read more

Leer más » 4 Comentarios

Primer programa en Python – Hola mundo

Simplicidad y legibilidad, así es el ‘hola mundo’, un ejemplo de primer programa, en Python:

print('Hola, mundo.')
Leer más » 5 Comentarios

Lo mejor de mi timeline del 7 al 13 de abril

Leer más » 3 Comentarios

Lo mejor de mi timeline del 24 al 30 de marzo

  • @emsLinux El reproductor de música multiplataforma #Banshee acaba de lanzar su versión 2.4
  • @M1ndCr4ck Más de 400 comandos que deberías conocer en GNU/Linux
  • @3NCR1PT4  encripta.org sigue facilitándonos compartir mensajes cifrados
  • @HackFwd HolaLabs lanza HolaIO.
  • @Korso10 Empecé a hojear este libro de Python por curiosidad y llevo un rato ya

Especial atención a Alberto Elías @aeliasnet y Luis Iván Cuende @licuende, la van liar con HolaIO.

Leer más » 1 Comentario

GMapCatcher, un visualizador de mapas offline

GMapCatcher es un visor de mapas en línea, el cual permite cargar los mapas de CloudMade, OpenStreetMap, Yahoo Maps o Google Maps. Nos muestra su contenido por pantalla y nos permite descargarlo para poder usarlo a posteriori, con lo que podremos ver los mapas que deseemos sin conexión a Internet.

GMapCatcher, un visualizador de mapas offline

Básicamente de lo que se trata es de una simple herramienta que nos permite descargar los mapas de los principales proveedores.

Leer más » 10 Comentarios

IronPython, una implementación de Python para Mono/.NET

Debido a que utilizo SharpDevelop, software libre para desarrollo .NET en plataformas Windows, en el trabajo hace tiempo ya descubrí que existía la posibilidad de hacer desarrollos para el intérprete de .NET/Mono en lenguaje Python. Posteriormente, hace no mucho viendo un vídeo de Miguel de Icaza, comprobé que el padre de Gnome también hablaba de esta misma posibilidad.

Pasado el tiempo y como veo que es un tema que puede interesar a muchos os presento a IronPython.

¿Qué es IronPython? read more

Leer más » 4 Comentarios