Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Basi di dati ~ informatica triennale
 
progetto da consegnare a settembre.
Clicca QUI per vedere il messaggio nel forum
carla86
Io sono alle prime armi cn php e mysql; e devo consegnare il progetto a settembre..
Sono a buon punto ma vorrei avere un parere sulla gestione dei turni.
Mi spiego meglio: Il testo dice ke un giocatore quando non è di turno può visualizzare i suoi dati (la nazione, quanti pi, quante citta e cosi via...) quindi nn lo posso sloggare ma allo stesso tempo gli devo togliere la possibilità d fare azioni..
Cosa avete fatto voi?

GRAZIE

darkshadow
 
un bel flag sul db (attivo, non attivo)??? se attivo è il suo turno altrimenti vede solo le statistiche.

carla86
ok ma quindi tu nn hai considerato i connessi e i nn connessi ma semplicemente tutti..

x fare finire il turno hai messo un semplice bottone o anke una scadenza d tempo della sessione?

darkshadow
Originally posted by carla86
ok ma quindi tu nn hai considerato i connessi e i nn connessi ma semplicemente tutti..

x fare finire il turno hai messo un semplice bottone o anke una scadenza d tempo della sessione?


non ho capito.

cmq quello che intendo io è che sulla tabella giocatore o dove vuoi hai un campo attivo. Un utente prima insersce le sue credenziali per giocare. Qui oltre a controllare che nick e psw siano corrette ti prendi anche il valore di attivo. Se è true allora è il suo turno altrimenti vede solo le statistiche. non so se mi sono spiegato meglio.
sull'altro punto credo che oltre al bottone sia necessario inserire un timeout se no un utente può rimanere all'infinito senza far giocare a gli altri.


ds

R1cky`
Io ho fatto in questo modo:

Il giocatore fa il login e si trova in modalità di sola visualizzazione. Se vuol iniziare il turno preme il bottone "inizio turno". Se non c'è nessun altro giocatore attualmente in turno comincia, altrimenti rimane in coda fino a quando il giocatore che è in turno preme il bottone "termina turno".

Posso confermarti che Montanelli è abbastanza flessibile su questa cosa dei turni, perchè non è prettamente inerente all'sql. Un bottone "termina turno" va più che bene.

carla86
@darkshadow --> Intendevo ke tu hai un solo flag attivo/nn attivo;
nn hai anche un flag connesso nn connesso.
Semplicemente su tutti quelli registrati controlli il flag attivo non attivo...
Io invece volevo mettere un flag x i connessi xo' ho paura d incasinarmi la vita!

@R1cky --> grazie!! invece su cosa montanelli è intransigente!

GRAZIE A TUTTI!!!!!

R1cky`
Originally posted by carla86

@R1cky --> grazie!! invece su cosa montanelli è intransigente!


Con noi Montanelli è stato bravo. Alla fine importa che tu sia sicura di quello che hai fatto e che sappia motivare le scelte implementative, sempre che non hai fatto degli errori madornali...

darkshadow
 
una domanda forse un po banale ma ve la faccio lo stesso.
Per le citta: Voi considerate il nome come unico a livello globale o solo a livello di nazione??
la metto in modo diverso: nel vostro db possono esistere citta con lo stesso nome ma di nazioni diverse??

stessa domanda per gli eserciti.

carla86
nel mio db no.. nel senso ke era uno dei primi problemi ke mi ero posta, sia x quanto riguarda i nomi d citta sia x quanto riguarda i nomi degli eserciti e avevo chiesto a montanelli.
La sua risposta è stata ke il nome deve essere unico, deve identificare la città..

darkshadow
quindi unico a livello globale??

carla86
si unico a livello globale, tant'è ke l'ho scelto come chiave primaria.

carla86
mi sono appena messa su i trigger e le funzioni (ho fatto prima la parte web) ma ho dei dubbi:
1. nelle funzioni sql nn posso usare le tuple NEW e OLD, se nn ho capito male le posso usare solo nel trigger, giusto?!
2. ma nel trigger nn posso dichiarare variabili, vero?
3. nei trigger nell'if posso avere più d un'istruzione?
4. un utente sposta i pi dalla nazione alla citta. come faccio a fare partire un update su tutte e due le tabelle?

