Minmax tictactoe :c Cannot understand why this does not work

fifii.geral at gmail.com fifii.geral at gmail.com
Tue Apr 24 18:57:53 EDT 2018


class AiMove:
	def __init__(self):
		self.x = -1
		self.y=-1
		self.score = 0


def Imprimir(Matriz,n):
	for i in range(n):
		linea ="|"
		for j in range(n):
			if (Matriz[i][j] == 0):
				linea+=" "
			elif (Matriz[i][j]==- 1):
				linea+="X"
			elif (Matriz[i][j]== 1):
				linea+="O"
			linea+="|"
		print linea		

		print "---------"

def Gameover(Matriz,n):
	#Condicion tablero lleno
	blancos=0;
	for i in range(n):
		contJfilas = 0
		contCfilas = 0
		contJcol = 0
		contCcol = 0
		for j in range(n):
			if(Matriz[i][j]==0):
				blancos = blancos + 1
			if (Matriz[i][j]==1):
				contCfilas= contCfilas+1
			elif(Matriz[i][j]==-1):
				contJfilas = contJfilas +1
			if (Matriz[j][i]==1):
				contCcol= contCcol +1
			elif (Matriz[j][i]==-1):
				contJcol= contJcol +1
		#Condicion 3 en raya en fila o 3 en raya columna
		if (contJcol==3 or contJfilas ==3):
			return -1
		elif (contCfilas==3 or contCcol ==3):
			return 1
	if blancos == 16:
		return 2
	else:
		return 0

def getMejorM(Matriz, player,n):
	rv = Gameover(Matriz,n)
	if(rv== 1):
		a = AiMove()
		a.score = 10
		return a 
	elif rv==-1:
		a = AiMove()
		a.score = -10
		return a 

	elif rv ==2: #Si es empate
		a = AiMove()
		return a 

	movimientos = []
	for i in range (n):
		for j in range (n):
			if(Matriz[i][j] == 0):
				movimiento = AiMove()
				movimiento.x = i
				movimiento.y = j
				Matriz[i][j] = player
				if (player == 1):
					movimiento.score = getMejorM(Matriz, -1,n).score
				else:
					movimiento.score = getMejorM(Matriz, 1,n).score
				movimientos.append(movimiento)
				Matriz[i][j] = 0
	
	#Escoger
	auxb = 0
	if player==1:
		mejorscore = -100000
		for i in range (len(movimientos)):
			if movimientos[i].score > mejorscore:
				auxb= i
				mejorscore = movimientos[i].score
	
	elif player==-1:
		peorscore = 100000
		for i in range (len(movimientos)):
			if movimientos[i].score < peorscore:
				auxb= i
				peorscore = movimientos[i].score

	#Retornar el mejor movimiento
	return movimientos[auxb]



n=4
Matriz = [[0 for i in range(n)] for j in range(n)] 
for i in range(n):
	for j in range(n):
		Matriz[i][j] = 0
Imprimir(Matriz,n)
while True:
	fila = int(raw_input("Ingresa casilla x: "))-1
	columna = int(raw_input("Ingresa casilla y: "))-1
	if (Matriz[fila][columna] == 0):
		Matriz[fila][columna] = -1
	#Mover(Matriz,n)
	Imprimir(Matriz,n)
	bestM = AiMove()
	bestM = getMejorM(Matriz, 1, n)
	Matriz[bestM.x][bestM.y] = 1
	Imprimir(Matriz,n)
	if Gameover(Matriz,n) != 0:
		break

print "FIN"





















More information about the Python-list mailing list