Esempio n. 1
0
def valor_min(sting_tabuleiro, cor_jogador, cor_oponente, alfa, beta,
              profundidade):
    #a string_tabuleiro se refere ao tabuleiro
    #as variaveis cor_jogador e cor_oponente se referem respectivamente as cores de cada jogador
    #alfa e beta são as variaveis de corte
    #profundidade se refere a profundidade maxima a ser pesquisada
    tabuleiro = board.from_string(
        sting_tabuleiro)  #cria o tabuleiro a partir da string recebida
    if profundidade == 0:  #se chegou no maximo da profundidade
        return tabuleiro.piece_count[
            cor_jogador]  #retorna o número de peças da cor do jogador contidas no tabuleiro
    jogadas_possiveis = tabuleiro.legal_moves(
        cor_oponente)  #cria uma lista das jogadas possiveis para o oponente
    for i in jogadas_possiveis:  #verifica cada jogada possivel i
        tabuleiro = board.from_string(sting_tabuleiro)  #recria o tabuleiro
        tabuleiro.process_move(i, cor_oponente)  #faz a jogada i
        string_tabuleiro_novo = str(
            tabuleiro)  #cria uma string do tabuleiro após a jogada i
        v = valor_max(
            string_tabuleiro_novo, cor_jogador, cor_oponente, alfa, beta,
            (profundidade - 1),
            False)  #faz o max do novo tabuleiro com frofundidade redusida
        beta = min(beta, v)  #beta recebe o min entre beta e v
        print("a jogada min ", i, " retorna v = ", v, " e alfa = ", alfa,
              " e beta = ", beta, " e profundidade = ",
              profundidade)  #print para testes
        if alfa > beta:
            return beta  #retorna beta caso o mesmo seja menor que alfa
    return beta  #retorna beta
Esempio n. 2
0
def test_from_string():
    in_put = """012345678
                012345678
                012345678
                012345678
                012345678
                012345678
                012345678
                012345678
                012345678"""
    expected_out_put = [
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            0,1,2,3,4,5,6,7,8,
            ]
    act_op = board.from_string(in_put)
    assert len(act_op) == 9*9
    print(act_op)
    for yy, cell in enumerate(act_op):
        assert cell == expected_out_put[yy]
Esempio n. 3
0
def valor_max(sting_tabuleiro, cor_jogador, cor_oponente, alfa, beta,
              profundidade, primeiria):
    #a string_tabuleiro se refere ao tabuleiro
    #as variaveis cor_jogador e cor_oponente se referem respectivamente as cores de cada jogador
    #alfa e beta são as variaveis de corte
    #profundidade se refere a profundidade maxima a ser pesquisada
    #primeira é um booleano para saber se é o primeiro max, se é, retorna a jogada a ser feita em vez do valor alfa
    tabuleiro = board.from_string(
        sting_tabuleiro)  #cria o tabuleiro a partir da string recebida
    if profundidade == 0:  #se chegou no maximo da profundidade
        return tabuleiro.piece_count[
            cor_jogador]  #retorna o número de peças da cor do jogador contidas no tabuleiro
    jogadas_possiveis = tabuleiro.legal_moves(
        cor_jogador)  #cria uma lista das jogadas possiveis para o jogador
    jogada_a_retornar = (-1, -1
                         )  #cria a variavel para guardar a jogada a ser feita
    for i in jogadas_possiveis:  #verifica cada jogada possivel i
        tabuleiro = board.from_string(sting_tabuleiro)  #recria o tabuleiro
        tabuleiro.process_move(i, cor_jogador)  #faz a jogada i
        string_tabuleiro_novo = str(
            tabuleiro)  #cria uma string do tabuleiro após a jogada i
        v = valor_min(
            string_tabuleiro_novo, cor_jogador, cor_oponente, alfa, beta,
            (profundidade -
             1))  #faz o min do novo tabuleiro com frofundidade redusida
        #alfa = max(v, alfa)
        if v > alfa:  #caso o valor v seja maior que o valor alfa
            alfa = v  #alfa recebe v
            jogada_a_retornar = i  #a jogada a ser retornada passa a ser i
        print("a jogada max ", i, " retorna v = ", v, " e alfa = ", alfa,
              " e beta = ", beta, " e profundidade = ",
              profundidade)  #print para testes
        if beta < alfa:  #caso o beta seja menor que alfa
            if primeiria:
                return jogada_a_retornar  #retorna a jogada caso esse seja o primeiro max
            else:
                return alfa  #retorna o alfa caso esse não seja o primeiro max
    if primeiria:
        return jogada_a_retornar  #retorna a ultima jogada feita
    else:
        return alfa  #retorna alfa
