<commit_before>import time
import random
import os
import sys
class velha(object):
	melhor = {0:0,1:0,2:0,
			  3:0,4:0,5:0,
			  6:0,7:0,8:0,
			  -1:0}
	board = range(9)
	vic = [[0,1,2],
		   [3,4,5],
		   [6,7,8],

		   [0,3,6],
		   [1,4,7],
		   [2,5,8],

		   [0,4,8],
		   [6,4,2]]
	movimentos = []
	def __init__(self):
		self.clear()

	def clear(self):
		if (os.name in ('ce', 'nt', 'dos')):
			os.system('cls')

		# Clear the Linux terminal.
		elif ('posix' in os.name):
			os.system('clear')

		if len(sys.argv) > 1:
			if sys.argv[1] == 'debug':
				tam = len(str(self.melhor[0])+' | '+str(self.melhor[1])+' | '+str(self.melhor[2]))
				print str(self.melhor[0]),'|',str(self.melhor[1]),'|',str(self.melhor[2])
				print '-'*tam
				print str(self.melhor[3]),'|',str(self.melhor[4]),'|',str(self.melhor[5])
				print '-'*tam
				print str(self.melhor[6]),'|',str(self.melhor[7]),'|',str(self.melhor[8])
				print '*'*50

		for x in range(9):
			velha.melhor[x] = 0

	def reseta(self):
		for i in range(9):
			self.board[i] = '-'
		self.movimentos = []

	def venceu(self):
		for x in self.vic:
			if self.board[x[0]]==self.board[x[1]]==self.board[x[2]]=='O':
				return 'O'
			elif self.board[x[0]]==self.board[x[1]]==self.board[x[2]]=='X':
				return 'X'
		if len(self.livres(self.board)) == 0:
			return '-'
		return False

	def imprime(self,board):
		print ' | '.join(board[0:3])
		print '-'*10
		print ' | '.join(board[3:6])
		print '-'*10
		print ' | '.join(board[6:9])
		self.salva(' | '.join(board[0:3]))
		self.salva('-'*10)
		self.salva(' | '.join(board[3:6]))
		self.salva('-'*10)
		self.salva(' | '.join(board[6:9]))

	def move(self,board,pos,marca):
		if board[pos] == '-':
			board[pos] = marca
			self.movimentos.append(marca+':'+str(pos))
			return True
		else:
			return False

	def livres(self,atual):
		livre = []
		for x in range(9):
			if atual[x] == '-':
				livre.append(x)
		return livre

	def move_ai(self,marca,board):
		livre = self.livres(board)
		# oponente = 'O' if marca == 'X' else 'X'
		# mai_ganho = -1
		# men_perda = -1
		# for x in livre:
		# 	board[x] = marca
		# 	if self.vence(marca,board):
		# 		mai_ganho = x
		# 		break
		# 	else:
		# 		board[x] = '-'
		# for x in livre:
		# 	board[x] = oponente
		# 	if self.vence(oponente,board):
		# 		men_perda = x
		# 		board[x] = '-'
		# 		break
		# 	else:
		# 		board[x] = '-'
		# if mai_ganho > -1:
		# 	self.move(self.board,mai_ganho,marca)
		# 	self.salva('de ganho')
		# 	return mai_ganho
		# if mai_ganho == -1 and men_perda > -1:
		#  	self.move(self.board,men_perda,marca)
		#  	self.salva('de perda')
		#  	return men_perda

		# if len(livre) > 6:
		# 	melhores = []
		# 	nao_obrigado = [1,3,5,7]
		# 	for i in range(len(livre)):
		# 		if i not in nao_obrigado:
		# 			melhores.append(i)
		# 	movera = random.randint(0,len(melhores)-1)
		# 	self.move(self.board,melhores[movera],marca)
		# 	print 'de melhores'
		# 	return melhores[movera]
		# else:
		movemm = self.negamax(board,marca,len(livre))
		# if movemm > -1:
		melhormov = 0
		melhorpont = 0
		for x in range(9):
			if self.melhor[x] > melhorpont:
				melhorpont = self.melhor[x]
				melhormov = x
		if melhormov == 0: melhormov == movemm[1]
		self.move(self.board,melhormov,marca)
		self.salva('de negamax movimento '+str(self.desconverte(melhormov))+' pontos '+str(melhorpont))
		return melhormov
		# else:
		# 	moveremos = random.randint(0,len(livre)-1)
		# 	self.move(self.board,livre[moveremos],marca)
		# 	self.salva('de aleatorio')
		# 	return moveremos
	def negamax(self,board,marca,terminal):
		# definindo atual igual board
		atual = ['-' for x in range(9)]
		for i in range(9):
			atual[i] = board[i]
		moves = self.livres(atual) # pegando movimentos livres
		oponente = 'O' if marca == 'X' else 'X' # descobrindo oponente
		bestMove = -1 # guardara melhor movimento
		bestValue = -1 # guardara melhor valor
		value = -10
		if terminal == 0 or self.vence(marca,board): # retorna se for no terminal ou venceu
			if self.vence(marca,board): return 1,None
			if self.vence(oponente,board): return -1,None
			if len(moves) == 0 and not self.vence(marca,board) and not self.vence(oponente,board): return 0,None
		for move in moves: # verifica todos os movimentos
			atual[move] = marca # move para teste atual
			value = -self.negamax(atual,oponente,terminal-1)[0] # valor e igual ao negativo do valor do oponente
			if value > bestValue: # guarda o melhor valor
				bestValue = value
				bestMove = move
			atual[move] = '-'<commit_msg>adicionado verificaÃ§Ã£o para evitar que o computador tenha que executar todas as combinaÃ§Ãµes possÃ­veis para descobrir que jogar no centro tem mais chances para vencer<commit_after>import time
