Inteligência Artificial
AI para simular comportamento


  Nesse capítulo vamos acrescentar algo a mais nos movimentos pré-definidos em nossos personagens. É um espécie de "vontade", algo que faça um objeto sair literalmente da rotina. Padrão de movimento   Conforme visto no capítulo anterior, os padrões de movimento quando determinísticos podem ser considerados sem AI. Entretanto, quando um objeto denota uam certa "vontade" ou reação, ele será dotado de alguma inteligência.

  Um exemplo de padrão de movimento oscilatório.
10 SCREEN 2,1
20 FOR F=1 TO 8
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
70 GOSUB 200
80 GOTO 80
100 DATA 6,6,74,FE,7C,0,0,0
200 ' Padrao mov
210 EY=95:A=10:L=50:PI=3.14159
220 FOR X=0 TO 255 STEP 3
230 Y = EY + A*SIN((X MOD L)*2*PI/(L-1))
240 PUT SPRITE 0,(X,Y),10,0
250 NEXT X
260 RETURN
Comportamento aleatório   Podemos introduzir em um padrão de movimento alguma "perturbação" aleatória. Dessa forma, o objeto poderá:
  No exemplo anterior, podemos fazer com que o objeto pare de vez em quando por 1 segundo, imitando o comportamento de um inseto.
10 SCREEN 2,1
20 FOR F=1 TO 8
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
70 GOSUB 200
80 GOTO 80
100 DATA 6,6,74,FE,7C,0,0,0
200 ' Padrao mov
210 EY=95:A=10:L=50:PI=3.14159
220 FOR X=0 TO 255 STEP 3
230 Y = EY + A*SIN((X MOD L)*2*PI/(L-1))
240 PUT SPRITE 0,(X,Y),10,0
250 N=INT(40*RND(-TIME))
260 IF N=5 THEN GOSUB 300
270 NEXT X
280 RETURN
300 ' Pausa do inseto
310 TIME=0
320 IF TIME/60 > 1 THEN RETURN ELSE 320

  No próximo exemplo, uma corrida de cavalos.

 

  O código à esquerda realiza um movimento padrão para todos os cavalos, enquanto que o código à direita introduz um passo aleatório para cada cavalo.

10 SCREEN 2,2
20 FOR F=1 TO 32
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
70 GOSUB 500:GOSUB 200
80 GOTO 80
100 DATA 00,00,00,C0,3F,7F,7F,7F
110 DATA 7F,50,50,40,00,00,00,00
120 DATA 14,1F,3F,7C,F8,F8,F8,F8
130 DATA E8,48,48,40,00,00,00,00
200 ' Padrao mov
210 EY=95:A=3:DY=0:S=.3:X=5
220 Y = EY + DY
230 PUT SPRITE 0,(X,Y-50),15,0
231 PUT SPRITE 1,(X,Y),1,0
232 PUT SPRITE 2,(X,Y+50),14,0
240 DY=DY+S: IF DY>A THEN S=-S
250 IF DY<0 THEN S=-S
260 IF X>214 THEN RETURN
270 X=X+1:GOTO 220
500 ' Cenario
510 LINE(0,0)-(255,191),12,BF
520 LINE(0,106)-(255,106),5
530 LINE(0,56)-(255,56),5
540 LINE(0,156)-(255,156),5
550 LINE(20,50)-(20,160),5
560 LINE(230,50)-(230,160),5
570 RETURN
10 SCREEN 2,2
20 FOR F=1 TO 32
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
70 GOSUB 500:GOSUB 200
80 GOTO 80
100 DATA 00,00,00,C0,3F,7F,7F,7F
110 DATA 7F,50,50,40,00,00,00,00
120 DATA 14,1F,3F,7C,F8,F8,F8,F8
130 DATA E8,48,48,40,00,00,00,00
200 ' Padrao mov
210 EY=95:A=3:DY=0:S=.3:XA=5:XB=5:XC=5
220 Y = EY + DY
230 PUT SPRITE 0,(XA,Y-50),15,0
231 PUT SPRITE 1,(XB,Y),1,0
232 PUT SPRITE 2,(XC,Y+50),14,0
240 DY=DY+S: IF DY>A THEN S=-S
250 IF DY<0 THEN S=-S
260 IF XA>214 OR XB>214 OR XC>214 THEN RETURN
270 XA=XA+INT(RND(-TIME)*5)+1
280 XB=XB+INT(RND(-TIME)*5)+1
290 XC=XC+INT(RND(-TIME)*5)+1
300 GOTO 220
500 ' Cenario
510 LINE(0,0)-(255,191),12,BF
520 LINE(0,106)-(255,106),5
530 LINE(0,56)-(255,56),5
540 LINE(0,156)-(255,156),5
550 LINE(20,50)-(20,160),5
560 LINE(230,50)-(230,160),5
570 RETURN
  Quando é utilizado o movimento padrão, os três cavalos chegam juntos. Já no outro código, os cavalos têm movimentos alearórios e poderemos ter diferentes vencedores a cada vez que rodarmos o programa.
