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 .
Última edición por David; 10/07/2008 a las 08:57 |