import random
import os
import sys
class velha(object):
	melhor = {0:0,1:0,2:0,
			  3:0,4:0,5:0,
			  6:0,7:0,8:0,
			  -1:0}
	board = range(9)
	vic = [[0,1,2],
		   [3,4,5],
		   [6,7,8],

		   [0,3,6],
		   [1,4,7],
		   [2,5,8],

		   [0,4,8],
		   [6,4,2]]
	movimentos = []
	def __init__(self):
		self.clear()

	def clear(self):
		if (os.name in ('ce', 'nt', 'dos')):
			os.system('cls')

		# Clear the Linux terminal.
		elif ('posix' in os.name):
			os.system('clear')

		if len(sys.argv) > 1:
			if sys.argv[1] == 'debug':
				tam = len(str(self.melhor[0])+' | '+str(self.melhor[1])+' | '+str(self.melhor[2]))
				print str(self.melhor[0]),'|',str(self.melhor[1]),'|',str(self.melhor[2])
				print '-'*tam
				print str(self.melhor[3]),'|',str(self.melhor[4]),'|',str(self.melhor[5])
				print '-'*tam
				print str(self.melhor[6]),'|',str(self.melhor[7]),'|',str(self.melhor[8])
				print '*'*50

		for x in range(9):
			velha.melhor[x] = 0

	def reseta(self):
		for i in range(9):
			self.board[i] = '-'
		self.movimentos = []

	def venceu(self):
		for x in self.vic:
			if self.board[x[0]]==self.board[x[1]]==self.board[x[2]]=='O':
				return 'O'
			elif self.board[x[0]]==self.board[x[1]]==self.board[x[2]]=='X':
				return 'X'
		if len(self.livres(self.board)) == 0:
			return '-'
		return False

	def imprime(self,board):
		print ' | '.join(board[0:3])
		print '-'*10
		print ' | '.join(board[3:6])
		print '-'*10
		print ' | '.join(board[6:9])
		self.salva(' | '.join(board[0:3]))
		self.salva('-'*10)
		self.salva(' | '.join(board[3:6]))
		self.salva('-'*10)
		self.salva(' | '.join(board[6:9]))

	def move(self,board,pos,marca):
		if board[pos] == '-':
			board[pos] = marca
			self.movimentos.append(marca+':'+str(pos))
			return True
		else:
			return False

	def livres(self,atual):
		livre = []
		for x in range(9):
			if atual[x] == '-':
				livre.append(x)
		return livre

	def move_ai(self,marca,board):
		livre = self.livres(board)
		oponente = 'O' if marca == 'X' else 'X'
		# mai_ganho = -1
		# men_perda = -1
		# for x in livre:
		# 	board[x] = marca
		# 	if self.vence(marca,board):
		# 		mai_ganho = x
		# 		break
		# 	else:
		# 		board[x] = '-'
		# for x in livre:
		# 	board[x] = oponente
		# 	if self.vence(oponente,board):
		# 		men_perda = x
		# 		board[x] = '-'
		# 		break
		# 	else:
		# 		board[x] = '-'
		# if mai_ganho > -1:
		# 	self.move(self.board,mai_ganho,marca)
		# 	self.salva('de ganho')
		# 	return mai_ganho
		# if mai_ganho == -1 and men_perda > -1:
		#  	self.move(self.board,men_perda,marca)
		#  	self.salva('de perda')
		#  	return men_perda

		# if len(livre) > 6:
		# 	melhores = []
		# 	nao_obrigado = [1,3,5,7]
		# 	for i in range(len(livre)):
		# 		if i not in nao_obrigado:
		# 			melhores.append(i)
		# 	movera = random.randint(0,len(melhores)-1)
		# 	self.move(self.board,melhores[movera],marca)
		# 	print 'de melhores'
		# 	return melhores[movera]
		# else:
		# if movemm > -1:
		if len(livre) == 9: # evita de ter que executar todas as jogadas
			self.move(self.board,4,marca) # para descobrir que no centro eh melhor jogada
			return 4
		centro = {0:1,2:5,6:3,8:7}
		melhormov = 0
		melhorpont = 0
		if len(livre) == 8:
			if board[0] == oponente or board[2] == oponente or board[6] == oponente or board[8] == oponente:
				if board[0] == oponente:
					self.move(self.board,centro[0],marca)
					return centro[0]
				if board[2] == oponente:
					self.move(self.board,centro[2],marca)
					return centro[2]
				if board[6] == oponente:
					self.move(self.board,centro[6],marca)
					return centro[6]
				if board[8] == oponente:
					self.move(self.board,centro[8],marca)
					return centro[8]
		if len(livre) == 1: 
			self.move(self.board,livre[0],marca)
			return livre[0]
		movemm = self.negamax(board,marca,len(livre))
		for x in range(9):
			if self.melhor[x] > melhorpont:
				melhorpont = self.melhor[x]
				melhormov = x
		if melhormov == 0: melhormov == movemm[1]
		self.move(self.board,melhormov,marca)
		self.salva('de negamax movimento '+str(self.desconverte(melhormov))+' pontos '+str(melhorpont))
		return melhormov
		# else:
		# 	moveremos = random.randint(0,len(livre)-1)
		# 	self.move(self.board,livre[moveremos],marca)
		# 	self.salva('de aleatorio')
		# 	return moveremos
	def negamax(self,board,marca,terminal):
		# definindo atual igual board
		oponente = 'O' if marca == 'X' else 'X' # descobrindo oponente
		atual = ['-' for x in range(9)]
		for i in range(9):
			atual[i] = board[i]
		moves = self.livres(atual) # pegando movimentos livres
		bestMove = -1 # guardara melhor movimento
		bestValue = -1 # guardara melhor valor
		value = -10
		if terminal == 0 or self.vence(marca,atual): # retorna se for no terminal ou venceu
			if self.vence(marca,atual): return 1,None
			if self.vence(oponente,atual): return -1,None
			if len(moves) == 0 and not self.vence(marca,atual) and not self.vence(oponente,atual): return 0,None
		for move in moves: # verifica todos os movimentos
			atual[move] = marca # move para teste atual
			value = -self.negamax(atual,oponente,terminal-1)[0] # valor e igual ao negativo do valor do oponente
			if value > bestValue: # guarda o melhor valor
				bestValue = value
				bestMove = move
			atual[move] = '-'
{'fraction_non_alphanumeric': 0.18237663645518631, 'fraction_numerical': 0.028298086606243705, 'mean_word_length': 3.31970421922575, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 17, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4948855', 'n_tokens_mistral': 4899, 'n_tokens_neox': 4387, 'n_words': 867}