Example #1
0
def atualiza_ponto(ponto):
    prolog.consult('database.pl')
    pontuacao = list(prolog.query('pontuacao(P)'))
    if len(pontuacao) == 0:
        py_assert('database.pl', 'pontuacao(%s).' % (ponto))
        return False
    py_retract('database.pl', 'pontuacao(%s).' % (pontuacao[0].get('P')))
    pontos = pontuacao[0].get('P') + ponto
    py_assert('database.pl', 'pontuacao(%s).' % (pontos))
Example #2
0
def atualiza_energia(energia):
    prolog.consult('database.pl')
    energias = list(prolog.query('energia(E)'))
    if len(energias) == 0:
        py_assert('database.pl', 'energia(%s).' % (energia))
        return False
    py_retract('database.pl', 'energia(%s).' % (energias[0].get('E')))
    energia_nova = energias[0].get('E') + energia
    py_assert('database.pl', 'energia(%s).' % (energia_nova))
Example #3
0
def atualiza_municao(total):
    prolog.consult('database.pl')
    municao = list(prolog.query('municao(B)'))
    if len(municao) == 0:
        py_assert('database.pl', 'municao(0).')
        return False
    py_retract('database.pl', 'municao(%s).' % (municao[0].get('B')))
    total_novo = municao[0].get('B') + total
    py_assert('database.pl', 'municao(%s).' % (total_novo))
Example #4
0
def atualiza_estado(x, y):
    prolog.consult('database.pl')
    estado = list(prolog.query('estado(%s,%s, T)' % (x, y)))
    if len(estado) == 0:
        py_assert('database.pl', 'estado(%s,%s,1).' % (x, y))
        return False
    py_retract('database.pl', 'estado(%s,%s,%s).' % (x, y, estado[0].get('T')))
    py_assert('database.pl',
              'estado(%s,%s,%s).' % (x, y, int(estado[0].get('T')) + 1))
Example #5
0
def munda_local_arqueiro(x, y, xx, yy, direcao):
    if (not detecta_parede(xx, yy)):
        py_retract('database.pl', "local_arqueiro")
        print 'retract de local_arqueiro(_,_,_)'
        py_assert('database.pl',
                  "local_arqueiro(%s,%s,%s)." % (xx, yy, direcao))
        print 'assert de local_arqueiro(%s,%s,%s)' % (xx, yy, direcao)
        prolog.consult('database.pl')
        if ((len(list(prolog.query("visitadas(%s,%s)" % (xx, yy))))) == 0):
            py_assert('database.pl', "visitadas(%s,%s)." % (xx, yy))
            print 'assert de visitadas(%s,%s)' % (xx, yy)
        descobre_parede_adjacente(xx, yy)
        return True
    return False
Example #6
0
def faz_dano(x, y, dano):
    prolog.consult('check.pl')
    inimigo = list(prolog.query('inimigo(D,V,%s,%s)' % (x, y)))
    vida_inimigo = inimigo[0].get('V') - dano
    #print vida_inimigo
    py_retract(
        'check.pl', 'inimigo(%s,%s,%s,%s).' %
        (inimigo[0].get('D'), inimigo[0].get('V'), x, y))
    if vida_inimigo <= 0:
        py_assert('database.pl', 'inimigo_grito(%s,%s)' % (x, y))
        py_assert('database.pl', 'seguro(%s,%s)' % (x, y))
        py_assert('database.pl', 'visitadas(%s,%s)' % (x, y))
        return True
    print 'inimigo(%s,%s,%s,%s).' % (inimigo[0].get('D'), vida_inimigo, x,
                                     y), '\ntem_inimigo(%s,%s).' % (x, y)
    py_assert(
        'check.pl',
        'inimigo(%s,%s,%s,%s).' % (inimigo[0].get('D'), vida_inimigo, x, y))
    py_retract('database.pl', 'tem_inimigo(%s,%s).' % (x, y))
    py_assert('database.pl', 'tem_inimigo(%s,%s).' % (x, y))
    return False
