Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import random as r
- def coordenadas(pos):
- '''
- Retorna las coordenadas del tablero para una posición del mismo
- '''
- sumador=0
- while True:
- if (pos + sumador) % 8 == 0: # Como sé que para cualquier posición que tenga como coordenada x = 8 va a ser múltiplo de 8, voy sumando 1 a la posición hasta que
- x = 8-sumador # se vuelva múltiplo de 8. Cuando esto se cumpla solo tengo que restar_ 1: La cantidad de veces que he sumado 1 a la posición y 2: El 8
- break # con eso tengo la coordenada en x
- sumador += 1
- if pos-x>0:
- y = (pos-x)//8+1
- else:
- y=0
- return [x,y]
- def grados(column, row):
- '''
- Retorna los grados de libertad y sus posiciones en el tablero para unas coordenadas dadas
- '''
- Posicion = (column + 1) + row * 8
- column += 1
- row += 1
- Filas = {1: [1, 8], 2: [9, 16], 3: [17, 24], 4: [25, 32], 5: [33, 40], 6: [41, 48], 7: [49, 56], 8: [57, 64]}
- Grados = 0
- posiciones=[]
- try: #Que intente restarle 1 a la fila, si no puede significa que por arriba no hay grados
- FilaActual = Filas[row - 1]
- except:
- pass
- else: #Verifico que las 2 posibles casillas que están 1 fila arriba de la posición estén dentro del rango de esa fila
- if Posicion - 8 + 2 <= FilaActual[1] and Posicion - 8 + 2 >= FilaActual[0]:
- Grados += 1
- posiciones.append(Posicion - 8 + 2)
- if Posicion - 8 - 2 >= FilaActual[0] and Posicion - 8 - 2 <= FilaActual[1]:
- Grados += 1
- posiciones.append(Posicion - 8 - 2)
- try: # Como se ha podido restar 1 a la fila, pruebo a ver si se puede restar 2, de poderse se ejecuta el mismo procedimiento.
- FilaActual = Filas[row - 2]
- except:
- pass
- else:
- if Posicion - 16 + 1 >= FilaActual[0] and Posicion-16 + 1 <= FilaActual[1]:
- Grados += 1
- posiciones.append(Posicion-16 + 1)
- if Posicion - 16 - 1 <= FilaActual[1] and Posicion-16 - 1 >= FilaActual[0]:
- Grados += 1
- posiciones.append(Posicion - 16 - 1)
- try:
- FilaActual = Filas[row+1]
- except:
- pass
- else:
- if Posicion + 8 + 2 <= FilaActual[1]:
- Grados += 1
- posiciones.append(Posicion + 8 + 2)
- if Posicion + 8 - 2 >= FilaActual[0]:
- Grados += 1
- posiciones.append(Posicion + 8 - 2)
- try:
- FilaActual = Filas[row+2]
- except:
- pass
- else:
- if Posicion + 16 + 1 <= FilaActual[1]:
- Grados += 1
- posiciones.append(Posicion + 16 + 1)
- if Posicion + 16 - 1 >= FilaActual[0]:
- Grados += 1
- posiciones.append(Posicion + 16 - 1)
- return Grados,posiciones
- Tablero = np.array([[ 1, 2, 3, 4, 5, 6, 7, 8],
- [ 9, 10, 11, 12, 13, 14, 15, 16],
- [17, 18, 19, 20, 21, 22, 23, 24],
- [25, 26, 27, 28, 29, 30, 31, 32],
- [33, 34, 35, 36, 37, 38, 39, 40],
- [41, 42, 43, 44, 45, 46, 47, 48],
- [49, 50, 51, 52, 53, 54, 55, 56],
- [57, 58, 59, 60, 61, 62, 63, 64]])
- # ***** Inicio aleatorio ********
- x = r.randint(0, 7) # Columna
- y = r.randint(0, 7) # Fila
- limitado=0
- PosicionCaballo = 1
- CasillasRecorridas=[]
- while True:
- Tablero[y, x] = PosicionCaballo # Marco la posición actual
- print(Tablero)
- print("Entro con: x= {} y = {}".format(x,y))
- if limitado == 400:
- break
- Grados, posiciones = grados(x, y) # Consigo los grados y las posiciones de ellos para la posición actual
- GradosLibertadSig=[] # Establezco una lista para almacenar los grados de libertad
- CoordenadasSig = [] # Lista para almacenar sus coordenadas
- for i in posiciones: # Hallo la posición con más grados
- Coordenadas = coordenadas(i) #Tengo las coordenadas de la posición
- GradosLibertadSig.append(grados(Coordenadas[0]-1, Coordenadas[1]-1)[0]) # Hallo los grados de libertad para esas coordenadas y lo pongo en una lista
- CoordenadasSig.append(Coordenadas)
- PosicionCaballo += 1
- m = max(GradosLibertadSig)
- CasillasMax = [i for i, j in enumerate(GradosLibertadSig) if j == m]
- if len(CasillasMax) > 1:
- restador=0
- while True:
- RandomSquare=r.randint(0,len(CasillasMax))
- x = CoordenadasSig[CasillasMax[RandomSquare-1]][0] - 1
- y = CoordenadasSig[CasillasMax[RandomSquare-1]][1] - 1
- if [x,y] not in CasillasRecorridas:
- CasillasRecorridas.append([x,y])
- break
- else:
- while True:
- CasillasMax.pop(8-restador)
- restador -= 1
- else:
- restador = 0
- while True:
- x = CoordenadasSig[CasillasMax[0]][0]-1
- y = CoordenadasSig[CasillasMax[0]][1]-1
- CasillasRecorridas.append([x, y])
- if [x,y] not in CasillasRecorridas:
- CasillasRecorridas.append([x,y])
- break
- else:
- CasillasMax.pop(8-restador)
- restador -= 1
- # break
- limitado = limitado + 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement