osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Minmax tictactoe :c Cannot understand why this does not work


You need a good lesson in "program documentation". Your code 
looks terrible--really!


fifii.geral at gmail.com wrote:
> 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"
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
>