miércoles, 22 de abril de 2009

Barajando los dados


Hay que empezar por el principio.

Antes de entrar en las gráficas y mecanismos del juego como el conteo del tiempo y la revisión de palabras, hay que crear los dados. Para esto, vamos a guardarlos en una lista de Python. Una lista es simplemente eso, un lugar que guarda un elemento tras otro. Cada uno de los 16 dados es una lista de sus seis lados, por ejemplo:
["T", "O", "E", "S", "S", "I"]




(Explicaré el código por partes y al final está el código completo)

Podemos tener una sola variable que contenga todos los dados. Esta sería una lista que contiene 16 listas así:

dice = [ ["T", "O", "E", "S", "S", "I"],
["A", "S", "P", "F", "F", "K"],
["N", "U", "I", "H", "M", "Qu"],
["O", "B", "J", "O", "A", "B"],
["L", "N", "H", "N", "R", "Z"],
["A", "H", "S", "P", "C", "O"],
["R", "Y", "V", "D", "E", "L"],
["I", "O", "T", "M", "U", "C"],
["L", "R", "E", "I", "X", "D"],
["T", "E", "R", "W", "H", "V"],
["T", "S", "T", "I", "Y", "D"],
["W", "N", "G", "E", "E", "H"],
["E", "R", "T", "T", "Y", "L"],
["O", "W", "T", "O", "A", "T"],
["A", "E", "A", "N", "E", "G"],
["E", "I", "U", "N", "E", "S"] ]



Ahora que ya tenemos dados, necesitamos una cuadrícula para poner los dados. Para esto también podemos crear listas.
Lo que haré es tener dos cuadrículas de 4 por 4. Una contendrá el número del dado que está en esa posición y la otra contiene el número del lado del dado que está visible:
face = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]
facedie = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]

Ahora crearé una función para colocar los dados en una posición. Como no se puede repetir un dado, creo una lista llamada "available_dice", en la que guardo los números de 0 a 15, para cuando salga un dado quitarlo de la lista. Luego para cada posición (row, column) de la lista "facedie", selecciono al azar que dado queda en esa casilla así:
def new_dice_set():
available_dice = range(16)
for row in range(4):
for column in range(4):
facedie[row][column] = random.randint(0,len(available_dice) - 1)
available_dice.pop(facedie[row][column])

Luego hago algo similar con los lados. Para cada casilla, "lanzo" el dado, para que quede uno de sus lados al azar. En la lista "face" guardo el lado visible en cada una de las casillas:
def new_shuffled_group():
for row in range(4):
for column in range(4):
face[row][column] = random.randint(0,5)

Listo, con esto tenemos la cajita y los dados. ¡Pero aún no los vemos!
Para terminar por ahora haré una sencilla función que muestre los dados en la pantalla, y llamaré las funciones anteriores:
def print_face():
for row in range(4):
for column in range(4):
print dice[facedie[row][column]][face[row][column]], " ",
print ""

new_shuffled_group()
new_dice_set()
print_face()

Ya debes poder ver algo como:
T   B   P   K
X Y E O
M U K N
P I E E

Nos vemos en la próxima. Aquí está el código completo:
import random

dice = [ ["T", "O", "E", "S", "S", "I"],
["A", "S", "P", "F", "F", "K"],
["N", "U", "I", "H", "M", "Qu"],
["O", "B", "J", "O", "A", "B"],
["L", "N", "H", "N", "R", "Z"],
["A", "H", "S", "P", "C", "O"],
["R", "Y", "V", "D", "E", "L"],
["I", "O", "T", "M", "U", "C"],
["L", "R", "E", "I", "X", "D"],
["T", "E", "R", "W", "H", "V"],
["T", "S", "T", "I", "Y", "D"],
["W", "N", "G", "E", "E", "H"],
["E", "R", "T", "T", "Y", "L"],
["O", "W", "T", "O", "A", "T"],
["A", "E", "A", "N", "E", "G"],
["E", "I", "U", "N", "E", "S"] ]

face = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]
facedie = [ [0,0,0,0], [0,0,0,0], [0,0,0,0], [0,0,0,0] ]

def new_dice_set():
available_dice = range(16)
for row in range(4):
for column in range(4):
facedie[row][column] = random.randint(0,len(available_dice) - 1)
available_dice.pop(facedie[row][column])

def new_shuffled_group():
for row in range(4):
for column in range(4):
face[row][column] = random.randint(0,5)

def print_face():
for row in range(4):
for column in range(4):
print dice[facedie[row][column]][face[row][column]], " ",
print ""


new_shuffled_group()
new_dice_set()
print_face()


Fuentes
Blog de Matthew James Taylor: De este blog tomé el contenido de los dados.
Créditos Imágenes

3 comentarios:

  1. Estupendo!

    No se porque no te aparecen los espacios en el codigo, yo tambien uso blogspot y la tag pre funciona bien:

    http://blog.tomeuvizoso.net/2009/04/embed-flash-movies-with-gnash-in-your.html

    Me parece que seria estupendo que tu blog apareciese en nuestro planet: http://planet.sugarlabs.org/

    ResponderEliminar
  2. Hola Andrés, no se si es una limitación de blogspot o tal vez falta usar una etiqueta para que al ver el código se vea la indentación. Creo que eso mejoraría un poco la experiencia del copy paste para probar el código en ejecución.

    ResponderEliminar
  3. Gracias por sus comentarios. Por alguna razón al mover el código al editar la entrada se perdió la indentación, y no me había dado cuenta. Ahora estoy exportando con colores desde Kate, espero que mejore el problema...

    ResponderEliminar