Example #7
0
def assert_pode_ter_poco(x, y):
    prolog.consult('database.pl')
    if prolog.query("seguro(%s, %s)" % (x + 1, y)) != {}:
        #print 'Entrei'
        py_assert('database.pl', "pode_ter_poco(%s,%s)." % (x + 1, y))
    if prolog.query("seguro(%s, %s)" % (x - 1, y)) != {}:
        #print 'Entrei'
        py_assert('database.pl', "pode_ter_poco(%s,%s)." % (x - 1, y))
    if prolog.query("seguro(%s, %s)" % (x, y + 1)) != {}:
        #print 'Entrei'
        py_assert('database.pl', "pode_ter_poco(%s,%s)." % (x, y + 1))
    if prolog.query("seguro(%s, %s)" % (x, y - 1)) != {}:
        #print 'Entrei'
        py_assert('database.pl', "pode_ter_poco(%s,%s)." % (x, y - 1))
Example #8
0
def main():
    cont = 0
    cont_ouro = 0
    while (cont_ouro < 3):
        sleep(1)
        #if cont > 150:
        #return
        prolog.consult('database.pl')
        pontuacao = list(prolog.query('pontuacao(P)'))
        energia = list(prolog.query('energia(E)'))
        if len(energia) == 0:
            print 'lista energia vazia'
            break
        #elif len(pontuacao) == 0:
        #print 'lista pontuacao vazia'
        #break
        #if(pontuacao[0].get('P') < 0):
        #return False
        if (energia[0].get('E') < 0):
            print 'Arqueiro morreu'
            atualiza_ponto(-1000)
            break
        print_tabuleiro(preenche_tabuleiro())
        if arqueiro_anda(cont_ouro) == True:
            x, y, direcao = acha_coordenada_arqueiro()
            atualiza_estado(x, y)
            decide_se_atira(extrai_estado(x, y))
            caiu_poco()
            inimigo_dano()
            if pega_ouro() == True:
                cont_ouro = cont_ouro + 1
                py_assert('database.pl', "tinha_ouro(%s,%s)." % (x, y))
                print 'assert tem_ouro(%s,%s)' % (x, y)
            print 'pontuacao atual:', pontuacao[0].get('P')
            print '\n' * 5
        #cont = cont + 1

    xn, yn, direcaonova = acha_coordenada_arqueiro()
    volta_casa(xn, yn, direcaonova)
Example #9
0
def descobre_parede_adjacente(x, y):
    if (x == 1):
        if (len(list(prolog.query("parede(%s,%s)" % (x - 1, y)))) < 1):
            py_assert('database.pl', "parede(%s, %s)." % (x - 1, y))
            print 'faz o assert parede(%s, %s)' % (x - 1, y)
    elif (x == 12):
        if (len(list(prolog.query("parede(%s,%s)" % (x + 1, y)))) < 1):
            py_assert('database.pl', "parede(%s, %s)." % (x + 1, y))
            print 'faz o assert parede(%s, %s)' % (x + 1, y)
    if (y == 1):
        if (len(list(prolog.query("parede(%s,%s)" % (x, y - 1)))) < 1):
            py_assert('database.pl', "parede(%s,%s)." % (x, y - 1))
            print 'faz o assert parede(%s, %s)' % (x, y - 1)
    elif (y == 12):
        if (len(list(prolog.query("parede(%s,%s)" % (x, y + 1)))) < 1):
            py_assert('database.pl', "parede(%s,%s)." % (x, y + 1))
            print 'faz o assert parede(%s, %s)' % (x, y + 1)
    return True