se qualcuno ke ha gia consegnato potesse mettere un esempio sarebbe molto utile..
grazie

darkshadow
1. Da quel che mi risulta no.
2. Si, si possono dichiarare.
3. Si, è come nei normali linguaggi di programmazione puoi usare i connettivi AND OR e la negazione (Not).
4. Prima controlli che i dati inseriti nella tabella che ha attivato il trigger siano giusti poi al suo interno fai una normale update nella tabella nazione per aggiornare (aggiungere/togliere) i PI assegnati alla città.

carla86
scusami ti scrivo un trigger che ho provato a inserire e ke mysql mi da errore d sintassi:
(ho una tabella citta e una tabella nazione)

create trigger prova
before update on citta
for each row
begin
declare diff integer
declare nome varchar(20)
if new.vi>old.vi then
diff=new.vi-old.vi
nome=nazione
update nazione set pi=pi-diff where nomenazione=nome
update citta set new.ab=old.ab+3 and new.ra=old.ra-3 and new.rn=old.rn-3
endif
end;

mi sai dire se è corretto? grazie

darkshadow
 
che errore ti da??

carla86
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'end'
at line 7

xo' forse ho trovato ke sia il delimiter ke mi sono dimenticata e poi cn end if.

ho anche un'altra domanda, scusa ke t sto subissando d domande ma è la prima volta ke metto mano su mysql:
in un campo posso aggiungere una percentuale? ossia x esempio:
set new.ab=old.ab+10%;
??
grazie ancora...

darkshadow
direi di no.. penso ke la percentuale la devi calcolare. o al massimo se esiste usare una funzione ke te le calcola.

cmq io non sto usando mysql.

carla86
ma quindi tu x fare gli aumenti metti direttamente il numero?!?!
Io volevo usare la percentuale xke volevo aumentare i valori in base a quanti pi spostava...

darkshadow
anchio uso le percentuali.. quello che volevo dire è che non si può fare...
colonna = colonna + 10%

quel 10% lo devi calcolare

non so per esempio dichiari una funzione che ti calcola la percentuale

e quindi fai : colonna = colonna + funzionePercentuale()

carla86
o sono diventata pazza o nn arrivo a determinate cose..

delimiter //
create function percentuale(integer val, integer percento) return integer as
begin
declare risultato integer;
risultato = (val*percento)/100;
return risultato;
end;
//

cosa c'è d sbagliato? x qaunto ho cercato su internet (in cui nn ci sono esempi concreti ma parla solo d sintassi..) dovrebbe essere giusto..

darkshadow
Originally posted by carla86
o sono diventata pazza o nn arrivo a determinate cose..

delimiter //
create function percentuale(integer val, integer percento) return integer as
begin
declare risultato integer;
risultato = (val*percento)/100;
return risultato;
end;
//

cosa c'è d sbagliato? x qaunto ho cercato su internet (in cui nn ci sono esempi concreti ma parla solo d sintassi..) dovrebbe essere giusto..


delimiter //
create function percentuale(integer val, integer percento) returns integer as
begin
declare risultato integer;
SET risultato = (val*percento)/100;
return risultato;
end
//

carla86
mysql> create function percentuale(integer val,integer percento) returns integer
as
-> begin
-> declare risultato integer;
-> set risultato=(val*percento)/100;
-> return risultato;
-> end;
-> //
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'integ
er val,integer percento) returns integer as
begin
declare risultato integer' at line 1

questo è ciò ke faccio in mysql tralatro cn l'utente root quindi proprio nn capisco dov'è l'errore...
mi sa ke mi toccherà inviare una mail a montanelli e chiedergli un colloquio,altrimenti me lo sogno d consegnare il progetto..
spero tu sia messo meglio..
grazie dell'aiuto!

darkshadow
 

delimiter //
create function percentuale(integer val, integer percento) returns integer as
begin
declare risultato integer        -> Il ; non ci va nella declare
SET risultato = (val*percento)/100;
return risultato;
end
//

carla86
niente da fare anche togliendo il punto e virgola nn funziona uguale... sempre stesso errore..

