Ver Mensaje Individual
  #44 (permalink)  
Antiguo 06/10/2008, 14:04
Avatar de David
David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
De acuerdo Respuesta: Segunda competencia para programadores

Después de ver el trabajo publicado se me fueron las ganas de publicar el mío (que de hecho no he mirado en las últimas 2 semanas ).

Cita:
Iniciado por blackwind
En mi muy particular punto de vista, si alguien viene con un algoritmo que resuelva el nxn de una manera claramente superior, aun cuando su programa fuera en modo texto, y sin esa documentacion, el deberia ganar.
No le mires al mío, porque la forma de resolver es igual de mediocre o peor . Irresponsabilidad mía dejarlo de la misma forma como estaba.

Bueno, pero como para no dejarle a HackmanC participar solito, aquí va:

Archivo: 8puzzle.py
Descripción: Menú Principal
Código python:
Ver original
  1. from modgame import game
  2. from os import system
  3. def main():
  4.     """Esta es la parte principal del programa"""
  5.     mainmenu()
  6.     menu=0
  7.     while menu<1 or menu>3:
  8.         item = raw_input("Opcion: ")
  9.         if item.isdigit(): menu=int(item)
  10.         if menu==1:
  11.             play = "s"
  12.             while play.lower()=="s":
  13.                 game()
  14.                 play = ""
  15.                 while play.lower()!="s" and play.lower()!="n":
  16.                     play = raw_input("Jugar de Nuevo? (S/N) ")
  17.         if menu==2:
  18.             print("El objetivo del Juego es mover el cursor hasta que\ntodos los numeros esten en forma secuencial")
  19.             print("y el cursor se encuentre en la ezquina inferior derecha.")
  20.             print("Para mover el cursor use los numeros 2(abajo),\n4(izquierda), 6(derecha) y 8(arriba)")
  21.             print("Para desistir del juego escriba 's', en ese caso\nel puzzle se completara automaticamente")
  22.             print("")
  23.             print("Presiona Intro para continuar")
  24.             raw_input()
  25.             mainmenu()
  26.             menu = 0
  27.         if menu==3: quit()
  28. def mainmenu():
  29.     system("clear")
  30.     """Imprime el menu Principal"""
  31.     print("Bienvenido al juego del 8 Tiles Puzzle")
  32.     print("(C) David el Grande - ForosDelWeb.com")
  33.     print("")
  34.     print("1- Jugar")
  35.     print("2- Ayuda")
  36.     print("3- Salir")
  37.     print("")
  38.  
  39. main()
Archivo: modgame.py
Descripción: Módulo del programa, contiene el juego en sí.
Código python:
Ver original
  1. from random import random
  2. from os import system
  3. def printgame(var, header=""):
  4.     """Imprime el estado actual del Juego"""
  5.     system("clear")
  6.     if header!="": print(header)
  7.     print("")
  8.     print(" "+var[:1]+" | "+var[1:2]+" | "+var[2:3])
  9.     print("---|---|---")
  10.     print(" "+var[3:4]+" | "+var[4:5]+" | "+var[5:6])
  11.     print("---|---|---")
  12.     print(" "+var[6:7]+" | "+var[7:8]+" | "+var[8:9])
  13.     print("")
  14. def randomize(min,max):
  15.     """Genera un numero aleatorio entre Minimo y Maximo-1 (Maximo no se incluye)"""
  16.     return min + int(random() * (max-min))
  17. def randommoves(var):
  18.     """Realiza jugadas aleatorias para que el tablero inicie desordenado"""
  19.     moves = "8"
  20.     count = 0
  21.     while count<20: #Realizaremos 20 jugadas aleatorias
  22.         currentpos = var.find("_")
  23.         randomic = randomize(0,4) #Generamos una direccion aleatoria
  24.         movepos = move(randomic, currentpos) #Calculamos la posicion hacia esa direccion
  25.         if movepos > -1 and str(movepos) != moves[len(moves)-2:len(moves)-1]: #Comprobamos que sea un movimiento valido y que no sea igual al penultimo
  26.             count += 1
  27.             moves += str(movepos)
  28.             var = var[:currentpos] + var[movepos:movepos + 1] + var[currentpos + 1:]
  29.             var = var[:movepos] + "_" + var[movepos + 1:]
  30.     return [var, moves] #Devolvemos una lista con el estado del tablero y los movimientos realizados
  31. def game():
  32.     """Inicia el juego"""
  33.     is_easy = True
  34.     while is_easy:
  35.         state = "12345678_"
  36.         [state, moves] = randommoves(state) #La variable moves la usaremos para resolver el tablero
  37.         is_easy = (state[:3]=="123" or state[3:6]=="456" or state[6:9]=="789") #Si es muy facil volvemos a realizar los movimientos aleatorios
  38.     game_finish = False
  39.     count = 0
  40.     printgame(state, "Movimientos: 0")
  41.     while not game_finish:
  42.         currentpos = state.find("_")
  43.         direction = raw_input("Ingrese una direccion: ")
  44.         if "2468".find(direction) > -1 and len(direction) == 1:
  45.             movepos = move("2468".find(direction), currentpos)
  46.             if movepos > -1: #Comprobamos que sea un movimiento valido
  47.                 moves += str(movepos)
  48.                 state = state[:currentpos] + state[movepos:movepos + 1] + state[currentpos + 1:]
  49.                 state = state[:movepos] + "_" + state[movepos + 1:]
  50.                 count += 1
  51.                 printgame(state, "Movimientos: " + str(count))
  52.                 if state=="12345678_": game_finish = True
  53.         if direction.lower() == "s":
  54.             confirm = ""
  55.             while confirm.lower()!="s" and confirm.lower()!="n":
  56.                 confirm = raw_input("Realmente desea desistir? (S/N) ")
  57.             if confirm.lower()=="s": game_finish = True
  58.     if direction.lower() != "s":
  59.         print("Lograste resolver el puzzle!!! :-)")
  60.     else:
  61.         solution(state, moves + " ")
  62. def solution(var, moves):
  63.     """Solucionamos el puzzle, retrocediendo todos los movimientos"""
  64.     from time import sleep
  65.     for looping in range(3, len(moves) + 1): #Empezamos el bucle con 3 porque descartamos el espacio al final y tambien el ultimo movimiento
  66.         movepos = int(moves[-looping:-looping+1])
  67.         currentpos = var.find("_")
  68.         var = var[:currentpos] + var[movepos:movepos + 1] + var[currentpos + 1:]
  69.         var = var[:movepos] + "_" + var[movepos + 1:]
  70.         sleep(0.5) #Esperamos un segundo para realizar el proximo movimiento hacia la solucion
  71.         printgame(var, "No lograste resolver el puzzle. :-(")
  72. def move(direction, currentpos):
  73.     """Devuelve la posicion que debe ocupar el cursor al mover hacia una direccion"""
  74.     position = (3,-1,1,-3)[direction] #Segun la direccion obtenemos la posicion con la que debemos cambiar
  75.     if abs(position) == 1 and abs(((position + currentpos) % 3) - (currentpos % 3)) != 1: return -1 #Si pasa a otra fila no realizamos el movimiento
  76.     position += currentpos
  77.     if position < 0 or position > 8: return -1 #Si sale del tablero no realizamos el movimiento
  78.     return position
Archivo: clear.bat
Descripción: <sarcasmo>El archivo principal del proyecto</sarcasmo>. Solo sirve para que el borrado de pantalla funcione en Windows .
Código:
cls
Felicidades, HackmanC por ganar la competencia .

P.S.: ¿De veras es necesario hacer una votación? .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.