È sempre dipendente dal dominio. Ma ci sono anche due situazioni in cui faresti questo tipo di ricerche. Quella situazione è dopo una mossa (una modifica al campo di gioco fatta dal giocatore), e l'altra sarebbe se/quando l'intera scacchiera è cambiata.
In Tetris, non è necessario eseguire la scansione dell'intera scheda dopo che un pezzo è caduto. Dovresti solo cercare le righe che il pezzo sta toccando.
In giochi match-3 come Bejeweled, in cui si scambiano due pezzi adiacenti alla volta, per prima cosa si esegue una ricerca localizzata in ciascuna direzione attorno a ciascun riquadro che è cambiato, per vedere se alcuni pezzi si sono attivati. Quindi, se lo fanno, il gioco scaricherà alcuni nuovi pezzi casuali sul tabellone. Ora, è possibile eseguire la stessa ricerca localizzata su ogni quadrato che è cambiato, ma ciò potrebbe comportare un gran numero di dichiarazioni if
e potrebbe essere effettivamente più lento semplicemente scansionare l'intera scheda da in alto a sinistra in basso a destra. Dipende dalla tua implementazione e richiederebbe la profilazione.
Come dice Adrian, è sufficiente un semplice array 2D. Spesso, tuttavia, è possibile aggiungere un "bordo" di pixel attorno a questo array, per semplificare l'aspetto della ricerca per i motivi. Senza un bordo, dovresti avere le affermazioni if
lungo i quadrati che dicono "beh, se sei nella riga superiore, non cercare (e uscire dalla matrice)".Con un bordo intorno a esso, puoi tranquillamente cercare tra le cose: salvando te stesso le dichiarazioni if
, risparmiandoti ramificazioni, risparmiando problemi di pipeline, cercando più velocemente.
Per Jon: questo genere di cose conta davvero nelle impostazioni ad alte prestazioni, anche su macchine moderne, se si sta eseguendo un algoritmo di ricerca per giocare/risolvere il gioco. Se lo sei, vuoi che la tua simulazione di fondo funzioni il più rapidamente possibile per cercare il più profondo possibile nel minor numero di cicli.
fonte
2009-08-28 18:40:49