Ver Mensaje Individual
  #21 (permalink)  
Antiguo 10/07/2008, 08:33
Avatar de David
David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
De acuerdo Respuesta: ¿Por qué no hacemos una competencia entre programadores?

Bueno, aquí mi humilde trabajo.

Lenguaje: Python (Es un lenguaje en el que no tengo tanta experiencia, así que me decidí escribir el código en él para practicar).

tictactoe.py:
Código:
def findchar(var1, var2, var3, var4, char, init=0):
    """Busca las coincidencias entre las variables y el caracter y retorna una lista"""
    match=[]
    if var1==char:match.append(1+init)
    if var2==char:match.append(2+init)
    if var3==char:match.append(3+init)
    if var4==char:match.append(4+init)
    return match
def randomize(min,max):
    """Genera un numero aleatorio entre Minimo y Maximo-1 (Maximo no se incluye)"""
    from random import random
    return min + int(random() * (max-min))
def medioincorners(corner1, corner2):
    """Retorna el medio entre 2 esquinas"""
    #El numero mayor siempre debe estar en corner1
    if corner2>corner1:
        temp=corner1
        corner1=corner2
        corner2=temp
    return int(corner2+((corner1-corner2)/2))
def playmachine(var,var_nivel):
    """Calcula la jugada de la computadora"""
    jugada=0
    lista=findchar(var[:1], var[1:2], var[2:3], var[3:4], " ")
    lista.extend(findchar(var[4:5], var[5:6], var[6:7], var[7:8], " ", 4))
    if var[8:9]==" ": lista.append(9)
    if var_nivel==1:
        #Elegimos una jugada aleatoria
        jugada=lista[randomize(0,len(lista))]
    else:
        emptycorners=[(1,3,7,9)[item-1] for item in findchar(var[:1],var[2:3],var[6:7],var[8:9]," ")]
        if len(emptycorners)>0: jugada=emptycorners[randomize(0,len(emptycorners))]
    #En el Nivel Dificil 10% de las veces no se efectuara el calculo avanzado. Si siempre se efectuara el calculo, seria casi imposible ganarlo
    if var_nivel==2 and var!="         " and randomize(0,100)>10:
        esquina=findchar(var[:1],var[2:3],var[6:7],var[8:9],"X")
        if findchar(var[:1],var[2:3],var[6:7],var[8:9],"O") and not esquina:
            if var[4:5]==" ":
                jugada=5
            elif var[4:5]=="X":
                #Elegimos cualquier medio que obligue a realizar una accion
                medios=findchar(var[1:2],var[3:4],var[5:6],var[7:8]," ")
                medios=[item*2 for item in medios if var[(((item+(2*(item%2)))%4)+1)*2-1:(((item+(2*(item%2)))%4)+1)*2]==" "]
                if len(medios)>0: jugada=medios[randomize(0,len(medios))]
        else:
            if len(esquina)==1:
                #Elegimos una esquina que obligue a realizar una accion
                esquina=[(1,3,7,9)[item-1] for item in [((esquina[0]+1)%4)+1,esquina[0]-1+(2*(esquina[0]%2))] if var[medioincorners((1,3,7,9)[esquina[0]-1],(1,3,7,9)[item-1])-1:medioincorners((1,3,7,9)[esquina[0]-1],(1,3,7,9)[item-1])]==" " and var[(0,2,6,8)[item-1]:(1,3,7,9)[item-1]]==" "]
                if len(esquina)>0: jugada=esquina[randomize(0,len(esquina))]
                else: jugada=5
            elif len(esquina)==2:
                #Elegimos otra esquina que obligue a realizar una accion
                esquina=[(1,3,7,9)[empty-1] for empty in findchar(var[:1],var[2:3],var[6:7],var[8:9]," ") if [item for item in [((empty+1)%4)+1,empty-1+(2*(empty%2))] if var[(0,2,6,8)[item-1]:(1,3,7,9)[item-1]]=="X" and var[medioincorners((1,3,7,9)[empty-1],(1,3,7,9)[item-1])-1:medioincorners((1,3,7,9)[empty-1],(1,3,7,9)[item-1])]==" "]]
                if len(esquina)>0: jugada=esquina[randomize(0,len(esquina))]
                else: jugada=5
    if jugada is None: jugada = lista[0]
    #Si estamos tratando de jugar en un lugar ya marcado, corregir
    if var[jugada-1:jugada]!=" ": jugada=lista[0]
    #En el 10% de los casos en el Nivel Facil la computadora no comprobara si puede ganar o perder
    if randomize(1,100)>10 or var_nivel==2:
        for letra in lista:
            prueba=var[:letra-1]+"X"+var[letra:]
            if game_end(prueba):
                jugada=letra
                break
            prueba=var[:letra-1]+"O"+var[letra:]
            if game_end(prueba):jugada=letra
    return jugada
def printgame(var):
    """Imprime el estado actual del Juego"""
    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 game(var_nivel,var_first):
    """Inicia el Juego (Nivel, Quien Empieza)"""
    game_over=False
    estado="         "
    printgame(estado)
    while not game_over:
        if var_first:
            posicion=0
            while posicion<1 or posicion>9 or estado[posicion-1]!=" ":
                jugada=raw_input("Escriba su jugada (1-9): ")
                if jugada.isdigit(): posicion=int(jugada)
            print("Su jugada es:")
            jugada="O"
        else:
            jugada="X"
            posicion=playmachine(estado,var_nivel)
            print("La jugada de la computadora es: %d" % (posicion))
        estado=estado[:posicion-1]+jugada+estado[posicion:]
        printgame(estado)
        if game_end(estado):
            if var_first: print("Ganaste :-)")
            else: print("Perdiste :-(")
            game_over=True
        if estado.find(" ") == -1 and not game_over:
            print("< Empate >")
            game_over=True
        var_first=not var_first
def game_end(var):
    """Devuelve si el juego ha terminado"""
    for looping in range(0,3):
        if (var[looping*3:(looping*3)+3]=="OOO" or var[looping*3:(looping*3)+3]=="XXX") \
            or (var[looping:looping+1]==var[looping+3:looping+4]==var[looping+6:looping+7]!=" "): return True
    if var[:1]==var[4:5]==var[8:9]!=" " or var[2:3]==var[4:5]==var[6:7]!=" ": return True
    return False
print("Bienvenido al juego del Tic-Tac-Toe")
print("(C) David el Grande - ForosDelWeb.com")
print("")
print("1- Jugar")
print("2- Salir")
print("")
menu=0
while menu<1 or menu>2:
    dato=raw_input("Opcion: ")
    if dato.isdigit(): menu=int(dato)
    if menu==1:
        jugar = "s"
        first=False
        while jugar.lower() == "s":
            first=not first
            nivel=0
            while nivel<1 or nivel>2:
                print("")
                print("1- Facil")
                print("2- Dificil")
                dato=raw_input("Seleccionar Nivel: ")
                if dato.isdigit(): nivel=int(dato)
            game(nivel,first)
            jugar=""
            while jugar.lower()!="s" and jugar.lower()!="n":
                jugar=raw_input("Jugar de Nuevo? (S/N) ")
    if menu==2:
        quit()
Recuerden, hoy es el último día para presentar vuestros trabajos. Si nadie más lo hace hasta las 11:59p.m. gano por default .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Última edición por David; 10/07/2008 a las 08:57