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))
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))
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))
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))
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
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
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))
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)
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
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
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