Percepção e reação   Um objeto pode "perceber" a aproximação de outro, quando monitoramos a distância ou alinhamento entre eles.
  No exemplo a seguir, podemos movimentar a caixa azul, enquanto que a caixa cinza está parada. Quando chegarmos perto da caixa cinza, ela perceberá nossa presença e mudara para a cor verde.

   

10 SCREEN 2,0
20 FOR F=1 TO 8
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
70 F=0:X=128:Y=95:XO=INT(RND(-TIME)*248):YO=INT(RND(-TIME)*184)
80 C=STICK(0)
85 IF F=0 THEN K=14 ELSE K=12
90 PUT SPRITE 0,(X,Y),5,0
100 PUT SPRITE 1,(XO,YO),K,0
110 IF C=1 THEN Y=Y-1
120 IF C=2 THEN X=X+1:Y=Y-1
130 IF C=3 THEN X=X+1
140 IF C=4 THEN X=X+1:Y=Y+1
150 IF C=5 THEN Y=Y+1
160 IF C=6 THEN X=X-1:Y=Y+1
170 IF C=7 THEN X=X-1
180 IF C=8 THEN X=X-1:Y=Y-1
190 GOSUB 500:GOTO 80
200 DATA FF,FF,FF,FF,FF,FF,FF,FF
500 ' Monitora distancia
510 F=0
520 IF ABS(X-XO)<30 AND ABS(Y-YO)<30 THEN F=1
530 RETURN

  Uma vez detectada a presença do "inimigo", podemos fazer com que o objeto persiga, fuga, atire etc.

  No próximo exemplo, a caixa cinza irá fugir de você enquanto você estiver próximo dela.
10 SCREEN 2,0
20 FOR F=1 TO 8
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
70 F=0:X=128:Y=95:XO=INT(RND(-TIME)*248):YO=INT(RND(-TIME)*184)
80 C=STICK(0)
85 IF F=0 THEN K=14 ELSE K=12
90 PUT SPRITE 0,(X,Y),5,0
100 PUT SPRITE 1,(XO,YO),K,0
110 IF C=1 THEN Y=Y-1
120 IF C=2 THEN X=X+1:Y=Y-1
130 IF C=3 THEN X=X+1
140 IF C=4 THEN X=X+1:Y=Y+1
150 IF C=5 THEN Y=Y+1
160 IF C=6 THEN X=X-1:Y=Y+1
170 IF C=7 THEN X=X-1
180 IF C=8 THEN X=X-1:Y=Y-1
190 GOSUB 500:GOTO 80
200 DATA FF,FF,FF,FF,FF,FF,FF,FF
500 ' Monitora distancia e reage fugindo
510 F=0
520 PX=X-XO:PY=Y-YO
530 IF ABS(PX)<30 AND ABS(PY)<30 THEN F=1 ELSE RETURN
540 IF (ABS(PX)<ABS(PY)) THEN XO=XO-1*SGN(PX) ELSE YO=YO-1*SGN(PY)
550 RETURN
Máquina de estados   A máquina de estados estabelece diferentes padrões comportamentais para um objeto, de acordo com a situação em curso.
  Esse conceito envolve estados e transições, onde a ME é definida por um grafo no qual os círculos representam estados e as setas transições. O estado é o comportamento/ação corrente, enquanto que a transição indica a passagem de um estado para o outro. A transição é disparada por um dado evento no jogo.

  Exemplo do jogo Pac-Man:

 

  O jogo possui 3 estados:
  Modificando os programas anteriores, faremos o quadrado cinza buscar o quadrado azul e alterar o estado de busca para perseguição quando chegar perto, e retornar ao estado de busca quando o quadrado azul se distanciar.
