[Ajuda]-IA num joguinho

10 respostas
J

[color=blue]

Na verdade, não é bem uma IA, tá mais para burlar o jogo. Tipo, tem um jogo na net que para joga-lo você precisa formar palavras, dadas 5 letras. O jogo aceita você digitar pelo teclado. É o seguinte, eu fiz um pequeno teste, usando a classe Robot, e dá para “burlar”.
O que eu não estou conseguindo fazer:
1-A primeira coisa que o programa vai fazer é pegar 5 letras digitadas pelo usuário (as cinco que o jogo informar). Porém, eu fiz um teste para pegar essas letras, e o programa acaba antes do usuário digitar, como faço para o programa esperar que o usuário digite?
2-Só quero que o programa pare de rodar quando o usuário teclar “ESC”, ae o programa finaliza, caso contrário ele continua rodando. Isso faz parte da questão “1” se for ver…

–> Se possivel, colocar um código exemplo da parte do usuário digitar 5 letras…tipo, não tem lugar para digitar as letras, o programa tá rodando, o usuário digita, o programa pega…isso que quero.

[/color]

10 Respostas

R

posta o código que fica mais fácil…

J

[color=blue]
Na verdade, só fiz o teste para ver se o Robot funcionava…mas quando tentei colocar algo como:[/color]

public void keyPressed(KeyEvent evt){ letters[0] = evt.getKeyCode(); letters[1] = evt.getKeyCode(); letters[2] = evt.getKeyCode(); letters[4] = evt.getKeyCode(); } [color=blue]
Isso não está mto certo xD

Esse seria o teste que fiz, mas dps vou melhorar…[/color]

public class RobotTest {

	public static void main(String[] args) {
		
		ArrayList<Integer> teclas = new ArrayList();
		teclas.add(KeyEvent.VK_A);
		teclas.add(KeyEvent.VK_B);
		teclas.add(KeyEvent.VK_C);
		teclas.add(KeyEvent.VK_D);
		teclas.add(KeyEvent.VK_E);
		teclas.add(KeyEvent.VK_F);
		teclas.add(KeyEvent.VK_G);
		teclas.add(KeyEvent.VK_H);
		teclas.add(KeyEvent.VK_I);
		teclas.add(KeyEvent.VK_J);
		teclas.add(KeyEvent.VK_L);
		teclas.add(KeyEvent.VK_M);
		teclas.add(KeyEvent.VK_N);
		teclas.add(KeyEvent.VK_O);
		teclas.add(KeyEvent.VK_P);
		teclas.add(KeyEvent.VK_Q);
		teclas.add(KeyEvent.VK_R);
		teclas.add(KeyEvent.VK_S);
		teclas.add(KeyEvent.VK_T);
		teclas.add(KeyEvent.VK_U);
		teclas.add(KeyEvent.VK_V);
							
		try{
			Robot robot = new Robot();
			robot.keyPress(KeyEvent.VK_ALT);
			robot.keyPress(KeyEvent.VK_TAB);
			robot.delay(300);
			robot.keyRelease(KeyEvent.VK_ALT);
			robot.keyRelease(KeyEvent.VK_TAB);
			
			for(int i = 0, j = 20; i < 21; i++, j--){
				robot.keyPress(teclas.get(i));
				robot.keyRelease(teclas.get(i));
				robot.delay(50);
				if((i + 2) < 21){
					robot.keyPress(teclas.get(i + 2));
					robot.keyRelease(teclas.get(i + 2));
					robot.delay(50);
				}
				robot.keyPress(teclas.get(j));
				robot.keyRelease(teclas.get(j));
				robot.delay(50);
				robot.keyPress(KeyEvent.VK_ENTER);
				robot.keyRelease(KeyEvent.VK_ENTER);
				robot.delay(50);
			}
		}
		catch(AWTException e){
			
		}
	}
}
ViniGodoy

Você conseguiu burlar algo?

Que eu saiba, o robot só funciona no próprio programa que ele é criado.

Se quer fazer algo que interaja com um programa externo, terá que usar C++, mais ou menos como eu faço no jogador de bejeweled:
http://vinigodoy.wordpress.com/meus-jogos

J

ViniGodoy…eu tentei testar esse jogo seu e sempre dá: “jogo nao encontrado”

porém, não é bem “burlar”…como o jogo se joga com o teclado, eu faço o robot dar um alt+tab para ir na página do jogo, e faço ele apertar teclas…e funciona sim…
xD

ViniGodoy

Estranho, aqui o jogador de bejeweled funcionou.
Você deixou a aplicação visivel, conforme dizia as explicações do site?

É que se vc deixar o aplicativo na frente, aí não funciona mesmo, pq ele usa screenshot para ler a tela.

Você terá que ter duas threads no seu programa. Uma delas vai escutar os eventos e adicionar a tecla digitada numa classe. Quando chegar em 5 letras, essa classe deve dar um “notifyAll()”.

A outra thread estará dormindo (com um comando wait()) esperando pelas 5 letras. Ela acorda assim que receber o notifyAll().

Para mais informações:
http://java.sun.com/docs/books/tutorial/essential/concurrency/

J

" A outra thread estará dormindo (com um comando wait()) esperando pelas 5 letras. Ela acorda assim que receber o notifyAll()."

vê se eu entendi: e nessa thread é que estará todo o funcionamento do robot?

Você usa um screenshot, tipo printscreen, para ler o “tabuleiro” do jogo? o.O’

ViniGodoy

O funcionamento do Robot estará dividido na thread de leitura e na outra, que fará a escrita. Por isso é bom sincronizar o acesso ao robot também.
Ou para a thread de leitura quando estiver fazendo a escrita.

É isso mesmo. A aplicação precisa “ver” a tela tanto quanto você.
E também irá controlar seu mouse, para poder clicar nos diamantes certos.

Veja lá, é impressionante como joga rápido e certo.

J

ViniGodoy:

É isso mesmo. A aplicação precisa “ver” a tela tanto quanto você.
E também irá controlar seu mouse, para poder clicar nos diamantes certos.

Veja lá, é impressionante como joga rápido e certo.

é…eu não estava deixando o jogo visivel…mas impressionante mesmo é oq vc fez…tenho nem idéia do que utilizou para manipular o screenshot…mto bom!

J

[color=blue]
Bom, dei uma estudada no tuto que foi passado, e já vou tentar implementar alguma coisa…
Agora o problema volta a ser o que tinha^^’
Como pegar as letras digitadas…
[/color]

public class ManageThreads {
	
	private char[] letras;
	private boolean userTime = true;
	
	public synchronized void pegaLetras() {
		while(userTime) {
			try {
				wait();
			} catch(InterruptedException e) {}
		}
		/*AQUI QUERO PEGAR AS 5 LETRAS
		 * DIGITADAS PELO USUÁRIO E
		 * GUARDA-LAS NO "char[] letras"
		 */		
		userTime = true;
		notifyAll();
(...)
J

[color=blue]
Bom, eu coloquei um JOptionPane.showInputDialog para pegar as letras, porém ele nunca aparece…alguém sabe pq?
Como o código não é muito pequeno, então coloquei no “pastela”…tem 4 classes…
Código: http://paste.la/2553
[/color]

Criado 2 de agosto de 2008
Ultima resposta 3 de ago. de 2008
Respostas 10
Participantes 3