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 originalfrom modgame import game
from os import system
def main():
"""Esta es la parte principal del programa"""
mainmenu()
menu=0
while menu<1 or menu>3:
item = raw_input("Opcion: ")
if item.isdigit(): menu=int(item)
if menu==1:
play = "s"
while play.lower()=="s":
game()
play = ""
while play.lower()!="s" and play.lower()!="n":
play = raw_input("Jugar de Nuevo? (S/N) ")
if menu==2:
print("El objetivo del Juego es mover el cursor hasta que\ntodos los numeros esten en forma secuencial")
print("y el cursor se encuentre en la ezquina inferior derecha.")
print("Para mover el cursor use los numeros 2(abajo),\n4(izquierda), 6(derecha) y 8(arriba)")
print("Para desistir del juego escriba 's', en ese caso\nel puzzle se completara automaticamente")
print("")
print("Presiona Intro para continuar")
raw_input()
mainmenu()
menu = 0
if menu==3: quit()
def mainmenu():
system("clear")
"""Imprime el menu Principal"""
print("Bienvenido al juego del 8 Tiles Puzzle")
print("(C) David el Grande - ForosDelWeb.com")
print("")
print("1- Jugar")
print("2- Ayuda")
print("3- Salir")
print("")
main()
Archivo:
modgame.py
Descripción: Módulo del programa, contiene el juego en sí.
Código python:
Ver originalfrom random import random
from os import system
def printgame(var, header=""):
"""Imprime el estado actual del Juego"""
system("clear")
if header!="": print(header)
print("")
print(" "+var[:1]+" | "+var[1:2]+" | "+var[2:3])
print("---|---|---")
print(" "+var[3:4]+" | "+var[4:5]+" | "+var[5:6])
print("---|---|---")
print(" "+var[6:7]+" | "+var[7:8]+" | "+var[8:9])
print("")
def randomize(min,max):
"""Genera un numero aleatorio entre Minimo y Maximo-1 (Maximo no se incluye)"""
return min + int(random() * (max-min))
def randommoves(var):
"""Realiza jugadas aleatorias para que el tablero inicie desordenado"""
moves = "8"
count = 0
while count<20: #Realizaremos 20 jugadas aleatorias
currentpos = var.find("_")
randomic = randomize(0,4) #Generamos una direccion aleatoria
movepos = move(randomic, currentpos) #Calculamos la posicion hacia esa direccion
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
count += 1
moves += str(movepos)
var = var[:currentpos] + var[movepos:movepos + 1] + var[currentpos + 1:]
var = var[:movepos] + "_" + var[movepos + 1:]
return [var, moves] #Devolvemos una lista con el estado del tablero y los movimientos realizados
def game():
"""Inicia el juego"""
is_easy = True
while is_easy:
state = "12345678_"
[state, moves] = randommoves(state) #La variable moves la usaremos para resolver el tablero
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
game_finish = False
count = 0
printgame(state, "Movimientos: 0")
while not game_finish:
currentpos = state.find("_")
direction = raw_input("Ingrese una direccion: ")
if "2468".find(direction) > -1 and len(direction) == 1:
movepos = move("2468".find(direction), currentpos)
if movepos > -1: #Comprobamos que sea un movimiento valido
moves += str(movepos)
state = state[:currentpos] + state[movepos:movepos + 1] + state[currentpos + 1:]
state = state[:movepos] + "_" + state[movepos + 1:]
count += 1
printgame(state, "Movimientos: " + str(count))
if state=="12345678_": game_finish = True
if direction.lower() == "s":
confirm = ""
while confirm.lower()!="s" and confirm.lower()!="n":
confirm = raw_input("Realmente desea desistir? (S/N) ")
if confirm.lower()=="s": game_finish = True
if direction.lower() != "s":
print("Lograste resolver el puzzle!!! :-)")
else:
solution(state, moves + " ")
def solution(var, moves):
"""Solucionamos el puzzle, retrocediendo todos los movimientos"""
from time import sleep
for looping in range(3, len(moves) + 1): #Empezamos el bucle con 3 porque descartamos el espacio al final y tambien el ultimo movimiento
movepos = int(moves[-looping:-looping+1])
currentpos = var.find("_")
var = var[:currentpos] + var[movepos:movepos + 1] + var[currentpos + 1:]
var = var[:movepos] + "_" + var[movepos + 1:]
sleep(0.5) #Esperamos un segundo para realizar el proximo movimiento hacia la solucion
printgame(var, "No lograste resolver el puzzle. :-(")
def move(direction, currentpos):
"""Devuelve la posicion que debe ocupar el cursor al mover hacia una direccion"""
position = (3,-1,1,-3)[direction] #Segun la direccion obtenemos la posicion con la que debemos cambiar
if abs(position) == 1 and abs(((position + currentpos) % 3) - (currentpos % 3)) != 1: return -1 #Si pasa a otra fila no realizamos el movimiento
position += currentpos
if position < 0 or position > 8: return -1 #Si sale del tablero no realizamos el movimiento
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
.
Felicidades,
HackmanC por ganar la competencia
.
P.S.: ¿De veras es necesario hacer una votación?
.