R1cky`
Che editor usi?
Ti consiglio di scaricare http://www.webyog.com/en/downloads.php#sqlyog, è molto comodo.

Comunque se vai da montanelli non dirgli che hai fatto prima la parte web e poi la parte db altrimentti tin inforca :D

carla86
no beh
cmq prima d andare faccio anke gli altri trigger
cosi gli chiedo xke nessuno va..

cmq come editor uso scite..
l'errore ke mi da è sempre questo.. ma nn è ke ce da mettere qualche cosa tra apici??

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'integ
er val,integer percento) returns integer as
begin
declare risultato integer' at line 1

carla86
EVVAIIIII
C'E' L'HO FATTAAAAA
era un problema d parametri..
la pubblico in caso possa servire a qualcuno..

create function percentuale (val integer,percento integer) returns integer
begin
declare risultato integer;
set risultato=((val*percento)/100);
return risultato;
end;

Sacratix
Originally posted by carla86
scusami ti scrivo un trigger che ho provato a inserire e ke mysql mi da errore d sintassi:
(ho una tabella citta e una tabella nazione)

create trigger prova
before update on citta
for each row
begin
declare diff integer
declare nome varchar(20)
if new.vi>old.vi then
diff=new.vi-old.vi
nome=nazione
update nazione set pi=pi-diff where nomenazione=nome
update citta set new.ab=old.ab+3 and new.ra=old.ra-3 and new.rn=old.rn-3
endif
end;

mi sai dire se è corretto? grazie


premetto che ho usato plpgsql
e che mysql non l'ho proprio preso in considerazione
(phpPgAdmin è molto meglio di phpMyAdmin >_>)

sei sicura che si possano usare conteporaneamente NEW e OLD?
perchè con postgres se il trigger è in UPDATE o INSERT, solo NEW viene riempito (solo OLD per la DELETE)

dai un'occhiata che è meglio

carla86
la new la puoi usare x la insert e x l'update.
la old la puoi usare x l'update e x la delete.

Sacratix
ok, buono a sapersi che lì funziona

come non detto, funziona così anche qui, ora mi chiedo
"cosa diavolo avrò fatto per farmi credere che non fosse così?" >_<

carla86
voi cosa avete usato o cosa userete x fare lo schema ER da consegnare al prof? lo fate a mano (tanto va consegnato cartaceo) o lo fate con qualche programma particolare??

grazie.

darkshadow
x ora l'ho fatto su carta.

Una domanda...

cosa fate nel caso in cui una naziona vada in deficit?? cioè se scende sotto i -2000 PI.

1) eliminate la nazione e quindi anche tutte le citta/strade/eserciti da lui create?

2) eliminate la nazione e mette null in tutti i suoi riferimenti??

il giocatore direi che non va eliminato per evitare di rifare la registrazione.

carla86
io cancello la nazione cn tutte le citta e gli eserciti.
le strade onestamente le lascio xke nn c'avevo pensato..

Sacratix
cancello il giocatore (e a cascata sparisce tutto il resto)

Sacratix
Originally posted by carla86
voi cosa avete usato o cosa userete x fare lo schema ER da consegnare al prof? lo fate a mano (tanto va consegnato cartaceo) o lo fate con qualche programma particolare??

grazie.


con word puoi fare i grafici

e poi ho usato paint >_>

carla86
un altra domanda voi come fate il meccanismo d premiazione, penalizzazione?? nel senso ke io nn riesco a mantenere il valore dei vecchi abitanti e dei vecchi rn quindi quando vado a cercare d calcolare se abitanti ed rn sono cresciuti nn riesco...
da premettere ke io per capire se un utente è connesso ho un campo nella tabella nazione e x capire quando sei d turno ho un altro campo sempre nella tabella nazione (prima erano nella tabella giocatore ma mi incasinavo d più la vita..).
quindi al trigger io faccio controllare se new.attivo=0 and old.attivo=1 vuol dire ke ha terminato il turno e devo calcolargli il premio ma nn so come controllare l'incremento o il decremento degli abitanti e delle rn.
grazie.

marcooo
Io all'inizio del turno memorizzo nella tabella "turni" i valori iniziali degli abitanti e delle risorse naturali. Al termine del turno faccio il confronto con i nuovi valori raggiunti.

Anch'io ho una domanda...
Ma come avete fatto a calcolare le varie strade esistenti e i punti movimento necessari allo spostamento? Io proprio non riesco e penso che lo consegnerò così com'è... :-(

carla86
probabilmente da qualche parte ce gia scritto...
posso in qualche modo da php richiamare le funzioni d mysql ke mi sono creata io?
se si come posso fare?
e posso mettere il risultato d questa chiamata in qualche variabile php?
grazie!!

Metteus
Originally posted by marcooo
Io all'inizio del turno memorizzo nella tabella "turni" i valori iniziali degli abitanti e delle risorse naturali. Al termine del turno faccio il confronto con i nuovi valori raggiunti.

Anch'io ho una domanda...
Ma come avete fatto a calcolare le varie strade esistenti e i punti movimento necessari allo spostamento? Io proprio non riesco e penso che lo consegnerò così com'è... :-(


il metodo piu elegante ma anche piu difficile è implementare l'algoritmo di dijkstra per calcolare il cammino minimo tra due citta ;)

carla86
PARLO ANCORA DELLA STORIA PREMIAZIONE/PENALIZZAZIONE

Originally posted by marcooo
Io all'inizio del turno memorizzo nella tabella "turni" i valori iniziali degli abitanti e delle risorse naturali. Al termine del turno faccio il confronto con i nuovi valori raggiunti.


ma quindi tu fai una tabella turni apposta? e come la metti nello schema er?
xke x come ho fatto io nn mi serve nessuna tabella in più x calcolare i turni...

io metto un bel tasto inizio turno e un tasto x far finire il turno quindi calcolerei da li i valori d ab e di rn ma poi nn so come rimmetterli in una funzione mysql o meglio nn so come fare il trigger che li aggiorni automaticamente se li prendo da php... uff
aiutoooo

e un altra richiesta come fate x decidere che esercito vince e che esercito perde in un combattimento?

Sacratix
Originally posted by carla86
probabilmente da qualche parte ce gia scritto...
posso in qualche modo da php richiamare le funzioni d mysql ke mi sono creata io?
se si come posso fare?
e posso mettere il risultato d questa chiamata in qualche variabile php?
grazie!!


allora, se ancora ti serve saperlo...

SELECT funzione()
opppure se ritorna più tuple
SELECT * FROM funzione()

per usarla in php poi non cambia niente
per mettere il risultato nemmeno
per accedere al risultato..

$row = mysql/pg_fetch_array(....) //solita istruzione

ma in alcuni casi che non ricordo, per leggere poi il risultato
$var = $row['<nome_della_funzione>'];
echo $var['<campo>'];


[in postgres è così, e dovrebbe essere lo stesso con mysql]

Sacratix
Originally posted by carla86

ma quindi tu fai una tabella turni apposta? e come la metti nello schema er?
xke x come ho fatto io nn mi serve nessuna tabella in più x calcolare i turni...



puoi anche solo aggiungere i due campi alla tabella che us per gli utenti


ma poi nn so come rimmetterli in una funzione mysql o meglio nn so come fare il trigger che li aggiorni automaticamente se li prendo da php... uff


se li salvi nel database, il trigger poi va a ripigliarseli da solo
altrimenti dovresti:
quando inizia il turno, andare a calcolari e salvarli nella sessione dell'utente
quando lo finisci, darli come parametro alla funzione <fine_turno>

effettivamente non cambia molto, ma io ho trovato più comodo gestirli da dentro

Sacratix
per gli scontri ho moltiplicato

(atk.va * atk.truppe) - (def.vd * def.truppe)

più un [-15,+15] %

è ho ragionato sul risultato:

carla86
Originally posted by marcooo
Anch'io ho una domanda...
Ma come avete fatto a calcolare le varie strade esistenti e i punti movimento necessari allo spostamento? Io proprio non riesco e penso che lo consegnerò così com'è... :-(


Io faccio spostare l'esercito solo d una citta se ce la strada e se ha almeno un pm.
nella sezione due delle specifiche ce scritto ke l'esercito in un turno può compiere un solo spostamento e io mi aggrappo a quello.

Grazie Sacratix! nn avevo pensato d salvarli nella sessione..
cmq anke secondo me è più comodo farli internamente.
quindi nel codice php x far eseguire una funzione mia creata in mysql basta
SELECT funzione(parametri);

un ultima cosa una vista la posso mettere in una funzione?! e invece un campo d una select lo posso calcolare cn una funzione? grazie.

Sacratix
sì, come una query normale

ricordati però gli [']
SELECT funzione( 'par1', 'par2', ....)

R1cky`
Originally posted by Metteus
il metodo piu elegante ma anche piu difficile è implementare l'algoritmo di dijkstra per calcolare il cammino minimo tra due citta ;)