Example #10
0
def volta_casa(x, y, direcao):
    prolog.consult('database.pl')
    print 'x = ', x, ' y = ', y, 'direcao = ', direcao
    print_tabuleiro(preenche_tabuleiro())
    while (x > 1 and y > 1):
        prolog.consult('database.pl')
        print_tabuleiro(preenche_tabuleiro())
        if (x > y):
            print 'faz query de seguro adjacentes em ordem de norte, oeste, sul ,leste'
            if (len(list(prolog.query("seguro(%s,%s)" % (x - 1, y)))) > 0):
                if (direcao == 'sul'):
                    atualiza_ponto(-2)
                elif ((direcao == 'oeste') or (direcao == 'leste')):
                    atualiza_ponto(-1)
                direcao = 'norte'
                if munda_local_arqueiro(x, y, x - 1, y, direcao):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x - 1, y))
                    print 'faz assert passou_voltando(%s,%s)' % (x - 1, y)
                    x = x - 1

            elif ((len(list(prolog.query("seguro(%s,%s)" % (x, y - 1)))) > 0)):
                if ((direcao == 'norte') or (direcao == 'sul')):
                    atualiza_ponto(-1)
                elif (direcao == 'leste'):
                    atualiza_ponto(-2)
                direcao == 'oeste'
                if (munda_local_arqueiro(x, y, x, y - 1, direcao)):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x, y - 1))
                    print 'faz o assert passou_voltando(%s,%s)' % (x, y - 1)
                    y = y - 1

            elif (len(list(prolog.query("seguro(%s,%s)" % (x + 1, y)))) > 0):
                if (direcao == 'norte'):
                    atualiza_ponto(-2)
                elif ((direcao == 'oeste') or (direcao == 'leste')):
                    atualiza_ponto(-1)
                direcao = 'sul'
                if (munda_local_arqueiro(x, y, x + 1, y, direcao)):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x + 1, y))
                    print 'faz o assert passou_voltando(%s,%s)' % (x + 1, y)
                    x = x + 1

            elif (len(list(prolog.query("seguro(%s,%s)" % (x, y + 1)))) > 0):
                if ((direcao == 'norte') or (direcao == 'sul')):
                    atualiza_ponto(-1)
                elif direcao == 'oeste':
                    atualiza_ponto(-2)
                direcao = 'leste'
                if (munda_local_arqueiro(x, y, x, y + 1, direcao)):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x, y + 1))
                    print 'faz o assert passou_voltando(%s,%s)' % (x, y + 1)
                    y = y + 1

        elif (x <= y):
            if (len(list(prolog.query("seguro(%s,%s)" % (x, y - 1)))) > 0):
                if ((direcao == 'norte') or (direcao == 'sul')):
                    atualiza_ponto(-1)
                elif (direcao == 'leste'):
                    atualiza_ponto(-2)
                direcao == 'oeste'
                if (munda_local_arqueiro(x, y, x, y - 1, direcao)):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x, y - 1))
                    print 'faz o assert passou_voltando(%s,%s)' % (x, y - 1)
                    y = y - 1

            elif (len(list(prolog.query("seguro(%s,%s)" % (x - 1, y)))) > 0):
                if (direcao == 'sul'):
                    atualiza_ponto(-2)
                elif ((direcao == 'oeste') or (direcao == 'leste')):
                    atualiza_ponto(-1)
                direcao = 'norte'
                if munda_local_arqueiro(x, y, x - 1, y, direcao):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x - 1, y))
                    print 'faz o assert passou_voltando(%s,%s)' % (x - 1, y)
                    x = x - 1

            elif (len(list(prolog.query("seguro(%s,%s)" % (x, y + 1)))) > 0):
                if ((direcao == 'norte') or (direcao == 'sul')):
                    atualiza_ponto(-1)
                elif direcao == 'oeste':
                    atualiza_ponto(-2)
                direcao = 'leste'
                if (munda_local_arqueiro(x, y, x, y + 1, direcao)):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x, y + 1))
                    print 'faz o assert passou_voltando(%s,%s)' % (x, y + 1)
                    y = y + 1

            elif (len(list(prolog.query("seguro(%s,%s)" % (x + 1, y)))) > 0):
                if (direcao == 'norte'):
                    atualiza_ponto(-2)
                elif ((direcao == 'oeste') or (direcao == 'leste')):
                    atualiza_ponto(-1)
                direcao = 'sul'
                if (munda_local_arqueiro(x, y, x + 1, y, direcao)):
                    atualiza_ponto(-1)
                    py_assert('database.pl',
                              "passou_voltando(%s,%s)." % (x + 1, y))
                    print 'faz o assert passou_voltando(%s,%s)' % (x + 1, y)
                    x = x + 1

    prolog.consult('database.pl')
    print_tabuleiro(preenche_tabuleiro())
    #print 'saiu xddddddddddddddddddddddddddddddddddddddddddddddddddd'
    return