10 SCREEN 2,0
20 FOR F=1 TO 8
30 READ A$
40 S$=S$+CHR$(VAL("&H"+A$))
50 NEXT F
60 SPRITE$(0)=S$
65 E=0: ' 0=busca, 1=persegue
66 DX=1:DY=1
70 X=128:Y=95:XO=INT(RND(-TIME)*248):YO=INT(RND(-TIME)*184)
80 C=STICK(0)
85 IF E=0 THEN K=14 ELSE K=12
90 PUT SPRITE 0,(X,Y),5,0
100 PUT SPRITE 1,(XO,YO),K,0
110 IF C=1 THEN Y=Y-1
120 IF C=2 THEN X=X+1:Y=Y-1
130 IF C=3 THEN X=X+1
140 IF C=4 THEN X=X+1:Y=Y+1
150 IF C=5 THEN Y=Y+1
160 IF C=6 THEN X=X-1:Y=Y+1
170 IF C=7 THEN X=X-1
180 IF C=8 THEN X=X-1:Y=Y-1
190 GOSUB 500:GOTO 80
200 DATA FF,FF,FF,FF,FF,FF,FF,FF
500 ' Monitora distancia e altera estados
510 E=0
520 PX=X-XO:PY=Y-YO
530 IF ABS(PX)<40 AND ABS(PY)<40 THEN E=1
540 IF E=0 THEN GOSUB 600 ELSE 700
550 GOSUB 800:RETURN
600 ' Busca
610 XO=XO+DX
620 YO=YO+DY
630 IF INT(RND(-TIME))*10 = 3 THEN DX=-DX
640 IF INT(RND(-TIME))*10 = 7 THEN DY=-DY
650 RETURN
700 ' Persegue
710 IF (ABS(PX)>ABS(PY)) THEN XO=XO+1*SGN(PX) ELSE YO=YO+1*SGN(PY)
720 RETURN
800 ' Verifica limites
810 IF XO<0 THEN XO=0:DX=1
820 IF YO<0 THEN YO=0:DY=1
830 IF XO>247 THEN XO=247:DX=-1
840 IF YO>183 THEN YO=183:DY=-1
850 RETURN

  Observe que para perseguir e alcançar o alvo, o teste em 710 foi alterado para maior e os sinais na mesma linha para positivo.
Sistemas baseados em regras   Quando um conjunto de regras são difíceis de modelar utilizando máquinas de estados, podemos criar um sistema baseado em regras [2]. Esse sistema é modelado utilizando-se o bom e velho "IF THEN ELSE".
  Um jogo no estilo do "The SIMS" exemplifica o uso das regras. Imagine que desejamos controlar o comportamento de uma pessoa qualquer do jogo, onde temos as seguintes situações:
  As situações seriam modeladas da seguinte maneira:
  Certamente o estado de "fome" seria modificado ao longo do tempo.



  Referências:

  [1]- História, Evolução e Técnicas de Inteligência Artificial na Criação de Jogos Eletrônicos. Souza Neto, Sá, Silva. Unitri.
  [2]- Inteligência Artificial em Jogos Eletrônicos. A.Kishimoto. Artigo em PDF.


<< Anterior   AI   Próxima >>


/MARMSX/CURSOS/Assembly