Informe Torres Hanói

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 4

1

Torres de Hani en Python


Para esto, creamos tres listas, la primera de ellas llamada
Resumen: En el presente informe se desarrolla la construccin de altura destinada a la posicin de los discos en el eje y, la
una interfaz grfica para el juego las torres de Hani utilizando siguiente llamada torre destinada a la posicin de las tres
la librera Pygame y el lenguaje de programacin Python. Este torres del juego y finalmente la lista llamada posi que
programa debe permitir 2 o ms jugadores, adems de guardar la relaciona el nmero de la pieza (del 1 al 7), en que torre se ubica
cantidad de movimientos que haga cada jugador y elaborar un
y a que altura (posicin eje y).
ranking con las posiciones de los jugadores.
Importamos el archivo donde se ubican estas listas y la
I. INTRODUCCIN
llamamos pi. Luego de pedir el nombre del jugador
Las torres de Hanoi son un juego matemtico y trata sobre un dibujamos el tablero con sus respectivos discos.
nmero de discos de radio creciente que se instalan en una de
tres posibles torres del tablero. Este consiste en traspasar los Para dibujar los discos, es decir, darles un largo y ancho, lo que
discos desde una torre inicial a otra final, con la ayuda de una hacemos es definir una funcin llamada dibujar(aaa), que
tercera torre que sirve de paso, es decir, replicar la pila inicial depende del parmetro aaa el cual va de 1 a 10, y segn el
en otra torre, posicionando los discos de mayor a menor valor de este parmetro obtendremos las ubicaciones de los
dimetro. discos en la pantalla, hacemos esto simplemente en vez de
poner las posiciones en coordenadas.
En esta ocasin, se crear el juego y la interfaz grfica de ste
con la ayuda de la librera Pygame y el lenguaje de Luego, definimos otra funcin llamada mover(aaa), la cual a
programacin Python. Adems de programar el juego de las travs de ciclos For tendr la misin de rellenar las listas que
torres de Hani, nos exigen una serie de requerimientos contienen las piezas actuales de cada torre.
adicionales, entre ellos: permitir a un nmero mayor a dos
Finalmente, se crea una ventana donde se pueda jugar, esta
jugadores, establecer la cantidad de movimientos que efectan
ventana corresponder a toda la pantalla del equipo donde se
los jugadores y establecer a un ganador que se regir por haber
juegue, esto se logra utilizando el mdulo Pygame (pygame.
traspasado la torre con la menor cantidad de movimientos.
FULLSCREEN) para controlar la ventana de visualizacin y la
pantalla. Adicional a esto, se agregan otros mdulos para el
II. DESARROLLO Y RESULTADOS control del color de fondo de la ventana y tambin para el color
Como bien se mencion, el objetivo del juego es crear la pila y la fuente del texto que se visualiza en pantalla.
en otra de las torres, sin embargo, para ello existen ciertas reglas
a seguir, las cuales se muestran a continuacin: En la figura 1 se puede apreciar la interfaz del punto de partida
del juego.
- La torre estar formada por diez discos.
- Solo se puede mover un disco a la vez.
- Un disco de mayor tamao no puede descansar sobre
un disco de menor tamao.
- Solo se puede desplazar el disco que se encuentra a
mayor altura.

Para la realizacin de la programacin, lo que se hizo fue dividir


en distintas reas o etapas el proceso, con los cuales
determinamos las caractersticas que presenta el juego,
cumpliendo as con los requerimientos y reglas que se nos
piden.

Etapas del juego.

Comenzamos con la programacin del juego, estableciendo en


primera instancia, la librera, la cantidad de discos y jugadores.

Para ello, al comenzar el juego, el usuario deber indicar su


nombre, luego se encontrar con diez discos en la primera torre,
pudiendo realizar sus movimientos hasta lograr la rplica de la
pila inicial en la torre 3.
Figura 1: interfaz del punto de partida del juego.
2

Posteriormente se realiza la programacin correspondiente al


