Sto cercando di scrivere un risolutore in C # .NET per un gioco noto come Flowerz. Per riferimento, puoi riprodurlo su MSN, qui: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Lo sto scrivendo per divertimento, non per nessun tipo di incarico o lavoro correlato. Per questo motivo, l'unico limite è il mio computer (un core Intel i7, con 8 GB di RAM). Non ha bisogno di correre altrove, per quanto mi riguarda.
In breve, le sue regole sono così:
- C'è una coda piena di fiori colorati. La sua lunghezza è arbitraria
- La coda non può essere influenzata
- La coda viene generata all'inizio del livello
- I fiori hanno uno o due colori.
- Se ci sono due colori, allora c'è un colore esterno e un colore interno. Nel caso di due colori, il colore esterno viene utilizzato per l'abbinamento.
- Se c'è una corrispondenza, il colore esterno scompare e il fiore ora è un fiore a un colore con lo stesso colore del fiore interno
- L'obiettivo del gioco è quello di creare partite di tre (o più) dello stesso colore
- Quando un fiore di un singolo colore fa parte di una corrispondenza, viene rimosso dal campo di gioco, creando uno spazio vuoto
- Puoi abbinare un singolo fiore di colore al colore esterno di un fiore di due colori. In questo caso, il fiore monocolore scompare, il colore esterno del fiore bicolore scompare e il colore interno rimane
- Vinci il round quando la coda è vuota e rimane almeno uno spazio vuoto
- Sono possibili partite a cascata. Una cascata è quando tre (o più) fiori esterni scompaiono e quando i loro colori interni formano un'altra catena di 3 (o più fiori).
- Il campo di gioco è sempre 7x7
- Alcuni spazi sul campo sono coperti da rocce
- Non puoi posizionare fiori sulle rocce
- La coda può contenere anche una vanga che puoi usare per spostare qualsiasi fiore posizionato in uno spazio non occupato
- Devi usare la vanga, ma in realtà non devi spostare il fiore: è perfettamente legale rimetterlo da dove è arrivato
- La coda può contenere anche una farfalla colorata. Quando usi questa farfalla su un fiore, il fiore assume il colore della farfalla
- Applicando una farfalla a un fiore con due colori, il fiore ottiene un solo colore, cioè quello della farfalla
- Puoi sprecare la farfalla su uno spazio vuoto o un fiore che ha già questo colore
- Cancellare il campo non vince la partita
L'obiettivo del risolutore è semplice: trovare un modo per svuotare la coda, con il maggior numero possibile di spazi rimanenti sul campo di gioco. Fondamentalmente, l'IA gioca il gioco per me. L'output del solutore è un elenco con le mosse trovate. Non sono interessato al punteggio, ma alla sopravvivenza il più a lungo possibile, quindi sono interessato alle mosse che lasciano il maggior numero possibile di spazi aperti.
Inutile dire che lo spazio di ricerca cresce rapidamente più aumenta la coda, quindi una forza bruta è fuori discussione. La coda inizia alle 15 e cresce con 5 ogni due o tre livelli, se ricordo bene. E, naturalmente, posizionare il primo fiore su (0,0) e il secondo su (0,1) è diverso dal posizionare il primo fiore su (1,0) e il secondo fiore su (0,0), specialmente quando il campo è già popolato con fiori di un round precedente. Una decisione così semplice potrebbe fare la differenza nel farcela o no.
Le domande che ho sono le seguenti:
- Che tipo di problema è questo? (pensa al commesso viaggiatore, allo zaino o ad altri problemi combinatori). Sapere questo potrebbe rendere il mio Google Fu un po 'meglio.
- Che tipo di algoritmo potrebbe darmi buoni risultati, in fretta?
Riguardo a quest'ultimo: all'inizio, ho provato a scrivere il mio algoritmo euristico (in sostanza: come lo risolverei, se conoscessi la coda?), Ma questo si traduce in molti casi limite e punteggi corrispondenti che potrei perdere.
Stavo pensando di usare un algoritmo genetico (perché almeno so come usarlo ...), ma sto avendo dei problemi nel decidere una rappresentazione binaria della scheda. Quindi c'è il problema del crossover, ma che può essere risolto con un operatore di crossover ordinato o un tipo simile di operazione.
La mia ipotesi è che il risolutore debba sempre conoscere la configurazione della scheda e la coda che sta cercando di svuotare.
Conosco alcuni altri algoritmi euristici come reti neurali e sistemi di logica fuzzy, ma mi manca l'esperienza per sapere quale è il più applicabile, o se ce ne sono altri che si adattano meglio al compito da svolgere.