Italian matrice in Mysql

LordZenzo

Well-Known Member
Licensed User
Longtime User
una domanda semplice semplice
se volessi salvare una matrice (100x100x100) di valori int in un database MySql?

nella matrice solo alcuni valori sono utili
per la precisione si inizia con un solo valore utile, per poi crescere di numero col progredire del gioco
la matrice dovrebbe essere il terreno di gioco dove si costruisce il formicaio che cresce pian piano
non saranno mai proprio tutti utili ma devo pensare al peggio
 

LucaMs

Expert
Licensed User
Longtime User
Sicuro che ti serva solo una matrice di interi? Come se fosse MiaMatrice(x, y, z) = 99 ?

Se è cosi, parlando di DB in generale, potresti creare una tabella con due campi.

a) il primo sarà l'indice della matrice.
b) il secondo, il contenuto (99 nell'esempio).

Per "costruire" a) hai due possibilità:

1) usare un campo di testo, unendo i valori da 0 a 99 di ogni dimensione (es. avrai un record con "010971" e valore 99 che corrisponderà a MiaMatrice(1,9,71) = 99)
2) usare un campo numerico e sviluppare una funzione che lo calcoli, passandogli x,y,z (un po' più complicato, anche perché forse ti servirà anche la "funzione inversa" per ottenere da un indice le tre coordinate). Il calcolo è un po' come usare un "sistema centenario" invece che decimale, binario, ottale... cioè un "sistema a base 100".

Sia che usi 1) o 2), anche se il primo valore utile non si troverà in (0,0,0) ma, come nell'esempio, in (1,9,71), non dovrai avere subito 100x100x100 = 1.000.000 di record
 
Last edited:

udg

Expert
Licensed User
Longtime User
Se il valore di ciascuna "cella" sarà semplicemente un presente/assente (quindi un boolean) allora potresti anche pensare ad un array che utilizzi l'indice come la coordinata z (e quindi la profondità del formicaio) e come valore una stringa di 10k valori 0/1 che rappresenta il "piano" 100x100 ad un data profondità.
Sul DB, da MySql 5.0.3 in avanti puoi scegliere se andare di varchar o text.
Riprendendo l'esempio di LucaMs con x=1, y= 9 e z =71 avresti qualcosa tipo:
s=formicaio(z-1)
if s.charat((y-1)*100+x) = "X" then 'casella occupata

..magari dopo aver verificato che in B4x una stringa possa contenere 10k caratteri cosa che io non ho fatto..eheh.
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
in effetti avevo pensato ad entrambi i metodi, usando le stringhe, o anche pensando ad un campo blob che contenga tutta la matrice da caricare e scaricare in blocco, la mia perplessita sta nelle dimensioni , immaginando 1000 utenti che si caricano 1000000 di valori int lo spazio web ho paura finisca presto....., e ho bisogno di int perche a parte se ce terra o no devo ipotizzare anche la presenza di oggetti
prevedo tanto lavoro in php, o meglio nel parsing del risultato della query
nb il blob a volerlo usare pero non sono capace
 

LucaMs

Expert
Licensed User
Longtime User
Immagino che non sia un multiplayer (per il quale un terreno sarebbe condiviso da più utenti e quindi risparmieresti UN PO'), visto che dici:
immaginando 1000 utenti che si caricano 1000000 di valori int lo spazio web ho paura finisca presto

Da altro che hai scritto, è presumibile che non tutto il terreno occuperà un intero, quindi penso che il metodo che ti ho suggerito sia buono.
L'unica cosa da aggiungere è il fatto che la tabella deve poter essere riutilizzata quando un gioco termina e che la tabella dev'essere in qualche modo legata ad un utente (si può fare in vari modi).
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
pensavo ad un multi, ma con i terreni non condivisi, tipo quelli della fattoria, anche perche non saprei come gestire un vero multilayer, e poi il formicaio non puo essere di piu utenti, la matrice deve contenere la struttura del formicaio e i 100x100x100 è il massimo spazio utile per costruire caverne e cunicoli nelle tre dimensioni, potrebbe essere condiviso il terreno iniziale, a due dimensioni, dove la formica cerca il luogo per fondare la colonia, ma per ora gioco singolo e terreno piccolo
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
altra domanda su questo argomento
sto usando il sistema consigliato da LucaMs
ora nel database compaiono n record formati da {Nomeutente:cella}
dove cella ha il formato "x,y,z,tipo"
per recuperare i dati uso
job.Download("http://www.giannini-lorenzo.com/Mondo1/xxxx.php?id=" & accountName & "&chk=" & MD5 )

che mi torna una matrice per cui

If val.StartsWith("[") Then
parser.Initialize(jobd.GetString)
Ll = parser.NextArray
k=0
Do Until k=Ll.size
Mm = Ll.Get(k)
cel =Mm.Get("Cella")
XYZT=Regex.Split(",",cel)
Formicaio(XYZT(0),XYZT(1),XYZT(2))=XYZT(3)
k=k+1
Loop
jobd.Release

ma mi sorge il dubbio sul limite del job, infatti sembra che gli ultimi valori non vengono caricati
che limiti ci sono? e come superarli?
 
Top