Esempio n. 4
0
def test_allowable_at():
    b1 = '''023456789
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000'''
    b1 = board.from_string(b1)
    act_val = board.allowable_at(b1, 0, 0)
    print(act_val)
    assert act_val == set([1])

    b1 = '''023000000
            456000000
            789000000
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000'''
    b1 = board.from_string(b1)
    act_val = board.allowable_at(b1, 0, 0)
    print(act_val)
    assert act_val == set([1])

    b1 = '''923000000
            456000000
            780000000
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000'''
    b1 = board.from_string(b1)
    act_val = board.allowable_at(b1, 0, 0)
    print(act_val)
    assert act_val == set([9])

    b1 = '''923000000
            456000000
            780000000
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000'''
    b1 = board.from_string(b1)
    act_val = board.allowable_at(b1, 2, 2)
    print(act_val)
    assert act_val == set([1])

    b1 = '''000000000
            456000000
            780000000
            000000000
            000000000
            000000000
            000000000
            000000000
            000000000'''
    b1 = board.from_string(b1)
    act_val = board.allowable_at(b1, 2, 2)
    print(act_val)
    assert act_val == set([1,2,3,9])
Esempio n. 5
0
            tabuleiro)  #cria uma string do tabuleiro após a jogada i
        v = valor_max(
            string_tabuleiro_novo, cor_jogador, cor_oponente, alfa, beta,
            (profundidade - 1),
            False)  #faz o max do novo tabuleiro com frofundidade redusida
        beta = min(beta, v)  #beta recebe o min entre beta e v
        print("a jogada min ", i, " retorna v = ", v, " e alfa = ", alfa,
              " e beta = ", beta, " e profundidade = ",
              profundidade)  #print para testes
        if alfa > beta:
            return beta  #retorna beta caso o mesmo seja menor que alfa
    return beta  #retorna beta


tabuleiro_string = "........\n........\n........\n...WB...\n...BW...\n........\n........\n........"

tabuleiro_obj = board.from_string(
    tabuleiro_string)  #como construir um tabuleiro a partir de uma string
cor_jogador = tabuleiro_obj.WHITE
cor_oponente = tabuleiro_obj.BLACK
#tabuleiro_obj = board.Board()
#tabuleiro_obj.print_board()
#tabuleiro_obj.process_move((5, 3), tabuleiro_obj.WHITE) #como fazer uma jogada
#tabuleiro_obj.print_board()
#print(tabuleiro_obj.legal_moves(tabuleiro_obj.WHITE)) printa os movimentos permitidos as jogador branco

#valor_max(tabuleiro_string, tabuleiro_obj.WHITE, 0, 0, 0)
jogada = decisao_minimax(tabuleiro_string, cor_jogador, cor_oponente,
                         2)  #teste pra ver se a função funciona
print(jogada)
Esempio n. 6
0
			raise EOFError('sock closed {l} bytes into a {l2}-byte message'.format(l=len(data), l2 = length))
		data += more
	return data

def end_game(board, turn):
	if board.check_victory():
		print 'player',turn,'won'
		return True
	elif board.check_tie():
		print 'tie'
		return True
	else:
		return False

s.connect((HOST,PORT))
board = board.Board()
turn = board.turn

while True:
	print board
	input_var = raw_input(board.turn + " Enter [row, col]: ")
	if board.place_char(*[int(x.strip()) for x in input_var.split(',')]):
		print board
		s.sendall(board.to_string())
		turn = board.turn
		reply = recv_all(s,9)
		board.from_string(reply)
		if end_game(board, turn):
			print board
			break
s.close()