movimiento de los discos conjunto a las reglas que se deben
cumplir.

Para ello, se definen las teclas a utilizar para realizar el


movimiento y que a la vez estn asociada a cada torre. Estas
teclas son: tecla A para la torre 1, tecla S para la torre 2 y
tecla D para la torre 3. Cada tecla est asociada a una
sentencia if y sta a la vez est dentro de una sentencia for.
Lo que se hace aqu es verificar que tecla se oprimi, y segn
sea A, S o D se verificar las listas de cada torre, es decir, las
alturas de las piezas en las columnas 1, 2 y 3.

Considerando por ejemplo la torre 1, asociada a la tecla A, si


es que hay alguna pieza en esta torre y no se est jugando la
pieza ms alta (altura mxima) pasa a ser la que se est jugando,
permitiendo as que solo se pueda desplazar el disco que se
encuentre a mayor altura. Figura 2: Simulacin de una partida del juego

S por el contrario se juega alguna pieza, en una sentencia if


se compara la pieza en juego (en alto) con la pieza de mayor A continuacin, se muestra el cdigo con el cual podemos
altura en la torre 1, permitiendo el movimiento de la pieza realizar la interfaz grfica y jugar a las torres de Hani.
seleccionada a la otra torre siempre y cuando la pieza trasladada
sea ms pequea que la existente en la torre de destino, import pygame, sys, time
cumpliendo as otra de las reglas fundamentales del juego. import posiniciales as pi
from pygame.locals import *
Finalmente, si se realiz el correcto movimiento desde una torre
a otra, se guarda el nmero de movimientos en una variable # SETUP
denominada puntaje, la cual ser til para elaborar el ranking nombre = input("Cual es su nombre? ")
de puntajes obtenidos por cada jugador, es decir, si la torre
objetivo es distinta a la inicial se suma un punto. jugando = 0
def dibujar(aaa): #dibuja pieza numero (gracias a esto se pueden
Este proceso descrito para la tecla A se repite para cada tecla pedir las posiciones de las piezas con numeros del 1 al 10, en
asociada a cada torre, permitiendo el correcto funcionamiento vez de poner las posiciones en coordenadas
del juego en cuanto a los movimientos de los discos hechos por
el jugador. pygame.draw.line(ventana,pi.colormadera,(pi.torre[pi.posi[aaa
]]-
Para finalizar con la programacin, lo que sigue es verificar aaa*10,pi.altura[pi.posi[10+aaa]]),(pi.torre[pi.posi[aaa]]+aaa*
cuando se ha logrado posicionar la totalidad de los discos en la 10,pi.altura[pi.posi[10+aaa]]),9)
torre 3, para as culminar el juego y dar el puntaje final del
jugador y posicionarlo en el ranking. Para ello se crea un def mover(aaa): #rellena las listas (xs1, xs2, xs3) que contienen
archivo de texto llamado highscores el cual se llama en las piezas actuales de cada torre
modalidad de lectura identificando los puntajes y nombres de for x in range(1,11):
jugadores que han participado anteriormente y luego se agrega if pi.posi[x]==1 and pi.posi[x+10]!=11:
el puntaje y el nombre del jugador actual (los puntajes se xs1.append(pi.posi[x+10])
almacenan como enteros). else:
A continuacin, estos dos parmetros se comparan en funcin xs1.append(0)
del puntaje mediante el comando sorted el cual nos for x in range(1,11):
proporciona una lista ordenada con los 5 mejores puntajes y el if pi.posi[x]==2 and pi.posi[x+10]!=11:
nombre de los respectivos jugadores, cabe destacar, que el xs2.append(pi.posi[x+10])
puesto nmero 1 lo ocupara el jugador que haya realizado else:
menos movimientos. xs2.append(0)
for x in range(1,11):
Finalmente, se escribe en pantalla el puntaje del ltimo jugador if pi.posi[x]==3 and pi.posi[x+10]!=11:
y la posicin que ocupa en el ranking, siempre y cuando este xs3.append(pi.posi[x+10])
dentro de los 5 mejores, dando paso as al siguiente jugador. else:
xs3.append(0)
En la figura 2 se puede apreciar el nmero de movimientos que
realiz el jugador simulacin y el puesto que ocupa dentro del pygame.init()
ranking, una vez finalizada la partida.
3