Beh in realtà non è necessario scomodare tale algoritmo perchè essendo che il costo del cammino tra una città e l'altra è sempre 1 è suffiente fare una ricerca in ampiezza con qualche piccolo accorgimento :)

Metteus
Originally posted by R1cky`
Beh in realtà non è necessario scomodare tale algoritmo perchè essendo che il costo del cammino tra una città e l'altra è sempre 1 è suffiente fare una ricerca in ampiezza con qualche piccolo accorgimento :)


cioè cosa intendi ?

carla86
ragazzi ma secondo voi il 30 fino a che ora si può consegnare?
x forza al mattino?

carla86
qualcuno ha usato in php
header('refresh: 30; url=pagina.php');
x fare il refresh della pagina?

Sacratix
Originally posted by Metteus
cioè cosa intendi ?


rispondo io ^^

a noi non serve il cammino minimo, ma un cammino che che non superi un certo numero di archi (che poi sono i pm)
l'importane è che la città sia raggiungibile, all'esercito non cambia il fatto che la meta sia a distanza 1 o 30 (se i pm sono maggiori di 30 >_>)

con una semplice visita in ampiezza, ad ogni passata, mi allontano di 1 pm dalla città base, e questo basta (e avanza ma al perchè ci pensate voi :P)

Sacratix
Originally posted by carla86
qualcuno ha usato in php
header('refresh: 30; url=pagina.php');
x fare il refresh della pagina?


iooo no, non sapevo di questa cosa
e quindi ho mischiato frameset e javascript


ancora oggi non capisco perchè il redirect in php non mi funzioni >_>
e mi tocca farlo in javascript

Metteus
Originally posted by Sacratix
rispondo io ^^

a noi non serve il cammino minimo, ma un cammino che che non superi un certo numero di archi (che poi sono i pm)
l'importane è che la città sia raggiungibile, all'esercito non cambia il fatto che la meta sia a distanza 1 o 30 (se i pm sono maggiori di 30 >_>)

con una semplice visita in ampiezza, ad ogni passata, mi allontano di 1 pm dalla città base, e questo basta (e avanza ma al perchè ci pensate voi :P)



ok grazie !
in pratica inizializzo un contatore, e se alla fine della visita in ampiezza il cont è minore dei pm l'esercito si puo muovere ,,, giusto !

-Oblivion-
Originally posted by carla86
qualcuno ha usato in php
header('refresh: 30; url=pagina.php');
x fare il refresh della pagina?

Si utilizzato diverse volte. Molto meglio di javascript.

carla86
Originally posted by -Oblivion-
Si utilizzato diverse volte. Molto meglio di javascript.


lo posso mettere dove mi pare nella pagina o lo devo mettere x forza all'inizio??
Grazie!

Sacratix
Originally posted by Metteus
ok grazie !
in pratica inizializzo un contatore, e se alla fine della visita in ampiezza il cont è minore dei pm l'esercito si puo muovere ,,, giusto !


la fine della visita... no
non serve controllare tutto il grafo

- città trovata (ovviamente)
- contatore maggiore di pm, quindi non trovata

-Oblivion-
Originally posted by carla86
lo posso mettere dove mi pare nella pagina o lo devo mettere x forza all'inizio??
Grazie!

Sicuramente meglio metterlo in alto, il comando deve assolutamente essere eseguito prima che la pagina inizi ad essere caricata. Se la pagina inizia il caricamento e il comando non è ancora stato eseguito dal server, viene mostrato un errore che ti dice che è troppo tardi per fare il redirect.

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate