Jump to content
Notícia
  • Junte-se ao clube de Membros VIP e desfrute benefícios

Search the Community

Showing results for tags 'web'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Anunciantes
    • Advertise here
    • silvaBR Cheats
    • Astaroth Medium
  • ################## WEB CHEATS ##################
  • Anúncios/Eventos
    • Regras
    • Anúncios
    • Eventos do fórum
  • Feedback & Suporte
    • Tutoriais WC
    • Suporte
    • Sugestões
    • Denúncias e Reclamações
    • Depósito
  • WebCheats Premium
    • Trackers & Warez
    • Download
    • Cracking & Serviços Pagos
    • MarketPlace
    • Conteúdo Adulto
    • Taverna WebCheats Premium
    • WebCheats Premium - Lixeira
  • Shooter Zone
  • RPG/MOBA Zone
  • Outros Games Zone
  • Design Zone
  • Info Zone
  • Video Games Zone
  • ################## WEB CHEATS ##################
  • Entretenimento & Diversão
  • 【FREE FIRE】▄︻┻┳═一's Fórum do Clube
  • teste's Tópicos

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me


Discord

Found 7 results

  1. Fala Galera beleza hoje veio compartilhar com vocês mais uma Fan Game. Mega Man VS Super Mario uma lenda [DEMO] Jogue com o famoso Mega Man no mundo do Super Mario enfrentando diversos inimigos e Objetivos diferentes. Controles Mover,Pular use as setas direcionais do teclado para se mover ou as teclas W,A,D Esppecial Tecla C, Contem 3 Especiais diferentes Correr ou voar no alto, Aperte rapidamente seta para tras ou para frente ou A,D Ataque Tecla Z Mantesnha pressionado a Tecla Z para super ataque Pausar jogo Tecla Enter o jogo tem suporte para GamePad, voce pode jogar com controle PS2USB,Will,Xbox etc... Tela Cheia Teclas Q,E o projeto esta em desenvolvimento por enquanto contem 2 Leveis diferentes 1 Level com Objetivo e o outro contra o Boss. Bora Jogar https://gamejolt.com/games/MEGAMANVSUPERMARIO/438019 Video demonstração https://www.youtube.com/watch?v=iF4m7zuUmb0
  2. Este é meu novo jogo que estou desenvolvendo "Altered Beast" um jogo de aventura,plataforma e ação, conta a historia de uma garota filha de Zeus que é sequestrada por um feiticeiro chamado Neff,então Zeus te da a vida e a missão de resgata lá, no caminho você terá muitos desafios. As versões para jogar serão para Web online,Celular,Windows,Mac,Linux Este é um projeto do Altered Beast Fan game para quem curte o jogo se gostou deixa o Like e compartilhem com seus amigos. Comandos Ataque com as Teclas, Z e X Pule com a Tecla, Seta direcional pra cima Especial com a Tecla, A Modos para jogar Versão Classica do jogo Editada Modo Alterado Hardest. A ja esta pronto para jogar na versão "Clássica" lembrando que não é o fim ainda falta muita coisa pretendo adicionar outros modos para jogar tipo "Batalha" onde você vai duelar com mestres épicos que se encontram no jogo e outros diferentes alem é claro de novo modo com leveis diferentes, o jogo esta na GameJolt você pode jogar uma dica se você estiver logado la o seu score ficara visível para todos, lembrando pessoal esta é a versão para jogar online as outras versões que prometi para PC,Celular,Mac.Linux postarei quando terminar todo o desenvolvimento do jogo por causa que minha net não é muito boa pra upar os arquivos, o projeto é recente caso encontrem algum bug por favor me avise para consertar. se gostar do jogo pessoal deixa o like e segue o jogo me ajuda muito Bora jogar Online https://gamejolt.com...tFanGame/398234
  3. Fala ai galera, blz? Encontrei este tutorial bacana, porem está em ingles e traduzir com o google pra ficar mais fácil a leitura. No final do post terá o link com o artigo original em ingles. Obrigado! Como construir um Bot em Python que pode jogar jogos na Web Neste tutorial, exploraremos os prós e contras da construção de um jogo de jogo baseado em computador em Python, que poderá jogar o popular jogo Flash Sushi Go Round. Você pode usar as técnicas ensinadas neste tutorial para criar bots para testar automaticamente seus próprios jogos na web. Pré-visualização final do resultado Vamos dar uma olhada no resultado final em que estaremos trabalhando: Pré-requisitos Este tutorial e todo o código nele requer que algumas bibliotecas Python adicionais sejam instaladas. Eles fornecem um bom pacote de Python para um monte de código C de baixo nível que facilita muito o processo e a velocidade do script do bot. Alguns dos códigos e bibliotecas são específicos do Windows. Pode haver equivalentes de Mac ou Linux, mas não iremos cobri-los neste tutorial. Você precisará baixar e instalar as seguintes bibliotecas: The Python Imaging Library Numpy PyWin Todos os itens acima possuem auto instaladores; Executá-los instalará automaticamente os módulos em seu diretório \ lib \ site-packages e, em teoria, ajustará seu pythonPath de acordo. No entanto, na prática, isso nem sempre acontece. Se você começar a receber mensagens de erro de importação após a instalação, provavelmente você precisará ajustar manualmente suas variáveis de ambiente. Mais informações sobre como ajustar variáveis de caminho podem ser encontradas aqui. A ferramenta final que precisaremos é um programa de pintura decente. Sugiro Paint.NET como uma excelente opção gratuita, mas qualquer programa com regras que exibem suas medidas em pixels pode ser usado. Usaremos alguns jogos como exemplos ao longo do caminho. Introdução Este tutorial é escrito para dar uma introdução básica ao processo de construção de bots que jogam jogos baseados no navegador. A abordagem que vamos tomar é provavelmente um pouco diferente do que a maioria esperaria quando pensasse em um bot. Ao invés de fazer um programa que fica entre o cliente e o código de injeção do servidor (como um botão Quake ou C / S), nosso bot se sentará puramente no "exterior". Nós confiamos nas técnicas de Visão de Computador e nas chamadas da API do Windows para reunir informações necessárias e gerar movimentos. Com essa abordagem, perdemos um pouco de detalhes refinados e controle, mas compensamos isso em tempo de desenvolvimento reduzido e facilidade de uso. A automação de uma função de jogo específica pode ser feita em algumas linhas curtas de código, e um botão de início a término (para um jogo simples) pode ser ativado em algumas horas. As alegrias desta abordagem rápida são tais que, uma vez que você se familiarize com o que o computador pode facilmente "ver", você começará a ver os jogos de forma ligeiramente diferente. Um bom exemplo é encontrado em jogos de quebra-cabeças. Uma construção comum envolve a exploração de limitações de velocidade humana para forçá-lo a uma solução menos do que ideal. É divertido (e muito fácil) "quebrar" esses jogos através de scripts em movimentos que nunca poderiam ser realizados por um ser humano. Esses bots também são muito úteis para testar jogos simples - ao contrário de um ser humano, um bot não ficará entediado jogando o mesmo cenário uma e outra vez. O código-fonte para todos os exemplos do tutorial, bem como para um dos bots de exemplo concluídos, pode ser encontrado aqui. Diverta-se! Passo 1: Criar um novo projeto Python Em uma nova pasta, clique com o botão direito do mouse e selecione Novo> Documento de texto. Uma vez feito, mude o nome do arquivo 'Novo documento de texto' para 'quickGrab.py' (sem as aspas) e confirme que deseja alterar a extensão do nome do arquivo. Finalmente, clique com o botão direito do mouse no nosso arquivo recém-criado e selecione "Editar com IDLE" no menu de contexto para iniciar o editor Etapa 2: Configurando o seu primeiro captador de tela Começaremos a trabalhar no nosso bot, explorando a função básica de captura de tela. Uma vez em funcionamento, passaremos por linha por linha, pois esta função (e suas muitas iterações) servirá como espinha dorsal do nosso código. Em quickgrab.py, digite o seguinte código: <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import ImageGrab</span> Import ImageGrab</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import os</span> importar os</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import time</span> tempo de importação</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def screenGrab():</span> def screenGrab ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">box = ()</span> caixa = ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im = ImageGrab.grab()</span> im = ImageGrab.grab ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) +</span> im.save (os.getcwd () + '\\ full_snap__' + str (int (time.time ())) +</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">'.png', 'PNG')</span> '.png', 'PNG')</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def main():</span> def main ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">screenGrab()</span> captura de tela()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if __name__ == '__main__':</span> se __name__ == '__main__':</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">main()</span> a Principal()</span> A execução deste programa deve dar-lhe um instantâneo completo da área da tela: O código atual agarra toda a largura e altura da sua área de tela e armazena-o como um PNG no seu diretório de trabalho atual. Agora vamos passar pelo código para ver exatamente como isso funciona. As primeiras três linhas: <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import ImageGrab</span> Import ImageGrab</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import os</span> importar os</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import time</span> tempo de importação</span> ... são as "declarações de importação" apropriadamente mencionadas. Isso diz ao Python que carregue nos módulos listados no tempo de execução. Isso nos dá acesso aos seus métodos através da sintaxe module.attribute . O primeiro módulo é parte da Python Image Library que instalamos anteriormente. Como o próprio nome sugere, isso nos dá a funcionalidade de gabbing de tela básica em que nosso bot confiará. A segunda linha importa o módulo do sistema operacional (sistema operacional). Isso nos dá a capacidade de navegar facilmente pelos diretórios do nosso sistema operacional. Vai ser útil quando começamos a organizar ativos em diferentes pastas. Esta importação final é o módulo de tempo incorporado. Bem, use isso principalmente para carimbar a hora atual em instantâneos, mas pode ser muito útil como um temporizador para bots que precisam de eventos desencadeados ao longo de um determinado número de segundos. As próximas quatro linhas constituem o coração da nossa função screenGrab() . <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def screenGrab():</span> def screenGrab ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">box = ()</span> caixa = ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im = ImageGrab.grab()</span> im = ImageGrab.grab ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) +</span> im.save (os.getcwd () + '\\ full_snap__' + str (int (time.time ())) +</span> A primeira linha def screenGrab() define o nome da nossa função. Os parênteses vazios significam que não espera nenhum argumento. Linha 2, box=() atribui uma tupla vazia a uma variável chamada "caixa". Vamos preencher isso com argumentos na próxima etapa. Linha 3, im = ImageGrab.grab() cria um instantâneo completo da tela e retorna uma imagem RGB para a instância. A Linha 4 pode ser um pouco complicada se você não estiver familiarizado com o funcionamento do módulo de Time . A primeira parte im.save( chama o método "salvar" da classe Image. Ele espera dois argumentos. O primeiro é o local onde salvar o arquivo e o segundo é o formato do arquivo. Aqui nós definimos o local primeiro chamando os.getcwd() . Isso obtém o diretório atual do código que está sendo executado e o retorna como uma string. Em seguida, adicione um + . Isso será usado entre cada novo argumento para concatenar todas as cordas juntas. A próxima peça '\\full_snap__ dá ao nosso arquivo um nome simples e descritivo. (Porque a barra invertida é um caractere de escape em Python, temos que adicionar dois deles para evitar cancelar uma de nossas letras). O próximo é o bit de cabelo: str(int(time.time())) . Isso aproveita os métodos incorporados do Python. Vamos explicar esta peça trabalhando de dentro para fora: time.time() retorna o número de segundos desde Epoch, que é dado como um tipo Float. Uma vez que estamos criando um nome de arquivo, não podemos ter o decimal lá, então primeiro o convertem em um número inteiro envolvendo-o em int() . Isso nos aproxima, mas o Python não pode concatenar o tipo Int com o tipo String , então o último passo é embrulhar tudo na função str() para nos dar um bom timestamp utilizável para o nome do arquivo. A partir daqui, tudo o que resta é adicionar a extensão como parte da string: + '.png' e passar o segundo argumento que é novamente o tipo da extensão: "PNG" . A última parte do nosso código define a função main() e diz para chamar a função screenGrab() sempre que for executada. E aqui, no final, é uma convenção Python que verifica se o script é de nível superior e, se assim, permite que ele seja executado. Traduzido, significa simplesmente que ele só executa main() se é executado sozinho. Caso contrário - se, por exemplo, for carregado como um módulo por um script diferente do Python - ele apenas fornece seus métodos em vez de executar seu código. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def main():</span> def main ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">screenGrab()</span> captura de tela()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if __name__ == '__main__':</span> se __name__ == '__main__':</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">main()</span> a Principal()</span> Passo 3: a caixa de encadernação A função ImageGrab.grab() aceita um argumento que define uma caixa delimitadora. Esta é uma tupla de coordenadas seguindo o padrão de (x, y, x, y) onde, O primeiro par de valores ( x,y.. define o canto superior esquerdo da caixa O segundo par ..x,y ) define o canto inferior direito. A combinação destes permite copiar somente a parte da tela que precisamos. Vamos colocar isso em prática. Para este exemplo, vamos usar um jogo chamado Sushi Go Round . ( Muitoviciante. Você foi avisado.) Abra o jogo em uma nova guia e faça um instantâneo usando nosso código screenGrab() existente: Um instantâneo da área de tela cheia. Passo 4: Obtendo Coordenadas Agora é hora de começar a extrair algumas coordenadas para a nossa caixa delimitadora. Abra seu instantâneo mais recente em um editor de imagens. A posição (0,0) está sempre localizada no canto superior esquerdo da imagem. Queremos colocar as coordenadas x e y para que nossa nova função de instantâneo seja definida (0,0) no canto mais à esquerda da área de jogo do jogo. Os motivos para isso são duplos. Primeiro, torna as coordenadas no jogo muito mais fáceis quando precisamos apenas ajustar os valores em relação à área de reprodução versus a área inteira da resolução da tela. Em segundo lugar, pegar uma porção menor da tela reduz as despesas gerais de processamento necessárias. As gravações em tela cheia produzem um pouco de dados, o que pode dificultar a sua trajetória várias vezes por segundo. Se não for feito já, habilite a exibição da régua em seu editor e faça zoom no canto superior da área de reprodução até que você possa ver os pixels em detalhes: Passe o cursor sobre o primeiro pixel da área de reprodução e verifique as coordenadas exibidas na régua. Estes serão os dois primeiros valores da nossa tupla Box. Na minha máquina específica, esses valores são 157, 162 . Navegue até a borda inferior da área de reprodução para obter o par inferior das coordenadas. Isso mostra as coordenadas de 796 e 641. A combinação destes com o nosso par anterior dá uma caixa com as coordenadas de (157,162,796,641) . Vamos adicionar isso ao nosso código. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import ImageGrab</span> Import ImageGrab</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import os</span> importar os</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import time</span> tempo de importação</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def screenGrab():</span> def screenGrab ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">box = (157,346,796,825)</span> caixa = (157,346,796,825)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im = ImageGrab.grab(box)</span> im = ImageGrab.grab (caixa)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) +</span> im.save (os.getcwd () + '\\ full_snap__' + str (int (time.time ())) +</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">'.png', 'PNG')</span> '.png', 'PNG')</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def main():</span> def main ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">screenGrab()</span> captura de tela()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if __name__ == '__main__':</span> se __name__ == '__main__':</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">main()</span> a Principal()</span> Na linha 6, atualizamos a tupla para manter as coordenadas da área de reprodução. Salve e execute o código. Abra a imagem recém-salva e você deve ver: Sucesso! Uma captura perfeita da área de jogo. Nem sempre precisamos fazer esse tipo de busca intensiva por coordenadas. Uma vez que entramos no win32api, examinaremos alguns métodos mais rápidos para configurar as coordenadas quando não precisarmos de precisão de pixel perfeita. Passo 5: planejamento para a flexibilidade Como está agora, codificamos as coordenadas em relação à nossa configuração atual, assumindo nosso navegador e nossa resolução.Geralmente, é uma má idéia as coordenadas de código rígido desta maneira.Se, por exemplo, queremos executar o código em um computador diferente - ou dizer, um novo anúncio no site desloca ligeiramente a posição da área de jogo - teríamos que consertar manualmente e minuciosamente todas as nossas chamadas de coordenadas. Então vamos criar duas novas variáveis: x_pad e y_pad . Estes serão usados para armazenar a relação entre a área do jogo e o resto da tela. Isso tornará muito fácil a porta do código de um lugar para outro, uma vez que cada nova coordenada será relativa às duas variáveis globais que vamos criar e para ajustar as mudanças na área da tela, tudo o que é necessário é redefinir esses dois variáveis. Como já realizamos as medições, definir as almofadas para o nosso sistema atual é muito direto. Vamos configurar as almofadas para armazenar a localização do primeiro pixel fora da área de jogo. Do primeiro par de coordenadas x, y na nossa tupla da box , subtrair um 1 de cada valor. Então 157 torna-se 156 e 346 torna-se 345 . Vamos adicionar isso ao nosso código. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># Globals</span> # Globals</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left"># ------------------</span> # ------------------</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">x_pad = 156</span> x_pad = 156</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">y_pad = 345</span> y_pad = 345</span> Agora que estes estão configurados, começaremos a ajustar a tupla da caixa para estar em relação a esses valores. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def screenGrab():</span> def screenGrab ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">box = (x_pad+1, y_pad+1, 796, 825)</span> caixa = (x_pad + 1, y_pad + 1, 796, 825)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im = ImageGrab.grab()</span> im = ImageGrab.grab ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) +</span> im.save (os.getcwd () + '\\ full_snap__' + str (int (time.time ())) +</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">'.png', 'PNG')</span> '.png', 'PNG')</span> Para o segundo par, vamos primeiro subtrair os valores das almofadas (156 e 345) das coordenadas (796, 825) e, em seguida, usar esses valores no mesmo formato Pad + Value . <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def screenGrab():</span> def screenGrab ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">box = (x_pad+1, y_pad+1, x_pad+640, y_pad+479)</span> caixa = (x_pad + 1, y_pad + 1, x_pad + 640, y_pad + 479)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im = ImageGrab.grab()</span> im = ImageGrab.grab ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">im.save(os.getcwd() + '\\full_snap__' + str(int(time.time())) +</span> im.save (os.getcwd () + '\\ full_snap__' + str (int (time.time ())) +</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">'.png', 'PNG')</span> '.png', 'PNG')</span> Aqui, a coordenada x se torna 640 (769-156), e o y se torna 480 (825-345) Pode parecer um pouco redundante no início, mas fazer este passo extra garante uma fácil manutenção no futuro. Etapa 6: Criando uma Docstring Antes de avançarmos, vamos criar um docstring no topo do nosso projeto.Uma vez que a maioria do nosso código será baseado em coordenadas de tela específicas e relacionamentos para coordenadas, é importante conhecer as circunstâncias em que tudo se alinhará corretamente. Por exemplo, coisas como a resolução atual, navegador, barras de ferramentas habilitadas (uma vez que alteram a área do navegador) e quaisquer ajustes necessários para centrar a área de reprodução na tela, todos afetam a posição relativa das coordenadas. Ter tudo isso documentado ajuda muito o processo de solução de problemas ao executar seu código em vários navegadores e computadores. Uma última coisa a ter em conta é o espaço publicitário em constante mudança em sites de jogos populares. Se todas as suas chamadas de gravação de repente parem de se comportar conforme o esperado, uma nova introdução de coisas ligeiramente divertidas na tela é uma boa aposta. Como exemplo, geralmente tenho os seguintes comentários no topo do meu código Python: <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"""</span> "" "</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">All coordinates assume a screen resolution of 1280x1024, and Chrome</span> Todas as coordenadas assumem uma resolução de tela de 1280x1024 e Chrome</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">maximized with the Bookmarks Toolbar enabled.</span> maximizado com a barra de ferramentas de marcadores habilitada.</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Down key has been hit 4 times to center play area in browser.</span> A tecla Down foi atingida 4 vezes na área central de reprodução no navegador.</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">x_pad = 156</span> x_pad = 156</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">y_pad = 345</span> y_pad = 345</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Play area = x_pad+1, y_pad+1, 796, 825</span> Área de reprodução = x_pad + 1, y_pad + 1, 796, 825</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"""</span> "" "</span> Largar toda essa informação no início do seu arquivo Python torna rápido e fácil verificar todas as configurações e o alinhamento da tela sem ter que controlar seu código tentando lembrar onde você armazenou essa coordenada x específica. Passo 7: Transformando o quickGrab.py em uma ferramenta útil Nós vamos conquistar nosso projeto neste momento, criando dois arquivos: um para armazenar todo o código do nosso bot e o outro para atuar como um utilitário geral de captura de tela. Nós estaremos tomando muitas capturas de tela enquanto buscamos coordenadas, então, ter um módulo separado pronto para ir, tornará as coisas muito mais rápidas. Salve e feche o nosso projeto atual. Na sua pasta, clique com o botão direito do mouse em quickGrab.py e selecione 'copiar' no menu. Agora, clique com o botão direito do mouse e selecione 'colar' no menu Selecione o arquivo copiado e renomeie-o para 'code.py' A partir de agora, todas as novas adições e alterações de código serão feitas em code.py. O FastGrab.py agora funcionará apenas como uma ferramenta de instantâneo. Só precisamos fazer uma última modificação: Altere a extensão do arquivo de .py, para .pyw e confirme as alterações. Esta extensão informa o Python para executar o script sem iniciar o console.Então agora, quickGrab.pyw faz jus ao seu nome. Clique duas vezes no arquivo e ele executará silenciosamente seu código em segundo plano e salvará um instantâneo no seu diretório de trabalho. Mantenha o jogo aberto em segundo plano (certifique-se de silenciá-lo antes que a música em loop o leve à loucura); voltaremos em breve. Temos mais alguns conceitos / ferramentas para apresentar antes de entrar no controle de coisas na tela. Passo 8: Win32api - Uma breve visão geral Trabalhar com o win32api pode ser um pouco intimidante inicialmente. Ele envolve o código do Windows C de baixo nível - o que é felizmente muito bem documentado aqui , mas um pouco como um labirinto para navegar pelo seu primeiro par de go-arounds. Antes de iniciar o script de qualquer ação útil, vamos examinar de perto algumas das funções da API sobre as quais confiamos. Uma vez que tenhamos uma compreensão clara de cada parâmetro, será fácil ajustá-los para servir os fins que precisamos no jogo. O win32api.mouse_event() : <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.mouse_event(</span> win32api.mouse_event (</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">dwFlags,</span> dwFlags</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">dx,</span> dx</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">dy,</span> dy</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">dwData</span> dwData</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">)</span> )</span> O primeiro parâmetro dwFlags define a "ação" do mouse. Ele controla coisas como movimento, clique, rolagem, etc. A lista a seguir mostra os parâmetros mais comuns usados durante o movimento de script. dwFlags : win32con.MOUSEEVENTF_LEFTDOWN win32con.MOUSEEVENTF_LEFTUP win32con.MOUSEEVENTF_MIDDLEDOWN win32con.MOUSEEVENTF_MIDDLEUP win32con.MOUSEEVENTF_RIGHTDOWN win32con.MOUSEEVENTF_RIGHTUP win32con.MOUSEEVENTF_WHEEL Cada nome é auto-explicativo. Se você quisesse enviar um clique direito virtual, você passaria o win32con.MOUSEEVENTF_RIGHTDOWN para o parâmetro dwFlags . Os dois parâmetros seguintes, dx e dy , descrevem a posição absoluta do mouse ao longo dos eixos x e y. Embora possamos usar esses parâmetros para rotear o movimento do mouse, eles usam um sistema de coordenadas diferente do que usamos. Então, vamos deixá-los definidos para zero e confiar em uma parte diferente da API para as nossas necessidades de mudança de mouse. O quarto parâmetro é dwData . Esta função é usada se (e somente se) dwFlagscontém MOUSEEVENTF_WHEEL . Caso contrário, pode ser omitido ou definido como zero. dwData especifica a quantidade de movimento na roda de rolagem do mouse. Um exemplo rápido para solidificar essas técnicas: Se imaginarmos um jogo com um sistema de seleção de armas semelhante ao Half-Life 2 - onde as armas podem ser selecionadas girando a roda do mouse - nós apresentamos a seguinte função para examinar a lista de armas: <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def browseWeapons():</span> def browseWeapons ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">weaponList = ['crowbar','gravity gun','pistol'...]</span> weaponList = ['crowbar', 'pistola de gravidade', 'pistola' ...]</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">for i in weaponList:</span> para eu em weaponList:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.mouse_event(win32con.MOUSEEVENTF_MOUSEEVENTF_WHEEL,0,0,120)</span> win32api.mouse_event (win32con.MOUSEEVENTF_MOUSEEVENTF_WHEEL, 0,0120)</span> Aqui queremos simular a rolagem da roda do mouse para navegar nossa lista de armas teóricas, então passamos ...MOUSEEVENTF_WHEEL 'ação' para o dwFlag.Não precisamos de dx ou dy , dados de posição, então deixávamos aqueles definidos para zero, e queríamos rolar um clique na direção direta para cada "arma" na lista, então passamos o inteiro 120 para dwData (cada um O clique da roda é igual a 120). Como você pode ver, trabalhar com mouse_event é simplesmente uma questão de conectar os argumentos certos ao lugar certo. Vamos agora passar para algumas funções mais utilizáveis Etapa 5: clique básico do mouse Vamos fazer três novas funções. Uma função geral do botão esquerdo e dois que manipulam os estados específicos para baixo e para cima. Abra code.py com IDLE e adicione o seguinte à nossa lista de declarações de importação: <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">import win32api, win32con</span> importe win32api, win32con</span> Como antes, isso nos dá acesso ao conteúdo do módulo através da sintaxe module.attribute . Em seguida, faremos nossa primeira função de clique do mouse. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def leftClick():</span> def leftClick ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)</span> win32api.mouse_event (win32con.MOUSEEVENTF_LEFTDOWN, 0,0)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)</span> win32api.mouse_event (win32con.MOUSEEVENTF_LEFTUP, 0,0)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">print "Click."</span> imprimir "clicar".</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">#completely optional.</span> # Completamente opcional.</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">But nice for debugging purposes.</span> Mas bom para fins de depuração.</span> Lembre-se de que tudo o que estamos fazendo aqui é atribuir uma "ação" ao primeiro argumento do mouse_event . Não precisamos passar nenhuma informação de posicionamento, por isso estamos deixando os parâmetros de coordenadas em (0,0), e não precisamos enviar nenhuma informação adicional, então dwData está sendo omitido. A função time.sleep(.1) informa Python para interromper a execução pelo tempo especificado entre parênteses. Nós iremos adicionar isso através do nosso código, geralmente por uma quantidade muito curta de vezes. Sem isso, o "clique" pode avançar e disparar antes que os menus tenham a chance de atualizar. Então, o que fizemos aqui é um clique esquerdo geral. Uma imprensa, uma versão. Vamos passar a maior parte do tempo com este, mas vamos fazer mais duas variações. Os próximos dois são exatamente o mesmo, mas agora cada etapa é dividida em sua própria função. Estes serão usados quando precisamos manter pressionado o mouse por um longo período de tempo (para arrastar, disparar, etc.). <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def leftDown():</span> def leftDown ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)</span> win32api.mouse_event (win32con.MOUSEEVENTF_LEFTDOWN, 0,0)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">print 'left Down'</span> imprimir 'para baixo para baixo'</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def leftUp():</span> def leftUp ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)</span> win32api.mouse_event (win32con.MOUSEEVENTF_LEFTUP, 0,0)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">print 'left release'</span> imprimir 'release esquerdo'</span> Passo 9: Movimento básico do mouse Ao clicar no caminho, tudo o que resta é mover o mouse na tela. Adicione as seguintes funções a code.py : <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def mousePos(cord):</span> def mousePos (cabo):</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">win32api.SetCursorPos((x_pad + cord[0], y_pad + cord[1])</span> win32api.SetCursorPos ((x_pad + cordão [0], y_pad + cordão [1])</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def get_cords():</span> def get_cords ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">x,y = win32api.GetCursorPos()</span> x, y = win32api.GetCursorPos ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">x = x - x_pad</span> x = x - x_pad</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">y = y - y_pad</span> y = y - y_pad</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">print x,y</span> print x, y</span> Essas duas funções atendem a propósitos distintamente diferentes. O primeiro será usado para mover scripts no programa. Graças a excelentes convenções de nomenclatura, o corpo da função faz exatamente como SetCursorPos() implica. Chamando essa função define o mouse nas coordenadas passadas para ele como uma tupla x,y . Observe que adicionamos em nossas almofadas x e y ; É importante fazer isso em qualquer lugar, uma coordenada é chamada. O segundo é uma ferramenta simples que usaremos ao executar o Python de forma interativa. Ele imprime no console a posição atual do mouse como uma tupla x,y . Isso acelera o processo de navegar por menus sem ter que tirar uma foto e sair com uma régua. Nem sempre poderemos usá-lo, pois algumas atividades do mouse precisarão ser específicas de pixels, mas quando pudermos, é uma economia de tempo fantástica. No próximo passo, vamos colocar algumas dessas novas técnicas para usar e começar a navegar nos menus do jogo. Mas antes de fazê-lo, exclua o conteúdo atual do main() em code.py e substitua-o por pass . Nós estaremos trabalhando com o prompt interativo para o próximo passo, então não precisaremos da função screenGrab() . Etapa 10: Menus do jogo de navegação get_cords() , e as próximas etapas, vamos tentar reunir as coordenadas de eventos que possamos usando o nosso método get_cords() . Usando isso, poderemos construir rapidamente o código para coisas como navegar em menus, limpar tabelas e fazer comida. Uma vez que tenhamos esse conjunto, será apenas uma questão de conectá-los à lógica do bot. Vamos começar. Salve e execute seu código para abrir o shell Python. Uma vez que substituímos o corpo do main() por pass no último passo, você deve ver um invólucro em branco ao correr. Agora, antes mesmo de chegar à parte jogável do jogo, há quatro menus iniciais que precisamos passar. Eles são os seguintes: 1 - Botão inicial de "reprodução" 2 - Botão "continuar" do iPhone 3 - Tutorial botão "Saltar" 4 - O objetivo de hoje "Continuar" Teremos que obter as coordenadas para cada um destes e adicioná-los a uma nova função chamada startGame() . Posicione o shell IDLE para que você possa ver ambos e a área de jogo. Digite a função get_cords() , mas não pressione retornar ainda; Mova o mouse sobre o botão para o qual você precisa de coordenadas. Certifique-se de não clicar ainda, pois queremos que o foco permaneça no shell. Passe o mouse sobre o item do menu e pressione a tecla de retorno. Isso irá pegar a localização atual do mouse e imprimir no console uma tupla contendo os valores x,y . Repita isso para os três menus restantes. Deixe o shell aberto e organize-o para que você possa vê-lo, bem como o editor IDLE. Agora vamos agora adicionar a nossa função startGame() e preenchê-la com as nossas coordenadas recém-adquiridas. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def startGame():</span> def startGame ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">#location of first menu</span> #localização do primeiro menu</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((182, 225))</span> mousePos ((182, 225))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">#location of second menu</span> #localização do segundo menu</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((193, 410))</span> mousePos ((193, 410))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">#location of third menu</span> #localização do terceiro menu</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((435, 470))</span> mousePos ((435, 470))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">#location of fourth menu</span> #localização do quarto menu</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((167, 403))</span> mousePos ((167, 403))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> Agora temos uma boa função compacta para ligar no início de cada jogo.Define a posição do cursor para cada um dos locais de menu que definimos anteriormente e, em seguida, diz ao mouse para clicar. time.sleep(.1) diz a Python que interrompa a execução por 1/10 de segundo entre cada clique, o que dá aos menus tempo suficiente para atualizar entre eles. Salve e execute seu código e você deve ver um resultado semelhante a este: Como um humano fraco leva-me um pouco mais de um segundo para navegar todos os menus à mão, mas o nosso bot agora pode fazê-lo em cerca de .4 segundos. Nada mal a todos! Passo 11: Obter Coordenadas de Alimentos Agora, vamos repetir o mesmo processo para cada um desses botões: Mais uma vez, no shell Python, digite get_cords() , passe o mouse sobre a caixa de alimentos que você precisa e pressione a tecla Enter para executar o comando. Como uma opção para acelerar ainda mais as coisas, se você tiver um segundo monitor ou for capaz de organizar o shell python de forma que você possa vê-lo, bem como a área do jogo, em vez de digitar e executar get_cords() cada vez nós precisamos disso, podemos configurar um loop simples for . Use um método time.sleep() para interromper a execução apenas o tempo suficiente para que você mova o mouse para a próxima localização que precisa de coordenadas. Aqui está o loop para ação: Vamos criar uma nova classe chamada Cord e usá-la para armazenar todos os valores de coordenadas que reunimos. Ser capaz de chamar Cord.f_riceoferece uma enorme vantagem de legibilidade ao passar as coordenadas diretamente para mousePos() . Como uma opção, você também pode armazenar tudo em um dictionary , mas acho a sintaxe da classe mais agradável. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">class Cord:</span> classe Cord:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_shrimp = (54,700)</span> f_shrimp = (54,700)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_rice = (119 701)</span> f_rice = (119 701)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_nori = (63 745)</span> f_nori = (63 745)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_roe = (111 749)</span> f_roe = (111 749)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_salmon = (54 815)</span> f_salmon = (54 815)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_unagi = (111 812)</span> f_unagi = (111 812)</span> Nós vamos armazenar muitas das nossas coordenadas nesta classe, e haverá uma sobreposição, então, adicionando o prefixo ' f_ ' nos informa que nos referimos aos locais de comida, em vez de, digamos, uma localização no telefone cardápio. Vamos voltar a isso em um pouco. Há um pouco mais de caça coordenada para fazer! Etapa 12: Obtendo coordenadas de placas vazias Cada vez que um cliente termina de comer, eles deixam para trás uma placa que precisa ser clicada para ser removida. Então, precisamos obter a localização das placas vazias também. Eu notei sua posição com um 'X' vermelho gigante. Repita o mesmo padrão nas duas últimas etapas para obter suas coordenadas. Armazene-os na string de comentário por enquanto. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"""</span> "" "</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Plate cords:</span> Cordas de placa:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">108, 573</span> 108, 573</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">212, 574</span> 212, 574</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">311, 573</span> 311, 573</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">412, 574</span> 412, 574</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">516, 575</span> 516, 575</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">618, 573</span> 618, 573</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">"""</span> "" "</span> Estamos chegando perto. Apenas mais algumas etapas de configuração preliminar antes de entrarmos nas coisas realmente divertidas. Passo 13: Obtendo Coordenadas do Telefone Ok, este será o conjunto final de coordenadas que temos para minar desta maneira específica. Este tem muito mais para acompanhar, então você pode querer fazê-lo chamando manualmente a função get_cords() em vez do método de loop anteriormente usado. De qualquer forma, vamos passar por todos os menus do telefone para obter as coordenadas de cada item. Este é um pouco mais envolvido no sentido de alcançar uma das telas de compra que precisamos, você precisa ter dinheiro suficiente para realmente comprar algo. Então você precisará fazer alguns pedaços de sushi antes de ir sobre o negócio da caça coordenada. No máximo, você terá que fazer dois roquetes de sushi, eu acredito. Isso o levará o suficiente para comprar arroz, o que nos levará à tela que precisamos. Existem seis menus que temos para passar: 1 - O telefone 2 - Menu inicial 3 - Toppings 4 - Arroz 5 - Remessa Precisamos obter coordenadas para tudo, exceto Sake (embora você possa, se você quiser. Achei que o bot funcionava bem sem ele. Eu estava disposto a sacrificar a crítica ocasional do jogo em não ter que codificar na lógica.) Obtendo as coordenadas: Vamos adicionar tudo isso à nossa classe Cord. Usaremos o prefixo ' t_ ' para denotar que os tipos de comida são itens de menu toppings para telefone. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">class Cord:</span> classe Cord:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_shrimp = (54,700)</span> f_shrimp = (54,700)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_rice = (119 701)</span> f_rice = (119 701)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_nori = (63 745)</span> f_nori = (63 745)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_roe = (111 749)</span> f_roe = (111 749)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_salmon = (54 815)</span> f_salmon = (54 815)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">f_unagi = (111 812)</span> f_unagi = (111 812)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">#-----------------------------------</span> # -----------------------------------</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">phone = (601, 730)</span> telefone = (601, 730)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">menu_toppings = (567, 638)</span> menu_toppings = (567, 638)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">t_shrimp = (509, 581)</span> t_shrimp = (509, 581)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">t_nori = (507, 645)</span> t_nori = (507, 645)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">t_roe = (592, 644)</span> t_roe = (592, 644)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">t_salmon = (510, 699)</span> t_salmon = (510, 699)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">t_unagi = (597, 585)</span> t_unagi = (597, 585)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">t_exit = (614, 702)</span> t_exit = (614, 702)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">menu_rice = (551, 662)</span> menu_rice = (551, 662)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">buy_rice = 564, 647</span> buy_rice = 564, 647</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">delivery_norm = (510, 664)</span> Delivery_norm = (510, 664)</span> Bem! Finalmente, extraímos todos os valores de coordenadas que precisamos.Então vamos começar a fazer algo útil! Etapa 14: Limpeza de tabelas Vamos pegar nossas coordenadas previamente gravadas e usá-las para preencher uma função chamada clear_tables (). <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def clear_tables():</span> def clear_tables ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((108, 573))</span> mousePos ((108, 573))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((212, 574))</span> mousePos ((212, 574))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((311, 573))</span> mousePos ((311, 573))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((412, 574))</span> mousePos ((412, 574))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((516, 575))</span> mousePos ((516, 575))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((618, 573))</span> mousePos ((618, 573))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(1)</span> time.sleep (1)</span> Como você pode ver, isso parece mais ou menos exatamente como a nossa função startGame() anterior. Algumas pequenas diferenças: Não temos funções time.sleep() entre os diferentes eventos de clique. Não precisamos aguardar qualquer atualização de menus, portanto, não precisamos acelerar nossas velocidades de clique. Nós, no entanto, temos um longo tempo. time.sleep() no final. Embora não seja estritamente necessário, é bom adicionar essas pausas ocasionais em execução ao nosso código, algo apenas o suficiente para nos dar tempo para sair manualmente do loop principal do bot, se necessário (o que iremos chegar). Caso contrário, a coisa continuará a roubar a posição do mouse uma e outra vez, e você não poderá mudar o foco para o shell o suficiente para parar o script - o que pode divertir as primeiras duas ou três vezes enquanto luta contra um mouse , mas rapidamente perde seu charme. Portanto, certifique-se de adicionar algumas pausas confiáveis em seus próprios robôs! Passo 15: Fazer Sushi A primeira coisa que precisamos fazer é aprender a fazer o sushi. Clique no livro de receitas para abrir o manual de instruções. Todos os tipos de sushi encontrados ao longo do jogo serão encontrados em suas páginas. Vou notar os três primeiros abaixo, mas deixo para você catalogar o resto. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">'''</span> '' '</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Recipes:</span> Receitas:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">onigiri</span> onigiri</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">2 rice, 1 nori</span> 2 arroz, 1 nori</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">caliroll:</span> Caliroll:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">1 rice, 1 nori, 1 roe</span> 1 arroz, 1 nori, 1 roe</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">gunkan:</span> gunkan:</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">1 rice, 1 nori, 2 roe</span> 1 arroz, 1 nori, 2 ovas</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">'''</span> '' '</span> Agora, vamos configurar uma função que aceitará um argumento para "tipo de sushi" e, em seguida, montar os ingredientes apropriados com base no valor passado. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def makeFood(food):</span> def makeFood (comida):</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">if food == 'caliroll':</span> se comida == 'caliroll':</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">print 'Making a caliroll'</span> imprimir 'Making a caliroll'</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_rice)</span> mousePos (Cord.f_rice)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_nori)</span> mousePos (Cord.f_nori)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_roe)</span> mousePos (Cord.f_roe)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">foldMat()</span> foldMat ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(1.5)</span> time.sleep (1.5)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">elif food == 'onigiri':</span> Elif Food == 'onigiri':</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">print 'Making a onigiri'</span> print 'Making a onigiri'</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_rice)</span> mousePos (Cord.f_rice)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_rice)</span> mousePos (Cord.f_rice)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_nori)</span> mousePos (Cord.f_nori)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">foldMat()</span> foldMat ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(1.5)</span> time.sleep (1.5)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">elif food == 'gunkan':</span> elif food == 'gunkan':</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_rice)</span> mousePos (Cord.f_rice)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_nori)</span> mousePos (Cord.f_nori)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_roe)</span> mousePos (Cord.f_roe)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.05)</span> time.sleep (.05)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.f_roe)</span> mousePos (Cord.f_roe)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">foldMat()</span> foldMat ()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(1.5)</span> time.sleep (1.5)</span> Isso funciona como todos os outros, mas com uma pequena alteração: ao invés de passar diretamente as coordenadas, os chamamos de atributos da nossa classe Cord . A função foldMat() é chamada no final de cada processo de fabricação de sushi. Isso faz clic no tapete para rolar o sushi que acabamos de montar.Vamos definir essa função agora: <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def foldMat():</span> def foldMat ():</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos((Cord.f_rice[0]+40,Cord.f_rice[1]))</span> mousePos ((Cord.f_rice [0] + 40, Cord.f_rice [1]))</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">leftClick()</span> Clique esquerdo()</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">time.sleep(.1)</span> time.sleep (.1)</span> Vamos percorrer brevemente essa chamada de mousePos() , pois é um pouco encadernada. f_rice o primeiro valor da tupla do f_rice adicionando [0] no final do atributo. Lembre-se que este é o nosso valor x . Para clicar no tapete, só precisamos ajustar nossos valores x por um punhado de pixels, então adicionamos 40 à coordenada x atual e então passamos o f_rice[1] ao y .Isso muda a nossa posição x suficiente para a direita para nos permitir desencadear o tapete. Observe que, após a chamada foldMat() , temos um long time.sleep() . O Mat leva bastante tempo para rolar, e os itens alimentares não podem ser clicados enquanto suas animações estão sendo executadas, então você só precisa esperar. Etapa 16: Navegando no menu do telefone Nesta etapa, definiremos todos os mousePos() para apontar para os itens de menu apropriados, mas vamos deixá-lo por agora. Isso faz parte do programa que será envolvido e controlado pela lógica do bot. Revisaremos esta função depois de obter algumas novas técnicas ao nosso dispor. <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">def buyFood(food):</span> def buyFood (comida):</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.phone)</span> mousePos (Cord.phone)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.menu_toppings)</span> mousePos (Cord.menu_toppings)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.t_shrimp)</span> mousePos (Cord.t_shrimp)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.t_nori)</span> mousePos (Cord.t_nori)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.t_roe)</span> mousePos (Cord.t_roe)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.t_salmon)</span> mousePos (Cord.t_salmon)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.t_unagi)</span> mousePos (Cord.t_unagi)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.t_exit)</span> mousePos (Cord.t_exit)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.menu_rice)</span> mousePos (Cord.menu_rice)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.buy_rice)</span> mousePos (Cord.buy_rice)</span> <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">mousePos(Cord.delivery_norm)</span> mousePos (Cord.delivery_norm)</span> É por esta etapa. Vamos fazer mais com isso mais tarde. Breve introdução: fazer o computador ver Agora estamos chegando aos bits muito interessantes. Vamos começar a ver como fazer o computador ver os eventos na tela. Esta é uma parte muito emocionante do processo, e é fácil pensar em pensar. Outra parte pura do edifício bot é que, eventualmente, o bot pode fornecer-nos, os programadores, com informações suficientes que mais trabalho visão não é necessária. Por exemplo, no caso do bot Sushi, uma vez que temos a primeira corrida nível, o bot está cuspindo dados suficientes precisas sobre o que está acontecendo na tela que todos nós temos que fazer a partir desse ponto é levar esses dados é "ver" e simplesmente dizer-lhe como reagir a ela. Outra grande parte do edifício bot está aprendendo o jogo, sabendo que valores você precisa manter o controle da relação que você pode ignorar. Por exemplo, vamos fazer nenhum esforço para rastrear o dinheiro na mão. É apenas algo que acabou por ser irrelevante para o bot. Tudo o que precisa de saber é se ele tem comida suficiente para continuar trabalhando. Então ao invés de manter o controle sobre o total de dinheiro, ele simplesmente verifica para ver se ele pode pagar algo, independentemente do preço, porque, como ele funciona no jogo, é apenas uma questão de alguns segundos antes de você pode dar ao luxo de repor alguma coisa. Então, se não pode pagar agora, ele só tenta novamente em alguns segundos. O que me leva ao meu ponto final. A do método de força bruta contra o elegante. Algoritmos de visão tomar o tempo de processamento valioso. Verificando vários pontos em muitas regiões diferentes de área de jogo pode rapidamente corroer o seu desempenho bot, por isso se resume a uma questão de "faz o bot necessidade de saber se _______ aconteceu ou não?". Como exemplo, um cliente do jogo Sushi poderia ser pensado como tendo quatro estados: não presentes, esperando, comendo, e acabado de comer. Quando terminar, eles deixam um prato vazio piscando para trás. Eu poderia gastar o poder de processamento em verificar todos os locais placa encaixando todos os seis locais de placa e, em seguida, verificando contra um valor esperado (que é propenso a falhas desde as placas acendem e apagam, fazendo um falso negativo uma grande possibilidade), ou .. . Eu poderia apenas força bruta meu caminho através clicando em cada localização placa a cada poucos segundos. Na prática, isso é tão eficaz como a solução 'elegante' de deixar o bot determinar o estado do cliente. Clicando seis locais leva uma fração de segundo, onde como agarrar e processamento de seis imagens diferentes é relativamente lento.Podemos usar o tempo que salvou em outras tarefas mais importantes de processamento de imagem. Passo 17: importar Numpy e ImageOps Adicione o seguinte à sua lista de instruções de importação. import ImageOps from numpy import * ImageOps é outro módulo PIL. Ele é usado para executar operações (como grayscaling) em uma imagem. Vou explicar brevemente a segunda para aqueles que não estão familiarizados com o Python. Nossas demonstrações de importação padrão carrega namespace do módulo (uma coleção de nomes de variáveis e funções). Assim, para acessar itens no âmbito de um módulo, temos que empregar o module.attributesytax. No entanto, usando uma from ___ importdeclaração que herdam os nomes em nosso escopo local. Ou seja, a module.attributesintaxe não é mais necessária. Eles não são de alto nível, por isso usá-los como faria com qualquer função built-in outro Python nós, como str()ou list(). Ao importar Numpy desta forma, permite-nos simplesmente chamar array(), em vez de numpy.array(). O curinga *significa importar tudo do módulo. Passo 18: Fazendo o computador See O primeiro método que vamos explorar é a de verificar um valor RGB específica de um pixel contra um valor esperado. Este método é bom para coisas estáticas, como menus. Desde que se trata de pixels específicos, geralmente é um pouco demasiado frágil para objetos em movimento. no entanto, suas varia de caso para caso. Às vezes é a técnica perfeita, outra vez você vai ter que resolver um método diferente. Abra Sushi Go Round no seu navegador e começar um novo jogo. Ignorar seus clientes e abrir o menu do telefone. Você começa com nenhum dinheiro no banco, assim que tudo deve ser acinzentado como abaixo. Estes serão os valores RGB vamos verificar. Em code.py, vá até a sua screenGrab()função. Nós vamos fazer as seguintes alterações: def screenGrab(): b1 = (x_pad + 1,y_pad+1,x_pad+640,y_pad+480) im = ImageGrab.grab() ##im.save(os.getcwd() + '\\Snap__' + str(int(time.time())) +'.png', 'PNG') return im Nós fizemos duas pequenas mudanças. Na linha 5 comentamos a nossa declaração save. Na linha 6 que agora devolver o Imageobjeto para uso fora da função. Salvar e executar o código. Nós vamos fazer algum trabalho mais interativo. Com o menu coberturas aberto e todos os itens acinzentado, execute o seguinte código: >>>im = screenGrab() <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">>>></span> >>></span> Este atribui o snap shot levarmos em screenGrab()para a instância im. Por aqui, podemos chamar o getpixel(xy)método para pegar dados de pixel específicas. Agora precisamos de obter valores RGB para cada um dos itens acinzentado. Estes farão o nosso 'valor esperado' que o bot irá testar contra quando ele faz suas próprias getpixel()chamadas. Nós já temos as coordenadas que precisamos das etapas anteriores, então tudo o que temos a fazer é passá-las como argumentos para getpixel()e observe a saída. Saída da nossa sessão interativa: >>> im = screenGrab() >>> im.getpixel(Cord.t_nori) (33, 30, 11) >>> im.getpixel(Cord.t_roe) (127, 61, 0) >>> im.getpixel(Cord.t_salmon) (127, 71, 47) >>> im.getpixel(Cord.t_shrimp) (127, 102, 90) >>> im.getpixel(Cord.t_unagi) (94, 49, 8) >>> im.getpixel(Cord.buy_rice) (127, 127, 127) <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">>>></span> >>></span> Precisamos adicionar esses valores à nossa buyFood()função na forma que lhe permite saber se algo é ou não disponível. def buyFood(food): if food == 'rice': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_rice) time.sleep(.05) leftClick() s = screenGrab() if s.getpixel(Cord.buy_rice) != (127, 127, 127): print 'rice is available' mousePos(Cord.buy_rice) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) else: print 'rice is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'nori': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() print 'test' time.sleep(.1) if s.getpixel(Cord.t_nori) != (33, 30, 11): print 'nori is available' mousePos(Cord.t_nori) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) else: print 'nori is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'roe': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() time.sleep(.1) if s.getpixel(Cord.t_roe) != (127, 61, 0): print 'roe is available' mousePos(Cord.t_roe) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) else: print 'roe is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) Aqui nós passar um nome de ingrediente para a buyFood()função. Uma série de instruções if/ else é usado para capturar o parâmetro transmitido e responder adequadamente. Cada garfo segue a mesma lógica exata, por isso vamos explorar o primeiro. if food == 'rice': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_rice) time.sleep(.05) leftClick() s = screenGrab() time.sleep(.1) A primeira coisa que fazemos após o if food é clicar sobre o telefone e abra o item de menu apropriado - neste caso o menu Rice. s = screenGrab() if s.getpixel(Cord.buy_rice) != (127, 127, 127): Em seguida vamos dar uma visão rápida da área da tela e chamar getpixel()para obter um valor RGB para o pixel nas coordenadas de Cord.buy_rice. Em seguida, testamos este contra nosso valor RGB previamente estabelecido para quando o item é acinzentado. Se for avaliado como True, sabemos que o item não é mais acinzentado, e não temos dinheiro suficiente para comprá-lo. Consequentemente, se avaliada para False, não podemos permitir isso. print 'rice is available' mousePos(Cord.buy_rice) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) time.sleep(.1) leftClick() time.sleep(2.5) Fornecendo que podemos pagar o ingrediente, nós simplesmente navegar através das caixas restantes necessários para comprar a comida. else: print 'rice is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) Finalmente, se não podemos pagar a comida, nós dizemos Python para fechar o menu, espere um segundo, e tente o processo novamente. Geralmente é apenas uma questão de segundos entre ser capaz de pagar algo contra não ser capaz de pagar algo. Nós não vai fazê-lo neste tutorial, mas é bastante simples para adicionar lógica adicional para esta função para permitir que o bot decidir se ele precisa continuar esperando até que ele pode pagar alguma coisa, ou se é livre para fazer outras tarefas e retornar à um momento posterior. Passo 19: Manter o controle de Ingredientes Tudo bem, agora vamos devagar, aos poucos, começar a substituir áreas onde nós, a entidade externa, fornecem entrada e tomada de decisão com a lógica que pode ser executado por si só. Precisamos dispositivo de uma forma de manter o controle de quantas ingredientes que temos atualmente na mão. Nós poderíamos fazer isso através de ping na tela em determinadas áreas, ou pela média de cada caixa de ingrediente (nós vamos chegar a esta técnica mais tarde), mas, de longe, o método mais simples e mais rápido é apenas para armazenar todas as nos itens mão em um dicionário. A quantidade de cada ingrediente se mantém constante ao longo de cada nível. Você sempre começará com 10 dos itens 'comuns' (arroz, nori, o ROE), e 5 dos itens 'premium' (camarão, salmão, unagi). Vamos adicionar esta informação a um dicionário. foodOnHand = {'shrimp':5, 'rice':10, 'nori':10, 'roe':10, 'salmon':5, 'unagi':5} Nossas chaves de dicionário segure o nome do ingrediente, e nós vamos ser capazes de obter quantidade atual, explorando os valores. Passo 20: adicionar monitoramento de Código Agora que temos nosso dicionário de valores. Vamos trabalhar com isso no código. Cada vez que fazemos algo, vamos subtrair os ingredientes utilizados. Toda vez que nós compramos, nós vamos adicioná-los novamente. Vamos começar pela expansão da makeFood()função def makeFood(food): if food == 'caliroll': print 'Making a caliroll' foodOnHand['rice'] -= 1 foodOnHand['nori'] -= 1 foodOnHand['roe'] -= 1 mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.1) foldMat() time.sleep(1.5) elif food == 'onigiri': print 'Making a onigiri' foodOnHand['rice'] -= 2 foodOnHand['nori'] -= 1 mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.1) foldMat() time.sleep(.05) time.sleep(1.5) elif food == 'gunkan': print 'Making a gunkan' foodOnHand['rice'] -= 1 foodOnHand['nori'] -= 1 foodOnHand['roe'] -= 2 mousePos(Cord.f_rice) leftClick() time.sleep(.05) mousePos(Cord.f_nori) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.05) mousePos(Cord.f_roe) leftClick() time.sleep(.1) foldMat() time.sleep(1.5) Agora, cada vez que fazemos um pedaço de Sushi, reduzimos os valores em nosso foodOnHanddicionário pelo valor apropriado. Em seguida, vamos ajustar buyFood () para adicionar valores. def buyFood(food): if food == 'rice': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_rice) time.sleep(.05) leftClick() s = screenGrab() print 'test' time.sleep(.1) if s.getpixel(Cord.buy_rice) != (127, 127, 127): print 'rice is available' mousePos(Cord.buy_rice) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) foodOnHand['rice'] += 10 time.sleep(.1) leftClick() time.sleep(2.5) else: print 'rice is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'nori': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() print 'test' time.sleep(.1) if s.getpixel(Cord.t_nori) != (33, 30, 11): print 'nori is available' mousePos(Cord.t_nori) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) foodOnHand['nori'] += 10 time.sleep(.1) leftClick() time.sleep(2.5) else: print 'nori is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) if food == 'roe': mousePos(Cord.phone) time.sleep(.1) leftClick() mousePos(Cord.menu_toppings) time.sleep(.05) leftClick() s = screenGrab() time.sleep(.1) if s.getpixel(Cord.t_roe) != (127, 61, 0): print 'roe is available' mousePos(Cord.t_roe) time.sleep(.1) leftClick() mousePos(Cord.delivery_norm) foodOnHand['roe'] += 10 time.sleep(.1) leftClick() time.sleep(2.5) else: print 'roe is NOT available' mousePos(Cord.t_exit) leftClick() time.sleep(1) buyFood(food) Agora, cada vez que um ingrediente é comprado, nós adicionamos a quantidade ao valor dicionário apropriado. Passo 21: Verificação comida na mão Agora que temos o nosso makeFood()e buyFood()funções criadas para modificar o foodOnHanddicionário, é preciso criar uma nova função para monitorar todas as alterações e verificar se um ingrediente caiu abaixo de um certo limite. def checkFood(): for i, j in foodOnHand.items(): if i == 'nori' or i == 'rice' or i == 'roe': if j <= 4: print '%s is low and needs to be replenished' % i buyFood(i) Aqui montamos um forloop para percorrer os pares de chave e valor do nosso foodOnHanddicionário. Para cada valor, ele verifica se o nome é igual a um dos ingredientes que precisamos; se assim for, em seguida, verifica para ver se o seu valor for menor ou igual a 3; e, finalmente, desde que seja inferior a 3, ele chama buyFood()com o tipo de ingrediente como o parâmetro. Vamos testar isso um pouco. Tudo parece estar funcionando razoavelmente bem, então vamos passar para algumas tarefas mais reconhecimento de imagem. Passo 22: Valores Atravessando RGB - Configuração Para ir mais longe com a nossa bot, precisamos reunir informações sobre que tipo de sushi é em que o cliente bolha. Fazer isso com o getpixel()método seria muito trabalhoso porque você precisa encontrar uma área em cada balão de pensamento que tem um valor RGB único, não compartilhada por qualquer outra bolha sushi tipo / pensamento. Dada a arte do estilo do pixel, o que por sua própria natureza tem uma paleta de cores limitada, você teria que lutar toneladas de sobreposição de cores nos tipos de sushi. Além disso, para cada novo tipo de sushi introduzido ao longo do jogo, você teria que inspecioná-lo manualmente para ver se ele tem um RGB único não encontrado em qualquer um dos outros tipos de sushi. Uma vez encontrado, certamente seria em um coordenadas diferentes do que os outros para que significa armazenar cada vez mais os valores das coordenadas - 8 tipos de sushi por vezes bolha 6 locais de assento significa 48 únicas coordenadas necessário! Assim, em resumo, precisamos de um método melhor. Digite o método dois: resumo Imagem / média. Esta versão funciona fora de uma lista de valores RGB em vez de um pixel específico. Para cada instantâneo que tomar, a imagem é grayscaled, carregado em uma matriz, e então somados. Esta soma é tratado da mesma como o valor RGB no getpixel()método. Vamos usá-lo para testar e comparar várias imagens. A flexibilidade deste método é tal que uma vez que ele está configurado, no caso do nosso sushi bot, não mais trabalho é necessário em nossa parte. À medida que novos tipos de sushi são introduzidos os seus valores RGB únicas são somados e impresso na tela para nosso uso. Não há nenhuma necessidade de perseguir quaisquer coordenadas mais específicos como com getpixel(). Dito isto, ainda há um pouco de configuração necessária para esta técnica. Nós vamos precisar para criar algumas novas caixas delimitadoras para que processar apenas a área da tela que precisamos, em vez de toda a área de jogo. Vamos começar. Navegue até a sua screenGrab()função e fazer uma segunda cópia do mesmo. Renomeie a cópia para grab()e fazer as seguintes alterações: def screenGrab(): box = (x_pad + 1,y_pad+1,x_pad+640,y_pad+480) im = ImageGrab.grab(box) ##im.save(os.getcwd() + '\\Snap__' + str(int(time.time())) + '.png', 'PNG') return im def grab(): box = (x_pad + 1,y_pad+1,x_pad+640,y_pad+480) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a return a Linha 2: Nós estamos fazendo uma screengrab assim como temos antes, mas agora estamos convertendo-o em tons de cinza antes de atribuí-lo à instância im. A conversão para tons de cinza faz percorrendo todos os valores de cor muito mais rápido; em vez de cada pixel com um valor vermelho, verde e azul, ele só tem um valor que varia de 0-255. Linha 3: Nós criamos uma matriz de valores de cores da imagem, utilizando o método PIL getcolors()e atribuí-los à variávela Linha 4: Nós somar todos os valores da matriz e imprimi-los para a tela. Estes são os números que usaremos quando comparamos duas imagens. Passo 23: Ajuste New Bounding Boxes Comece um novo jogo e esperar que todos os clientes para encher. Dê um duplo clique em quickGrab.pypara tirar um instantâneo da área de jogo. Vamos precisar para definir caixas delimitadoras dentro de cada uma dessas bolhas. Zoom até que você pode ver os detalhes finos dos pixels Para cada bolha, precisamos ter certeza de canto superior esquerdo da nossa caixa delimitadora começa no mesmo local. Para isso, contam-se duas 'bordas' da esquerda interior da bolha. Queremos que o pixel branco na segunda 'borda' para marcar a nossa primeira x, y local. Para obter o par mais baixo, adicione 63 para a posição x, e 16 para o y. Isto lhe dará uma caixa semelhante à abaixo: Não se preocupe que não estamos recebendo toda a imagem do tipo Sushi. Desde que nós estamos somando todos os valores, mesmo uma pequena mudança em um pixel mudará total e deixe-nos saber algo novo está na tela. Nós vamos criar seis novas funções, cada uma versão especializada do nosso general grab()um, e preencher os seus argumentos delimitadoras com as coordenadas de todas as bolhas. Uma vez que aqueles são feitas, vamos fazer uma função simples para chamar tudo de uma vez, apenas para fins de teste. def get_seat_one(): box = (45,427,45+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_one__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_two(): box = (146,427,146+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_two__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_three(): box = (247,427,247+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_three__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_four(): box = (348,427,348+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_four__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_five(): box = (449,427,449+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_five__' + str(int(time.time())) + '.png', 'PNG') return a def get_seat_six(): box = (550,427,550+63,427+16) im = ImageOps.grayscale(ImageGrab.grab(box)) a = array(im.getcolors()) a = a.sum() print a im.save(os.getcwd() + '\\seat_six__' + str(int(time.time())) + '.png', 'PNG') return a def get_all_seats(): get_seat_one() get_seat_two() get_seat_three() get_seat_four() get_seat_five() get_seat_six() OK!Lotes de código, mas é tudo apenas versões especializadas de funções previamente definidas. Cada define uma caixa delimitadora, e passa para ImageGrab.Grab. A partir daí, converter para uma matriz de valores RGB e imprimir a soma para a tela. Vá em frente e executar isso algumas vezes durante o jogo. Certifique-se de verificar que cada tipo de sushi, independentemente de qual bolha que se encontra, mostra a mesma soma de cada vez. Passo 24: Crie um dicionário Tipos sushi Depois de verificar que cada um dos tipos de sushi é sempre exibir o mesmo valor, gravar suas somas em um dicionário da seguinte forma: sushiTypes = {2670:'onigiri', 3143:'caliroll', 2677:'gunkan',} Ter os números como a chave e as cadeias como os valores irá tornar mais fácil para baralhar as coisas de função para função sem perder o controle de tudo. Etapa 25: Criar uma classe nenhuma bolha A etapa final da nossa reunião bolha está recebendo as somas para quando não há bolhas presentes. Vamos usá-los para verificar quando os clientes vêm e vão. Comece um novo jogo e executar rapidamente get_all_seats()antes que alguém tem a chance de aparecer. Os números ele imprime vamos colocar em uma classe chamada Blank. Como antes, você poderia usar um dicionário, se preferir. class Blank: seat_1 = 8119 seat_2 = 5986 seat_3 = 11598 seat_4 = 10532 seat_5 = 6782 seat_6 = 9041 Estamos quase lá agora! Um passo final e teremos um bot simples, trabalhando! Passo 26: Juntando tudo Tempo para entregar finalmente fora de controle para o nosso bot. Nós vamos script na lógica básica que irá deixá-lo responder aos clientes, tornar as suas ordens, e reabastecer seus ingredientes quando o começam a escassear. O fluxo básico vai seguir esta: Verifique assentos> se o cliente, fazer a ordem> verificar food> se baixa, comprar comida> tabelas claras> repeat . Esta é longa; vamos começar. def check_bubs(): checkFood() s1 = get_seat_one() if s1 != Blank.seat_1: if sushiTypes.has_key(s1): print 'table 1 is occupied and needs %s' % sushiTypes[s1] makeFood(sushiTypes[s1]) else: print 'sushi not found!\n sushiType = %i' % s1 else: print 'Table 1 unoccupied' clear_tables() checkFood() s2 = get_seat_two() if s2 != Blank.seat_2: if sushiTypes.has_key(s2): print 'table 2 is occupied and needs %s' % sushiTypes[s2] makeFood(sushiTypes[s2]) else: print 'sushi not found!\n sushiType = %i' % s2 else: print 'Table 2 unoccupied' checkFood() s3 = get_seat_three() if s3 != Blank.seat_3: if sushiTypes.has_key(s3): print 'table 3 is occupied and needs %s' % sushiTypes[s3] makeFood(sushiTypes[s3]) else: print 'sushi not found!\n sushiType = %i' % s3 else: print 'Table 3 unoccupied' checkFood() s4 = get_seat_four() if s4 != Blank.seat_4: if sushiTypes.has_key(s4): print 'table 4 is occupied and needs %s' % sushiTypes[s4] makeFood(sushiTypes[s4]) else: print 'sushi not found!\n sushiType = %i' % s4 else: print 'Table 4 unoccupied' clear_tables() checkFood() s5 = get_seat_five() if s5 != Bla nk.seat_5: if sushiTypes.has_key(s5): print 'table 5 is occupied and needs %s' % sushiTypes[s5] makeFood(sushiTypes[s5]) else: print 'sushi not found!\n sushiType = %i' % s5 else: print 'Table 5 unoccupied' checkFood() s6 = get_seat_six() if s6 != Blank.seat_6: if sushiTypes.has_key(s6): print 'table 1 is occupied and needs %s' % sushiTypes[s6] makeFood(sushiTypes[s6]) else: print 'sushi not found!\n sushiType = %i' % s6 else: print 'Table 6 unoccupied' clear_tables() A primeira coisa que fazemos é verificar comida na mão. A partir daí, tirar um instantâneo de posição um e atribuir a soma de s1. Depois disso, verificar para ver que s1não é igual Blank.seat_1. Se não , nós temos um cliente. Nós verificamos o nosso sushiTypesdicionário para ver que tem uma soma igual ao nosso s1. Se isso acontecer, nós então chamar makeFood()e passar o sushiTypecomo um argumento. Clear_tables() é chamada a cada dois assentos. Apenas uma última peça restante: a configuração do loop. Passo 27: loop principal Nós vamos criar um loop while muito simples de jogar o jogo. Nós não fazer qualquer tipo de mecanismo de ruptura, de modo a parar a execução, clique no shell e pressione Ctr l + C para enviar uma interrupção de teclado. def main(): startGame() while True: check_bubs() E é isso! Atualizar a página, carregar o jogo, e definir o seu bot perder. Então, é um pouco desajeitado e na necessidade de refinamento, mas permanece como um esqueleto decente para que você possa interagir em cima. Uma versão mais completa do bot pode ser encontrada aqui . Ele tem várias correções de como se manter a par do que está sendo feito, não ficar preso nos menus de telefone e outras otimizações gerais. Conclusão Agora você tem todas as ferramentas que você precisa para ir sobre a construção de seus próprios bots simples. As técnicas utilizadas neste tutorial são bastante primitiva no mundo da Computer Vision, mas ainda assim, com persistência o suficiente, você pode criar muitas coisas legais com eles - mesmo fora do reino da bots jogo. Nós, por exemplo, executar vários scripts baseados nestas técnicas para automatizar tarefas repetitivas de software ao redor do escritório. É muito gratificante para remover uma tarefa humana com apenas algumas linhas de código. [spoiler=Créditos e link do artigo original] https://code.tutsplus.com/tutorials/how-to-build-a-python-bot-that-can-play-web-games--active-11117
  4. Opa galera , tudo certo ??? :D :D Bom , to aqui pra divulgar meu programa que desenvolvi recentemente por conta de dificuldades que eu tinha na hora de encontrar diretórios em sites com o intuito de obter informação. "o arquivo zipado tem o scan e uma wordlist que sera utilizada , mas você pode baixar outras , obs : se baixar outra wordlist , troque o nome dela para commom , para o programa identificar ela" O direcional do programa são usuários windows , mas como é python podem usar em linux também. O código está comentado , então quando abrir leiam-o e apaguem os comentários para utiliza-lo... ou então apenas apaguem os comentários e mão na massa kkk , é isso :D [spoiler=DOWNLOAD]https://www.dropbox.com/s/5c7qca2248t2qrr/DIRESCAN.rar?dl=1 [spoiler=SCAN] https://www.virustotal.com/pt/file/619366f83ebbcc9c2c26e7b48dc52f1f87df831825b656d48386c703581fb327/analysis/
  5. * Servidor = 1.5.1 * Chave da Atulização = 4 * Rate = Alta * Em fase Beta * * Vagas Para Equipe Abertas * Email Para Contato = [email protected] * Procuro Pessoal que Sabe como Administrar um Servidor ou Com Conhecimento em Web Design. - O Servidor esta Aberto Para Teste para a galerinha que ja quer começar a jogar e ajudar o servidor com feedbacks. - Link do Patch : Click Aqui - Client Compativel : Click Aqui - Site Para Cadastro : Click Aqui - Painel de Jogadores : Click Aqui - Meu Skype: zero.gxgamer
  6. Boa galera, estou com uma duvida... - Devo cadastrar uma data que o usuário fornece, exemplo: 25/07/2016. gostaria de que quando faltasse 3 dias pra chegar nessa data, um código fosse ativado, alguém tem alguma dica de como fazer isso? eu pensei em criar no banco de dados, um campo DataNow, caso ele estivesse 1, eu sei q a data ta próxima, e quando ta 0, não esta próxima. minha duvida é existe alguma função em sql que ajude com a proximidade de datas? Plataforma: php,sql
  7. Este guia é destinado a iniciantes e tem como objetivo ajudar na criação e administração básica de um banco de dados. * Criar um banco de dados: mysqladmin -h localhost -u root -p create nome_do_bd O comando acima criará um banco de dados chamado 'nome_do_bd'. A opção '-h localhost' diz em qual IP/HOST o servidor MySQL está localizado para efetuar a conexão, enquanto que as opções '-u root -p' significa para usar o usuário 'root' para fazer a ação, e perguntar por uma senha. Caso o usuário não precise de senha, a opção '-p' não é requerida. * Conectar ao banco de dados criado: mysql -u root -p nome_do_bd * Visualizar bancos de dados existentes: SHOW DATABASES; * Selecionar banco de dados: USE nome_do_bd; * Criar tabela no banco de dados: CREATE TABLE nome_da_tabela ( id int(5) unsigned zerofill NOT NULL auto_increment, nome varchar(255), localizacao varchar(50), mensagem text, data datetime, PRIMARY KEY(id) ); O campo 'id' vai ser a identificação na tabela, ele terá sempre seu número incrementado (para nunca repetir) e nunca será nulo. Como definimos o campo como int(5), que significa número inteiro de no máximo 5 dígitos, então poderemos armazenar de 00001 a 99999 identificações na tabela. O campo nome é definido com varchar(255), que significa uma string de até 255 caracteres. Então o nome da pessoa poderá ir até 255 caracteres, sendo que se o nome tiver apenas 50 caracteres, o BD irá usar apenas os 50 caracteres. Se fosse char(255), o banco de dados iria usar todos os 255 caracteres, desperdiçando memória. Coloquei 255 (que é o máximo suportado pelo varchar/char) de exagero mesmo. A localização também usa o varchar, só que com no máximo 50 caracteres 'varchar(50)'. O campo mensagem já é diferente. Ele comporta textos enormes, e não só restritos a até 255 caracteres. Esta é a caracteristica do tipo de campo 'text'. Por último o campo data, que é do tipo datetime. Quando adicionarmos uma entrada nessa tabela, a data que irá aparecer neste campo estará no formato Ano-Mês-Dia Hora:minuto:segundo. * Inserir alguns dados nesta tabela: INSERT INTO nome_da_tabela VALUES ( '1', 'Fulano', 'Acre', 'Uma mensagem qualquer', NOW() ); * Atualizar os dados da primeira linha, trocar Acre por Petrolina: UPDATE nome_da_tabela SET localizacao='Petrolina' WHERE id='00001'; No caso da atualização, pedimos ao BD para atualizar a tabela 'nome_da_tabela, mudando o campo localizacao para 'Petrolina' nas linhas que tiverem o 'id' igual à 00001. Isso só vai atualizar a linha 1. Se não tivesse a instrução 'WHERE', todos os campos localizacao de todas as linhas seriam mudados para 'Petrolina'. * Deletar essa linha do banco de dados: DELETE FROM nome_da_tabela WHERE id='00001'; * Consultar os dados da nossa tabela: SELECT id,nome,localizacao FROM nome_da_tabela; Usando o comando SELECT para visualizar os dados da nossa tabela. Com este comando podemos requisitar apenas determinados campos, na ordem que quisermos. * Consultar conteúdo da tabela: DESCRIBE nome_da_tabela; * Ver os registros da tabela: SELECT * FROM nome_da_tabela; * Contar quantas linhas tem na nossa tabela: SELECT COUNT(*) FROM nome_da_tabela; * Consultar os dados da nossa tabela ordenando por ordem alfabética no campo nome: SELECT id,nome,localizacao FROM nome_da_tabela ORDER BY nome; * Salvar todo o conteúdo de nosso banco de dados em um arquivo texto com todos os comandos: mysqldump -u root -p nome-do-bd > umnomequalquer.sql Chamaremos este arquivo de arquivo dump. O arquivo umnomequalquer.sql será criado, e se você editá-lo com um editor de texto comum, verá que ele contém vários comandos SQL para criar as tabelas do BD e colocar os dados nestas tabelas. * Importar estes dados para o seu BD, você usa o seguinte comando: mysql -u root -p nome-do-bd < umnomequalquer.sql * Deletar todos os dados da tabela 'nome_da_tabela' com o seguinte comando: DELETE FROM nome_da_tabela; * Visualizar todas as tabelas do BD: SHOW TABLES; * Deletar tabela ou Banco de dados: DROP TABLE nome_da_tabela; DROP DATABASE nome_do_bd; Todas as palavras-chaves estão com cor diferenciada do restante do texto.
×
×
  • Create New...