Introduzione
Attualmente, quando si osserva un moderno videogioco, si
viene colpiti dalla grafica incredibile, quasi reale, dal sonoro
coinvolgente e dall'atmosfera "magica" che esso riproduce;
ma questo basta per creare un gioco che sia anche divertente ed
accattivante?
Una delle caratteristiche fondamentali presenti in un prodotto
ludico è il "comportamento" dei personaggi virtuali
automatizzati, ossia controllati dal computer. Il loro
"atteggiamento" influenza in modo notevole la
giocabilità: avversari troppo stupidi rendono la sfida troppo
semplice e noiosa, al contrario, avversari troppo intelligenti la
possono rendere impossibile e nevrotica.
Questo "dettaglio", molte volte troppo trascurato dalle
software house, può pregiudicare un ottimo prodotto, rendendolo
poco appetibile al pubblico e, fatto non trascurabile, avaro di
soddisfazioni e soprattutto di vendite.
Com'è facile intuire, per realizzare un videogioco moderno, non
servono solamente grafica sbalorditiva e sonoro in dolby sorround,
è necessario ricreare, virtualmente, le condizioni per le quali il
giocatore sia totalmente immerso nel "mondo" creato per
lui dal programma.
Il modo in cui, un oggetto virtuale interagisce e/o risponde allo
stimolo indotto da altri oggetti virtuali presenti nel suo universo
digitale viene definito, in modo più o meno lecito, intelligenza
artificiale. Il livello di complessità degli algoritmi
utilizzati per simulare il comportamento dipende molto dalla
tipologia di gioco e di pseudo-realismo che si vuole ottenere. In
alcuni prodotti la codifica dell'intelligenza artificiale si riduce
a poche linee di codice, in altri invece, sono necessari molti mesi
di attenta progettazione.
Come spesso accade, in particolare quando si prendono in esame
prodotti che necessitano di brevi tempi di calcolo come i videogame,
si usano algoritmi semplici e non computazionalmente complessi, che
danno "l'illusione" di metodi raffinati, fondamentale è
il risultato che deve essere raggiunto: realizzare oggetti con
"comportamenti" ragionevoli e coerenti all'interno
dell'universo creato.
Non essendo un articolo di carattere tecnico ma solamente
introduttivo non verranno trattati algoritmi complessi, si tenterà
di illustrare i metodi e le tecniche maggiormente usate.
Distanza tra oggetti ed aree di
attivazione
Un sistema estremamente utile per realizzare un primitivo
sistema di "intelligenza" è il calcolo della distanza tra
due oggetti virtuali. Prendiamo, per puro esempio, la simulazione di
una sentinella; la sua aggressività può aumentare con
l'avvicinarsi di un personaggio. Per rendere maggiormente realistico
il suo comportamento si può controllare se il personaggio è
all'interno dell'area visiva della sentinella, aggiungendo un
vettore che indichi la direzione dello sguardo.
In alcuni casi è molto utile inserire delle "aree di
attivazione", ossia zone nelle quali l'oggetto virtuale si
comporta in un modo piuttosto che in un altro, con questo sistema si
possono simulare allarmi, mine, ecc.
Con l'uso di questi due semplici metodi è possibile realizzare
comportamenti pseudo-realistici, è doveroso specificare che la
semplicità di questi sistemi è legata all'ambiente virtuale sui
quali vengono usati. Calcolare se un personaggio virtuale
"vede" un oggetto all'interno di una stanza vuota è molto
più semplice che calcolarlo all'interno di una stanza piena di
oggetti.
Tabelle di movimenti
L'uso di tabelle di movimenti è una tecnica usata
principalmente nei videogame di alcuni decenni or sono. E' molto
semplice da realizzare, non necessita di calcoli matematici ed è
ragionevolmente realistica. Ovviamente il difetto maggiore è la non
elasticità di questo sistema.
Nonostante questo tipo di tecnica sia antiquata è possibile
utilizzarla in modo proficuo: realizzando tabelle di movimenti da
utilizzare solo in alcuni casi particolari, evitando accuratamente
di inserire valori assoluti ma solamente dei delta di posizione. In
questo modo è possibile creare dei percorsi che possono essere
compiuti dal nostro oggetto, consentendogli di poterli variare
cambiando tipo di tabella. In questo caso è utile avere un buon
numero di tabelle differenti, selezionabili in base a determinati
eventi.
Inseguimento e fuga
Un altro ottimo sistema per simulare comportamenti di
oggetti virtuali all'interno di un videogame consiste
nell'utilizzare algoritmi di inseguimento, in particolare se si
intendono realizzare prodotti di tipo arcade, come gli sparatutto.
Creare un oggetto che insegue un altro è facile: aventi le
coordinate spaziali di entrambi, si muove l'inseguitore verso la
direzione dell'inseguito. Questo metodo è molto semplice ma
riduttivo, si ipotizza che ci si trovi in ambienti privi di
ostacoli, nonostante ciò è molto utile per realizzare kamikaze o
missili a ricerca. Un altro metodo applicabile consiste nel
tracciare tutti i movimenti dell'inseguito e farli ripercorrere
dall'inseguitore, in questo modo si evita il problema riscontrato
nel sistema precedente: è possibile utilizzarlo in ambienti non
vuoti.
Prendiamo ora in esame il sistema che si contrappone
all'inseguimento: la fuga. Se l'ambiente virtuale in cui deve essere
eseguito è privo di ostacoli, allora non si deve fare altro che
eseguire il movimento opposto dell'inseguitore. In ambienti con
ostacoli l'algoritmo diventa più complesso, solitamente si indica
all'oggetto che deve fuggire una "via di fuga".
Menzione a parte merita il sistema per uscire da un labirinto;
nonostante possa sembrare un metodo poco utile nello sviluppo
di un videogame, esso propone alcune caratteristiche interessanti.
Se consideriamo l'algoritmo come:
do {
procedere mantenendosi sulla
destra;
se si incontra una diramazione procedi sulla destra;
se si giunge in un vicolo cieco inverti la direzione
originaria;
} fino all'uscita; |
si può notare come sia possibile modificarlo per creare sistemi
di inseguimento e di fuga migliori di quelli precedentemente presi
in esame, è sufficiente cercare di trovare un punto specifico,
solitamente un avversario o una via dell'uscita e il gioco è fatto.
Ovviamente la complessità dell'algoritmo è abbastanza elevata ed
è necessario tenere presenti alcune cose: vedere delle creature che
"strisciano" attaccate a dei muri non è molto realistico,
la direzione della creatura deve cambiare in base alla posizione del
punto che si intende trovare, si deve integrare l'algoritmo di
ricerca con altri sistemi maggiormente performanti da utilizzare nei
momenti più opportuni. Sarà lo sviluppatore, considerando il
livello di realismo e la complessità di realizzo, a decidere quali
sistemi adottare, la cosa fondamentale è il risultato che si
ottiene.
Macchine
Tutte le tecniche per simulare intelligenza da parte di
oggetti virtuali esaminate sino ad ora sono interessanti, utili e
non sono complicatissime da realizzare, hanno un notevole difetto:
non possono essere utilizzate per la creazione di intelligenza
complessa, questo è dovuto al fatto che ogni algoritmo simula un
solo comportamento.
Per ovviare a ciò è possibile utilizzare delle macchine a stati
finiti, ossia una macchina simulata per mezzo di software in grado
di modificare il proprio stato in risposta ad eventi. Prendiamo in
esame gli algoritmi di distanza, aree di attivazione, inseguimento,
fuga e tabelle, se vogliamo simulare una sentinella possiamo creare
una serie di eventi che determinano il metodo usato per il suo
comportamento:
| Evento |
Algoritmo |
Comportamento |
| Nemico molto lontano |
Tabella |
Continua la ronda |
| Nemico lontano |
Tabella |
Stato di allerta |
| Nemico vicino |
Inseguimento |
Allarme + insegui il nemico |
| Sentinella ferita |
Fuga |
Salvati |
Com'è possibile osservare, il solo utilizzo di una macchina a
stati e di alcuni semplici algoritmi, hanno permesso una buona
simulazione di una creatura. Ovviamente, maggiore è il numero di
eventi che si possono verificare, maggiore è il realismo prodotto.
Probabilità
Nella realizzazione di molti videogame ci si imbatte con
il concetto di casualità e di probabilità, pensiamo per esempio
alla simulazione del lancio di un dado. Essendo concetti
matematicamente non perfettamente calcolabili, possono essere
simulati in modo molto simile alla realtà, ma possono simulare
comportamenti di oggetti o creature? Ovviamente non si ci può
affidare alla sola casualità o fortuna, ciò renderebbe la
simulazione altamente approssimativa e perciò insignificante dal
punto di vista algoritmico.
Nonostante le premesse poco rassicuranti, mediante l'uso di
sistemi basati sulla probabilità e sul caso, è possibile ricreare
situazioni comportamentali abbastanza realistiche. Ciò si verifica
creando sistemi di scelta pilotati, impostando eventi con
probabilità maggiore rispetto ad altri. Per esempio, considerando
la simulazione di una sentinella, possiamo impostare l'algoritmo
come:
Nemico molto lontano
| Probabilità |
Comportamento |
| 70% |
Continua la ronda |
| 15% |
Riduci la distanza con il nemico |
| 10% |
Dai l'allarme |
| 5% |
Spara |
Per scegliere il comportamento da adottare basta calcolare un
valore casuale tra 1 e 100 e controllare a quale tipo di
"probabilità" appartiene, quindi si imposta l'algoritmo o
gli algoritmi relativi all'azione da compiere.
Sistemi
Euristici
In alcuni prodotti si ha la necessità di controllare e
di manovrare gli oggetti virtuali creando una vera e propria
tattica. Purtroppo tutti gli algoritmi presentati sino ad ora
caratterizzano il comportamento di un solo oggetto, per creare
qualcosa che li manovri in modo coerente si deve impostare un metodo
che "valuti" le caratteristiche e le posizioni, in modo
che sia possibile modificarle per ottenere un vantaggio rispetto
all'avversario.
In generale si crea una funzione che valuti la situazione
corrente, si modifica la situazione, si valuta la modifica
apportata, se porta ad un miglioramento si continua con la tattica
presa in esame altrimenti se ne cerca un'altra. Al termine si
eseguirà la modifica che ha portato i miglioramenti più evidenti o
che li recherà nel proseguito della partita virtuale. Il modello di
valutazione che viene sviluppato attribuisce agli oggetti valori
definiti dalla programmatore, questi valori non sempre sono assoluti
ma spesso derivano dall'esperienza che lo sviluppatore ha
accumulato, ovviamente questo porta alla realizzazione di sistemi
che non sempre sono precisi ed affidabili.
Conclusione
Come si può capire, ci sono moltissimi modi per creare
"intelligenza artificiale" all'interno di videogame,
quelli che sono stati presentati sono solo alcuni mentre per altri
abbiamo solamente dato una sparuta occhiata. Sarà lo sviluppatore a
comprendere le problematiche inerenti al prodotto su cui sta
lavorando ed a scegliere il metodo che più ritiene opportuno.
Copyright © 2000
Ing. Stefano Tamascelli
www.xteamsoftware.com
Articolo#11: [pubblicato
il 04/11/00] |