Example #11
0
def arqueiro_anda(cont_ouro):
    rand_direcao = 1
    tentou_andar = 0
    #max_repeticao = 4
    cont_repeticao = 0

    x, y, direcao = acha_coordenada_arqueiro()
    #print list(prolog.query("seguro(2,1)")), "(2,1) seguro acho"
    #print list(prolog.query("seguro(1,2)")) , "(1,2) seguro acho"
    percepcao, sentiu_brisa, sentiu_fedor, sentiu_brilho = faz_percepcao()
    if percepcao == False:

        #print 'Faz os devidos asserts'
        #ADJACENTES SÃO SEGUROS PARA ANDAR DESDE QUE NÃO SEJAM PAREDE
        if (not detecta_parede(x + 1, y)):
            if (len(list(prolog.query("seguro(%s,%s)" % (x + 1, y)))) < 1):
                py_assert('database.pl', "seguro(%s,%s)." % (x + 1, y))
                print 'assert de seguro(%s,%s)' % (x + 1, y)

        if (not detecta_parede(x - 1, y)):
            if (len(list(prolog.query("seguro(%s,%s)" % (x - 1, y)))) < 1):
                py_assert('database.pl', "seguro(%s,%s)." % (x - 1, y))
                print 'assert de seguro(%s,%s)' % (x - 1, y)

        if (not detecta_parede(x, y + 1)):
            if (len(list(prolog.query("seguro(%s,%s)" % (x, y + 1)))) < 1):
                py_assert('database.pl', "seguro(%s,%s)." % (x, y + 1))
                print 'assert de seguro(%s,%s)' % (x, y + 1)

        if (not detecta_parede(x, y - 1)):
            if (len(list(prolog.query("seguro(%s,%s)" % (x, y - 1)))) < 1):
                py_assert('database.pl', "seguro(%s,%s)." % (x, y - 1))
                print 'assert de seguro(%s,%s)' % (x, y - 1)

    else:
        if sentiu_brisa:
            #print 'entrei no if da brisa'
            #sleep(1)
            if (len(list(prolog.query("sentiu_brisa(%s,%s)" % (x, y)))) < 1):

                py_assert('database.pl', "sentiu_brisa(%s,%s)." % (x, y))
                print 'assert de sentiu_brisa(%s,%s)' % (x, y)
                #sleep(1)
        if sentiu_fedor:
            print 'entrei no if do fedor'
            #sleep(1)
            prolog.query("muda_estado(%s,%s)" % (x, y))
            print list(prolog.query('estado(%s,%s,X)' % (x, y)))
            if (len(list(prolog.query("sentiu_fedor_in(%s,%s)" %
                                      (x, y)))) < 1):
                py_assert('database.pl', "sentiu_fedor_in(%s,%s)." % (x, y))
                print 'assert de sentiu_fedor_in(%s,%s)' % (x, y)
                #print 'sentiu fedor'
                #sleep(1)

    turn = 0
    while (True):

        #print x,'   ', y,  'sao as coord' , direcao , 'é a direcao'
        #if cont_repeticao >= max_repeticao:
        #return 'Repeticao maxima'
        #elif tentou_andar > 3:
        #return 'Sai tentando andar'
        prolog.consult('database.pl')
        prolog.consult('check.pl')
        #print list(prolog.query("adjacente(1,2, X,Y)"))
        #print list(prolog.query("seguro(X,Y)")), 'lista segura'
        #print list(prolog.query("explorar(1,Y)")), 'explora'
        if (direcao == 'norte'):  #checka a direção
            if (len(list(prolog.query("seguro(%s,%s)" % (x - 1, y)))) >
                    0):  #ve se é seguro andar para a direção
                if (len(list(prolog.query("visitadas(%s,%s)" % (x - 1, y)))) >
                        0):  #checka se já visitou o local em que  tenta andar
                    turn = turn + 1  #CASO SIM ELE GIRA
                    print 'ja passei aqui norte', turn
                    '''
                        /\ tenta andar -> já visitou /\   turn +1 = 1
                        < tenta anda -> já visitou/dangerous < turn +1 =2
                        \/ tenta anda -> já visitou/dangerous \/ turn +1 =3
                        > tenta anda -> ja visitou/dangerous > turn+1 = 4
                        /\ >>>>>>>>>>>> 5 TEM QUE IR
                    '''
                    if turn > random.randint(2, 4):  #
                        if munda_local_arqueiro(x, y, x - 1, y,
                                                direcao) == True:
                            tentou_andar = 0
                            turn = 0
                            #print'andou norte depois de girar peão do baú\n'
                            atualiza_ponto(-1)
                            return True
                    else:
                        rand_direcao = random.randint(1, 2)
                        if rand_direcao == 1:
                            #print'virou oeste', turn
                            atualiza_ponto(-1)
                            direcao = 'oeste'  #arqueiro_anda(x,y,'oeste')
                        else:
                            #print'virou leste', turn
                            atualiza_ponto(-1)
                            direcao = 'leste'  #arqueiro_anda(x,y,'leste')
                else:
                    if munda_local_arqueiro(x, y, x - 1, y, direcao) == True:
                        tentou_andar = 0
                        turn = 0
                        #print  turn ,'andou norte\n'
                        atualiza_ponto(-1)
                        return True
            else:
                rand_direcao = random.randint(1, 2)
                tentou_andar = tentou_andar + 1
                if rand_direcao == 1:
                    #print'virou oeste', turn+1
                    turn = turn + 1
                    atualiza_ponto(-1)
                    direcao = 'oeste'  #arqueiro_anda(x,y,'oeste')
                else:
                    #print'virou leste', turn+1
                    turn = turn + 1
                    atualiza_ponto(-1)
                    direcao = 'leste'  #arqueiro_anda(x,y,'leste')

        elif (direcao == 'sul'):
            print 'query de se é seguro(%s,%s)' % (x + 1, y)
            if (len(list(prolog.query("seguro(%s,%s)" % (x + 1, y)))) > 0):
                print 'query de visitadas(%s,%s)' % (x + 1, y)
                if (len(list(prolog.query("visitadas(%s,%s)" %
                                          (x + 1, y)))) > 0):
                    #print 'ja passei aqui sul' , turn
                    turn = turn + 1
                    if turn > random.randint(2, 4):
                        if munda_local_arqueiro(x, y, x + 1, y,
                                                direcao) == True:
                            tentou_andar = 0
                            #print'andou sul depois de girar peão do baú\n'
                            atualiza_ponto(-1)
                            return True
                    else:
                        rand_direcao = random.randint(1, 2)
                        if rand_direcao == 1:
                            #print'virou leste', turn
                            atualiza_ponto(-1)
                            direcao = 'leste'  #arqueiro_anda(x,y,'leste')
                        else:
                            #print 'virou oeste', turn
                            direcao = 'oeste'  #arqueiro_anda(x,y,'oeste')
                            atualiza_ponto(-1)

                else:
                    if munda_local_arqueiro(x, y, x + 1, y, direcao) == True:
                        tentou_andar = 0
                        turn = 0
                        #print'andou sul\n'
                        atualiza_ponto(-1)
                        return True

            else:
                rand_direcao = random.randint(1, 2)
                if rand_direcao == 1:
                    #print'virou leste', turn+1
                    turn = turn + 1
                    direcao = 'leste'  #arqueiro_anda(x,y, 'leste')
                    atualiza_ponto(-1)
                    tentou_andar = tentou_andar + 1
                else:
                    #print'virou oeste', turn+1
                    turn = turn + 1
                    direcao = 'oeste'  #arqueiro_anda(x,y, 'leste')
                    atualiza_ponto(-1)
                    tentou_andar = tentou_andar + 1

        elif (direcao == 'leste'):
            print 'query de seguro(%s,%s)' % (x, y + 1)
            if (len(list(prolog.query("seguro(%s,%s)" % (x, y + 1)))) > 0):
                print 'query de visitadas(%s,%s)' % (x, y + 1)
                if (len(list(prolog.query("visitadas(%s,%s)" %
                                          (x, y + 1)))) > 0):
                    print 'ja passei aqui leste', turn
                    turn = turn + 1
                    if turn > random.randint(2, 4):
                        if munda_local_arqueiro(x, y, x, y + 1,
                                                direcao) == True:
                            tentou_andar = 0
                            turn = 0
                            #print'andou leste depois de girar peão do baú\n'
                            atualiza_ponto(-1)
                            return True
                    else:
                        rand_direcao = random.randint(1, 2)
                        if rand_direcao == 1:
                            #print 'virou norte', turn
                            atualiza_ponto(-1)
                            direcao = 'norte'
                        else:
                            #print 'virou sul', turn
                            atualiza_ponto(-1)
                            direcao = 'sul'

                else:
                    if munda_local_arqueiro(x, y, x, y + 1, direcao) == True:
                        tentou_andar = 0
                        turn = 0
                        atualiza_ponto(-1)
                        #print'andou leste\n'
                        return True

            else:
                rand_direcao = random.randint(1, 2)
                if rand_direcao == 1:
                    #print'virou norte', turn+1
                    turn = turn + 1
                    atualiza_ponto(-1)
                    direcao = 'norte'  #arqueiro_anda(x,y,'norte')
                    tentou_andar = tentou_andar + 1
                else:
                    #print'virou sul', turn+1
                    turn = turn + 1
                    atualiza_ponto(-1)
                    direcao = 'sul'  #arqueiro_anda(x,y,'norte')
                    tentou_andar = tentou_andar + 1

        elif (direcao == 'oeste'):
            if (len(list(prolog.query("seguro(%s,%s)" % (x, y - 1)))) > 0):
                if (len(list(prolog.query("visitadas(%s,%s)" %
                                          (x, y - 1)))) > 0):
                    #print 'ja passei aqui oeste' , turn
                    turn = turn + 1
                    if turn > random.randint(2, 4):
                        if munda_local_arqueiro(x, y, x, y - 1,
                                                direcao) == True:
                            tentou_andar = 0
                            turn = 0
                            #print'andou oeste'
                            atualiza_ponto(-1)
                            #print '\n'
                            return True
                    else:
                        rand_direcao = random.randint(1, 2)
                        if rand_direcao == 1:
                            #print 'virou sul'
                            direcao = 'sul'
                            atualiza_ponto(-1)
                        else:
                            #print 'virou norte'
                            atualiza_ponto(-1)
                            direcao = 'norte'
                else:
                    if munda_local_arqueiro(x, y, x, y - 1, direcao) == True:
                        tentou_andar = 0
                        turn = 0
                        #print'andou oeste'
                        atualiza_ponto(-1)
                        #print '\n'
                        return True
            else:
                rand_direcao = random.randint(1, 2)
                if rand_direcao == 1:
                    #print'virou sul', turn+1
                    turn = turn + 1
                    direcao = 'sul'  #arqueiro_anda(x,y,'sul')
                    atualiza_ponto(-1)
                    tentou_andar = tentou_andar + 1
                else:
                    #print'virou norte', turn+1
                    turn = turn + 1
                    direcao = 'norte'  #arqueiro_anda(x,y,'sul')
                    atualiza_ponto(-1)
                    tentou_andar = tentou_andar + 1
        #print 'SEI LA MANO TA MT LOCO\n'
        cont_repeticao = cont_repeticao + 1