puntaje = 0 xs2=[0] #alturas de las piezas en la columna 2


ventana = xs3=[0] #alturas de las piezas en la columna 3
pygame.display.set_mode((800,500),pygame.FULLSCREEN) mover(1)
pygame.display.set_caption("Torre de Hani") ##titulo
ventana.fill(pi.colorfondo) ##fondo de la ventana if jugando == 0:
ganador=pygame.font.Font(None,30) ##tamao letra if max(xs2) != 0:
ganador1=pygame.font.Font(None,50) pi.posi[xs2.index(max(xs2))+10]=11
jugando=1
while True: # LOOP piezaenalto=[xs2.index(max(xs2)),2]

ventana.fill(pi.colorfondo) elif jugando == 1:


for x in range(1,11): #dibuja todas las piezas if piezaenalto[0]<=xs2.index(max(xs2)) or
xs2.index(max(xs2))==0:
dibujar(x) pi.posi[piezaenalto[0]+10]=1+max(xs2)
pi.posi[piezaenalto[0]]=2
pygame.draw.line(ventana,pi.colormaderados,(40+0,400),(40+ jugando = 0
660,400),10) # base horizontal if piezaenalto[1]!=pi.posi[piezaenalto[0]]:
puntaje+=1
pygame.draw.line(ventana,pi.colormaderados,(40+110,400),(4
0+110,290),10) # base TORRE1
if event.key==K_d: #Tecla D, torre 3
pygame.draw.line(ventana,pi.colormaderados,(40+330,400),(4 xs1=[0] #alturas de las piezas en la columna 1
0+330,290),10) # base TORRE2 xs2=[0] #alturas de las piezas en la columna 2
xs3=[0] #alturas de las piezas en la columna 3
pygame.draw.line(ventana,pi.colormaderados,(40+550,400),(4 mover(1)
0+550,290),10) # base TORRE3
if jugando == 0:
for event in pygame.event.get(): if max(xs3) != 0:
if event.type == QUIT: pi.posi[xs3.index(max(xs3))+10]=11
pygame.quit() jugando=1
sys.exit() piezaenalto=[xs3.index(max(xs3)),3]

elif event.type == pygame.KEYDOWN: elif jugando == 1:


