Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.45 KB | None | 0 0
  1. import nodo, random, copy, sys
  2. def lugaresDisponibles(Estado):
  3.     z=1
  4.     for x in Estado:
  5.         for y in x:
  6.             if(y==0):
  7.         print str(z)+" ",
  8.             z+=1
  9. def numeroHijos(Estado):        #regresa el numero de hijos
  10.     if(terminal(Estado)!=2):    #si es terminal, no tiene hijos
  11.         return 0
  12.     cont = 0
  13.     for x in Estado:
  14.         for y in x:
  15.             if (y==0):
  16.                 cont+=1     #se le suma al numero de hijos
  17.     return cont        #regresa el numero de hijos
  18.  
  19. def profundidad(Estado):    #regresa que tan profundo es el estado
  20.     cont = 0
  21.     for x in Estado:
  22.         for y in x:
  23.             if (y==0):
  24.                 cont+=1     #se le suma uno porque se va uno para abajo
  25.     return 9-cont          #regresa la profundidad
  26.  
  27. def imprimeEstado(Estado):
  28.     z=1
  29.     for x in Estado:
  30.         for y in x:
  31.             if(y == 1):
  32.                 print "X ",
  33.         elif(y == -1):
  34.                 print "O ",
  35.             else:
  36.                 print str(z)+" ",#imprime el numero de la casilla
  37.             z+=1
  38.         print " "
  39. def mejorMov(Estado, nivel, profund): #devuelve el mejor movimiento posible
  40.     i = creaHijos(Estado)
  41.     for x in i:
  42.         x.setCalificacion(calificarArbol(x.getEstado(),nivel,profund))
  43.     turno = profundidad(Estado)
  44.     turno = turno%2
  45.     temp = 0
  46.     pos = 0
  47.     if(turno == 0): #es decir, es max
  48.         temp =-100
  49.         cont = 0
  50.         for x in i:
  51.             if(x.getCalificacion() > temp):
  52.                 temp = x.getCalificacion()
  53.                 pos=cont
  54.             cont+=1
  55.     else: # es min
  56.         temp= 100
  57.         cont = 0
  58.         for x in i:
  59.             if(x.getCalificacion() < temp):
  60.                 temp= x.getCalificacion()
  61.                 pos=cont
  62.             cont+=1
  63.     veces=0
  64.     for x in i:
  65.         if(x.getCalificacion()==temp):
  66.             veces+=1
  67.     if(veces==1):
  68.         return i.pop(pos).getEstado()
  69.     else:
  70.         posix=random.randint(1,veces)
  71.         vecbuenos = 0
  72.         for x in i:
  73.             if(x.getCalificacion()==temp):
  74.                 vecbuenos+=1
  75.         if(vecbuenos == posix):
  76.                 return x.getEstado()
  77.     return None #regresa ninguno porque no hay hijo bueno
  78.  
  79. def calificarArbol(Estado,nivel,profund):
  80.     if(terminal(Estado)!=2 or (profundidad(Estado)-nivel)==profund): #califica el hijo ya que es terminal
  81.         return calificahijo(Estado)
  82.     i = creaHijos(Estado)
  83.     for x in i:
  84.         x.setCalificacion(calificarArbol(x.getEstado(),nivel,profund)) #calificas el arbol desde este punto recursivamente
  85.     prof = profundidad(Estado)
  86.     prof = prof%2
  87.     temp = 0
  88.     if(prof == 0): #es decir, es max
  89.         temp =-100
  90.         for x in i:
  91.             if(x.getCalificacion() > temp):
  92.                 temp = x.getCalificacion()
  93.     else: # es min
  94.         temp= 100
  95.         for x in i:
  96.             if(x.getCalificacion() < temp):
  97.                 temp= x.getCalificacion()
  98.     return temp #regresa la calificacion seleccionada
  99.  
  100. def terminal(Estado): #checa si es un juego terminado
  101.     cont = 0
  102.     rango =range(3)
  103.     for i in rango:     #checa verticales
  104.         for x in Estado:
  105.             cont+=x[i]
  106.         if(cont==3):
  107.             return 1 #Max gana
  108.         elif(cont==-3):
  109.             return -1 #Min gana
  110.         else:
  111.             cont = 0
  112.    
  113.     for x in Estado:           #checa horizontales
  114.         for y in x:
  115.             cont+=y
  116.         if(cont==3):
  117.             return 1 #Max gana
  118.         elif(cont==-3):
  119.             return -1 #Min gana
  120.         else:
  121.             cont = 0
  122.     z = 0
  123.     for x in Estado:        #checa diagonal \
  124.         cont+=x[z]
  125.         z+=1
  126.     if(cont==3):
  127.         return 1 #Max gana
  128.     elif(cont==-3):
  129.         return -1 #Min gana
  130.     else:
  131.         cont = 0
  132.     z = 2      
  133.     for x in Estado:        #checa diagonal /
  134.         cont+=x[z]
  135.         z-=1
  136.     if(cont==3):
  137.         return 1 #Max gana
  138.     elif(cont==-3):
  139.         return -1 #Min gana
  140.     else:
  141.         cont = 0
  142.     for x in Estado:    #checa si hay espacios vacios
  143.         for y in x:
  144.             if(y==0):
  145.                 return 2 #no ha acabado
  146.     return 0 #esta lleno el tablero, entonces han empatado
  147.  
  148.  
  149.  
  150. def creaHijos(Estado): #crea los hijos posibles
  151.     nhijos = numeroHijos(Estado)
  152.     nivel = profundidad(Estado)
  153.     turno = nivel%2
  154.     i = range(nhijos)
  155.     listadehijos = []
  156.     for hijos in i:
  157.         temporal = copy.deepcopy(Estado)  #copia el estado original para hacer los hijos
  158.         hijo = nodo.hijo()
  159.     nhijo = -1
  160.         for x in temporal:
  161.             cont =0
  162.             for y in x:    
  163.                 if(y==0):
  164.                     nhijo+=1
  165.                     if(nhijo==hijos):
  166.                         x.pop(cont)
  167.                         x.insert(cont,1-(turno*2))#asigna X o O dependiendo
  168.                 cont+=1
  169.         hijo.setEstado(temporal)
  170.         listadehijos.append(hijo)
  171.  
  172.    
  173.     return listadehijos
  174.  
  175. def calificahijo(Estado):
  176.     if(terminal(Estado)==1): #gano X
  177.         return 100
  178.     if(terminal(Estado)==-1): #gano O
  179.         return -100
  180.     if(terminal(Estado)==1): #empataron
  181.         return 0
  182.              #empieza la evaluacion ya que no es terminal    
  183.     matrix = [[0,0,0],[0,0,0],[0,0,0]]
  184.     for x in Estado:
  185.         cont = 0
  186.         for y in x:
  187.             matrix.pop(cont)
  188.             if(y==0):   #Si esta vacio, agrega 4
  189.                 matrix.insert(cont,4)
  190.             elif(y==-1): #si hay O, pone un 1
  191.                 matrix.insert(cont,1)
  192.             elif(y==1): #si hay X, pone 2
  193.                 matrix.insert(cont,2)
  194.             cont +=1
  195.     cont = 0
  196.     heuristica = 0
  197.     rango =range(3)
  198.     for i in rango:     #checa verticales
  199.         for x in matrix:
  200.             cont+=x
  201.         if(cont==6):
  202.             heuristica+=-3 #hay dos O y uno vacio
  203.         elif(cont==9):
  204.             heuristica+=-2 # hay un o y dos vacios
  205.         elif(cont==10):
  206.             heuristica+=2 # hay una x y dos vacio
  207.         else:
  208.             heuristica+=3 #hay dos x y uno vacio
  209.         cont=0
  210.    
  211.     for i in rango:           #checa horizontales
  212.         for y in matrix:
  213.             cont+=y
  214.         if(cont==6):
  215.             heuristica+=-3 #hay dos O y uno vacio
  216.         elif(cont==9):
  217.             heuristica+=-2 # hay un o y dos vacios
  218.         elif(cont==10):
  219.             heuristica+=2 # hay una x y dos vacio
  220.         else:
  221.             heuristica+=3 #hay dos x y uno vacio
  222.         cont=0
  223.     z = 0
  224.     for x in matrix:        #checa diagonal \
  225.         cont+=x
  226.         z+=1
  227.     if(cont==6):
  228.         heuristica+=-3 #hay dos O y uno vacio
  229.     elif(cont==9):
  230.         heuristica+=-2 # hay un o y dos vacios
  231.     elif(cont==10):
  232.         heuristica+=2 # hay una x y dos vacio
  233.     else:
  234.         heuristica+=3 #hay dos x y uno vacio
  235.     cont=0
  236.     z = 2      
  237.     for x in matrix:        #checa diagonal /
  238.         cont+=x
  239.         z-=1
  240.     if(cont==6):
  241.         heuristica+=-3 #hay dos O y uno vacio
  242.     elif(cont==9):
  243.         heuristica+=-2 # hay un o y dos vacios
  244.     elif(cont==10):
  245.         heuristica+=2 # hay una x y dos vacio
  246.     else:
  247.         heuristica+=3 #hay dos x y uno vacio
  248.     return heuristica #esta lleno el tablero, entonces han empatado
  249.    
  250. def main():
  251.     print "Juego de Gato, la pc comienza usando el 'X'"
  252.     print "Escoge la dificultad (1-3-9): ",
  253.     dificultad = input()
  254.     estadoactual = [[0,0,0],[0,0,0],[0,0,0]]
  255.     imprimeEstado(estadoactual)
  256.     duracion = range(9)
  257.     for x in duracion:
  258.         nivel = profundidad(estadoactual)
  259.         nivel = nivel%2
  260.         if(nivel!=0):
  261.         valido = False
  262.         while(not valido):
  263.                 print "Digite la casilla a tirar "
  264.                 lugaresDisponibles(estadoactual)
  265.                 print "Cual quiere?: ",
  266.                 seleccion = input()
  267.                 f = 0
  268.                 c = 0
  269.                 if(seleccion==1):
  270.                     f = 0
  271.                     c = 0
  272.                 if(seleccion==2):
  273.                     f = 1
  274.                     c = 0
  275.                 if(seleccion==3):
  276.                     f = 2
  277.                     c = 0
  278.                 if(seleccion==4):
  279.                     f = 0
  280.                     c = 1
  281.                 if(seleccion==5):
  282.                     f = 1
  283.                     c = 1
  284.                 if(seleccion==6):
  285.                     f = 2
  286.                     c = 1
  287.                 if(seleccion==7):
  288.                     f = 0
  289.                     c = 2
  290.                 if(seleccion==8):
  291.                     f = 1
  292.                     c = 2
  293.                 if(seleccion==9):
  294.                     f = 2
  295.                     c = 2
  296.         if(estadoactual[c][f] == 0):
  297.                     valido = True
  298.                 else:
  299.                     print "Casilla ocupada, seleccione otra"
  300.             estadoactual[c][f] = -1 #pone el tiro del jugador en el estado actual
  301.             print "Tu Turno"
  302.             imprimeEstado(estadoactual)
  303.     else:
  304.             print "Turno de Max:"
  305.             estadoactual = mejorMov(estadoactual,profundidad(estadoactual),dificultad)
  306.             imprimeEstado(estadoactual)
  307.         if(terminal(estadoactual)==1 and terminal(estadoactual)!=0):
  308.             print "Perdiste..."
  309.             sys.exit()
  310.         elif(terminal(estadoactual)==0):
  311.             print "Empataron..."
  312.             sys.exit()
  313.         elif (terminal(estadoactual)==-1):
  314.             print "Ganaste!"
  315.             sys.exit()
  316.          
  317.    
  318.    
  319. main()
  320. #hijo = nodo.hijo()
  321.  
  322. #lugaresDisponibles(hijo.getEstado())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement