Friday, December 28, 2007

Sole


Una galassia ha tante stelle.
Tantissime.
Una delle cose che non ho mai sopportato degli space-sim nati dopo frontier è la loro scarsa credibilità nelle dimensioni.
Galassie con 400 stelle, distanze tra oggetti in un sistema solare misurate in km, ma dico son 100 km da qui a Bologna, un aereo copre quella distanza in 6 minuti, un banalissimo space shuttle ci mette 18 secondi, mi vien la claustrofobia!!
Il buon Braben invece ha voluto far le cose fatte per bene, ricordiamolo: nei primi anni novanta e in 600kb, e sia il numero di stelle che le distanze nel suo gioco sono verosimili. Si ragiona in anni luce, e le stelle sono MILIONI.

Ora, partiamo da questo secondo aspetto.. Un milione di stelle (per ipotesi), un nome per ciascuna di esse diciamo di 10 caratteri, occorre quindi memorizzare un milione di nomi. E se 10 megabytes oggi possono essere una cifra tutto sommato modesta, non ho di certo nessuna intenzione di scrivere 10 miloni di caratteri.
E' molto piu' furbo farli generare automaticamente. L'idea è quella di costruire un array di 30 stringhe, ciascun elemento contiene una sillaba. "se", "lo", "kar", ecc... Per ogni stella vado a pescare 1,2 oppure 3 sillabe, prese a caso da questo elenco, e le concateno.
Si ottengono nomi tutto sommato plausibili "sekar" "karlose" ecc..
Rimane il problema di memorizzare un milione di nomi... ma non ce n'e' bisogno. Infatti il generatore di numeri casuali ha una proprieta', chiamata seme, per la quale, a parita' di seme, genera sempre la stessa sequenza di numeri casuali... cosi' se imposto il seme 44, posso avere una sequenza del tipo 1,42,9,58,7,22,... se imposto il seme = 2, potrei ottenere 95, 24, 4, 0, 11,...
ma se lo reimposto di nuovo a 44, otterro' nuovamente 1,42,9,58,7,22,...
Percio', una volta divisa la galassia in una griglia, e chiamato ciascun elemento della griglia "settore", ho che ogni settore ha una coordinata x,y che lo identifica univocamente. Se dalla coppia x,y ricavo un numero, ad esempio s = x+100*y, sono sicuro che:

  1. il numero s è unico per ogni settore della galassia
  2. il numero s può essere utilizzato per impostare il seme per la generazione dei numeri casuali
Morale: dividendo la galassia in settori (un rettangolo verde della griglia che vedete in foto), riesco al volo a decidere il nome della stella, senza bisogno di memorizzarlo. Basta impostare il seme e andare a pescare con il generatore di numeri casuali tra le sillabe.

Come potete vedere la cosa funziona, ed è un sistema che mi permette di gestire decine di milardi di miliardi di stelle in pochi kappa. L'unico problema (per ora) è la generazione a volte di nomi duplicati. Ma di questo parleremo un'altra volta: si' ho in mente una soluzione

4 comments:

Anonymous said...

"L'unico problema (per ora) è la generazione a volte di nomi duplicati. Ma di questo parleremo un'altra volta: si' ho in mente una soluzione"

Senti questa mia idea se ti piace ...

1) Creerei un array abbastanza corposo, già questo elemento mi sembra importante, anche per creare nomi che siano VARI. (Pensa che scocciatura un universo fatto da soli che si chiamano Kar-lo-se, Se-lo-kar, Lo-kar-se ...
2) Farei in modo che ad una stella su 3 venisse attribuita una ulteriore desinenza (Karlose Ventur, Selokar Magnico, Lokarse Fasangi) ed una stella su 3 un suffisso (Alto Karlose, Nuovo Selokar, Grande Lokarse). In pratica un secondo array con una 30ina di termini da "moltiplicare" con quelli dell'array principale.
3) Inoltre darei ad una stella su 2 anche un numero, che potrebbe essere dato dal settore, o un numero casuale. (Alto Karlose 44, Lokarse 23)

Se la tua soluzione è migliore della mia - probabile visto che non ci sono stato nemmeno 1 secondo a rifletterci su:) - considera cmq questa mia proposta per generare nomi pi vari e complessi.

INOLTRE, considera che è opportuno trasformare in MAIUSCOLA la prima lettera della stringa concatenata.

Ciao
Fabio

PdG said...

Inanzitutto grazie per il commento.

Beh l'idea e' ovviamente quella di non usare meramente sillabe prese a caso, ma di metterci un po' di "sugo". Ad esempio utilizzare come dici tu, in maniera random, talvolta, prefissi.. pensavo a qualcosa tipo "alpha", "beta", "tau" (per l'appunto).
Inoltre pensavo di aggiungere alle stelle create randomicamente anche qualcuna di reale, per dare un tocco di realismo al tutto, com'era del resto su frontier dove c'era alpha centauri, il sole, e qualcun'altro.

Anonymous said...

"alpha", "beta", "tau", sono un classico!!! Non dimenticare "delta" e "cigni", "draco" e similari.
Nel gruppo ci butterei dei nomi (che non so se esistono già davvero) che sembrano molto plausibili per delle stelle, ne butto giù un paio a caso "Socratica, Artistotelica, Eisteniana, New Hope, Speranza, Rossa, etc.
Immancabili sono quelle reali famossissime, OVVIAMENTE devi metterle. Dovresti porti il problema di realizzare BENE il Sstema Solare (sono certo dedicherai + di un post a questo problema).
Riassumendo:
1) un database con stelle reali (piazzate correttamente sulla mappa)
2) un database con stelle dai nomi possibili, ed "estraibili 1 sola volta"
3) un database con sillabe (Kar, lo, se, etc.)
4) un database di prefissi e/o desinenze varie
5) aggiunta di numeri o lettere (sigle) casuali ai nomi generati attraverso i database precedenti.
Giusto per ottimizzare un poco ...
il database di sillabe probabilmente lo potresti evitare, generando nomi casuali derivati da lettere random. Basta generare alternativamente lettere e vocali sino a formare stringhe di X caratteri. Potresti anche prevedere che in taluni casi vengano generati gruppi di lettere del tipo st, cr, gl, gl, tr, etc. etc.
Mi piacerebbe sapere cosa ne pensi, o se hai in mente delle soluzioni alternative.

Anonymous said...

Il nome tauSOKA (delle stelle in basso) potrebbe sembrare un'offesa per il nome del gioco! :)

Ciao
Keeper182