if event.key==K_ESCAPE: if piezaenalto[0]<=xs3.index(max(xs3)) or
pygame.quit() xs3.index(max(xs3))==0:
sys.exit() pi.posi[piezaenalto[0]+10]=1+max(xs3)
pi.posi[piezaenalto[0]]=3
if event.key==K_a: #Tecla A, torre 1 jugando = 0
xs1=[0] #alturas de las piezas en la columna 1 if piezaenalto[1]!=pi.posi[piezaenalto[0]]:
xs2=[0] #alturas de las piezas en la columna 2 puntaje+=1
xs3=[0] #alturas de las piezas en la columna 3
mover(1)
if pi.posi[1:11]==[3, 3, 3, 3, 3, 3, 3, 3, 3, 3]:
if jugando == 0:
if max(xs1) != 0: continuar=ganador.render("PARA EL SIGUIENTE
pi.posi[xs1.index(max(xs1))+10]=11 TURNO PRESIONE X",0,(0,0,255))
jugando=1 tituloganador=ganador.render(("Felicidades
piezaenalto=[xs1.index(max(xs1)),1] "+str(nombre)+", has logrado finalizar, su puntaje es:
"+str(puntaje)),0,(0,0,255))
elif jugando == 1: highscores=ganador.render("Los 5 mejores puntajes
if piezaenalto[0]<=xs1.index(max(xs1)) or son:",0,(0,0,255))
xs1.index(max(xs1))==0:
pi.posi[piezaenalto[0]+10]=1+max(xs1) fp = open('highscores.txt',"r") # lee lo que hay desde el
pi.posi[piezaenalto[0]]=1 punto y coma hacia la izquierda en el archivo de texto.
jugando = 0 score = fp.readlines()[0].split(",;")[0].split(",")
if piezaenalto[1]!=pi.posi[piezaenalto[0]]: fp.close()
puntaje+=1
fp = open('highscores.txt',"r") # lee lo que hay desde el
if event.key==K_s: #Tecla S, torre 2 punto y coma hacia la derecha en el archivo de texto.
xs1=[0] #alturas de las piezas en la columna 1 names = fp.readlines()[0].split(",;")[1].split(",")
4

fp.close() ventana.fill(pi.colorfondo) ##fondo de la ventana

score.append(str(puntaje))
names.append(str(nombre)) # Agrega el nombre y III. CONCLUSIONES
puntaje del jugador actual en el archivo de texto "highscores"
- El lenguaje de programacin Python es ms sencillo
scoreint=[] de utilizar en comparacin a otros lenguajes, esto
for i in range(0,(len(score))): debido a que este lenguaje es ms legible y elegante,
scoreint.append(int(str(score[i]))) simple, poderoso y denso, es decir, con poco cdigo se
e= sorted(zip(scoreint, names),reverse=False)[:5] # crea hace mucho y todo aquello innecesario no hay que
una lista con los nombres y puntaje de los 5 mejores escribirlo. Adems, la librera Python sigue creciendo.
- Gracias al uso de la librera Pygame se puede
f=open("highscores.txt","w") prototipar y desarrollar rpidamente, pues Pygame es
for punto in score: # el puntaje lo escribe en score, un conjunto de mdulos del lenguaje Python que
los separa por una coma y finalmente punto y coma permiten la creacin de videojuegos en dos
f.write(str(punto)) dimensiones de una manera sencilla, lo cual quedo
f.write(",") demostrado en lo desarrollado anteriormente.
f.write(";") - La dificultad del juego depender netamente de la
for name in names: cantidad de discos con los que se juegue, siendo mayor
f.write(str(name)) a medida que aumentamos el nmero de discos. El
f.write(",") nmero de movimientos ptimos para llegar a la mejor
f.write(";") solucin se obtiene a partir de la siguiente ecuacin:
f.close() # el nombre lo escribe en name, los (2 1) donde es el nmero de discos, por ende,
separa por una coma y finalmente con punto y coma y cierra la para este caso (10 discos) se requieren como mnimo
lista. 1023 movimientos.

ranking1=ganador.render(("1. "+str(e[0])),0,(0,0,255))
ranking2=ganador.render(("2. "+str(e[1])),0,(0,0,255))
ranking3=ganador.render(("3. "+str(e[2])),0,(0,0,255))
ranking4=ganador.render(("4. "+str(e[3])),0,(0,0,255))
ranking5=ganador.render(("5. "+str(e[4])),0,(0,0,255))

# Imprime el ranking en pantalla en las coordenadas


establecidas
ventana.fill(pi.colorfondo)
ventana.blit(highscores,(200,200))
ventana.blit(tituloganador,(100,100))
ventana.blit(continuar,(180,150))
ventana.blit(ranking1,(300,250))
ventana.blit(ranking2,(300,300))
ventana.blit(ranking3,(300,350))
ventana.blit(ranking4,(300,400))
ventana.blit(ranking5,(300,450))
pygame.display.update()

while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key==K_ESCAPE:
pygame.quit()
sys.exit()
if event.key==K_x: #Presionar x para que pueda
jugar el proximo jugador
pygame.quit()
sys.exit()

Titulo = ganador1.render("Torres de Hani",0,(33,33,33))


ventana.blit(Titulo,(250,50))
pygame.display.update()

También podría gustarte