Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Gioco del quindici. Mescolare i numeri
Forum - Pascal - Gioco del quindici. Mescolare i numeri

Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 14:22
Sabato, 27/03/2010
Ciao a tutti. Sto cercando di costruire il gioco del quindici in pascal (in realtà in delphi però quello che mi serve è più un procedimento pascal) e mi sono bloccato nel mescolare i numeri.

Io ho 16 pannelli che hanno name 'P' e :

1    2    3    4
5    6    7    8
9   10   11   12
13  14   15   16

e all'inizio tutti hanno caption corrispondente al loro numero tranne il 16 che ha caption ''
io devo avere una procedura che generi un array da 1 a 16 (mettiamo v[1..16] of integer) al cui interno ogni posizione ha un numero casuale compreso tra 1 e 15, ma ogni volta che viene assegnati un numero, esso non deve riapparire. Mi spiego: se ho l'array v[1] a cui è stato assegnato per random il numero 3, questo numero tre non dovrà essere riassegnato.

Come faccio?
Spero di essermi spiegato.

PS: non mi interessa tanto il codice pascal, quanto proprio il ragionamento per arrivarci.

grazie a tutti
saluti


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 15:20
Sabato, 27/03/2010
Ciao!
Ho letto il tuo quesito, e ti propongo il seguente metodo:

- Crea un array ordinato in modo cresscente es.: a=[1,2,3...15]

- Imposta un ciclo decrescente (da 2 a 15) dove sgneri un numero casuale compreso tra 1
  e l'indice del ciclo.

- Scambia i numeri dell' array che hanno come posizione l' indice del ciclo, e il numero
  casuale

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 15:44
Sabato, 27/03/2010
Funziona alla grande: ecco il codice:
Codice sorgente - presumibilmente Delphi

  1. randomize;
  2. for i:= 1 to 15 do a[i]:=i;
  3.  
  4. for i:= 2 to 15 do
  5.  begin
  6.    x:= random(i)+1;
  7.    passo:= a[i];
  8.    a[i]:= a[x];
  9.    a[x]:= passo;
  10.  end;
  11.  
  12. for i:= 1 to 15 do writeln(a[i]);
  13. readln;



Grazie mille PoggiMarco.
Devo anche ringraziare manvb.net che mi ha fornito una soluzione alternativa; posto il codice:
Codice sorgente - presumibilmente Delphi

  1. var
  2. x,i,y:byte;
  3. barray: array[1..15] of boolean;
  4. begin
  5. for i:= 1 to 15 do barray[i] := false;
  6. while y<=100 do
  7. begin
  8. repeat
  9. x := random(15)+1;
  10. if barray[x] = false then
  11. begin
  12. writeln(x);
  13. barray[x] := true;
  14. end;
  15. until barray[x] = true;
  16. y:= y+1;
  17. end;
  18. readln;
  19. end.



Grazie mille a entrambi! Gentilissimi!


PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:40
Sabato, 27/03/2010
Ho letto i sorgeti, e ho trovato alcune imperfezioni.

Nel primo:

L' idea e quella di impostare un ceclo, che ad ogni iterazione, generi un numero casuale nell' array, e questo non venga più toccato.

Faccio due esempi per spiegarmi:

1°)
Codice sorgente - presumibilmente Delphi

  1. for i:= 1 to (15-1) do
  2. begin
  3.    x:= random(15-i+1)+i;
  4.    passo:= a[i];
  5.    a[i]:= a[x];
  6.    a[x]:= passo;
  7. end;


2°)
Codice sorgente - presumibilmente Pascal

  1. for i:= 15 dowto 2 do
  2. begin
  3.    x:= random(i)+1;
  4.    passo:= a[i];
  5.    a[i]:= a[x];
  6.    a[x]:= passo;
  7. end;



Nel secondo:

Come mai imposti l' uscita dal ciclo esterno " while y <= 100 do " ?



Ultima modifica effettuata da Poggi Marco il 27/03/2010 alle 18:54
PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 0:47
Domenica, 28/03/2010
Testo quotato

Postato originariamente da Poggi Marco:

Ho letto i sorgeti, e ho trovato alcune imperfezioni.

Nel primo:

L' idea e quella di impostare un ceclo, che ad ogni iterazione, generi un numero casuale nell' array, e questo non venga più toccato.

Nel secondo:

Come mai imposti l' uscita dal ciclo esterno " while y <= 100 do " ?



Ti rispondo: nel primo non so: ho messo quel codice che secondo me è logicamente giusto e ti dico che funziona alla perfezione :asd:
Secondo: ho provato ad esempio a mettere 15 cicli soltanto ma mi butta fuori solo 10 numeri non quindici, forse perchè ogni volta che trova un true in realtà "brucia" un ciclo, così mettendo 100 è quasi sicuro:asd:... mi sono spiegato?

Comunque, in definitiva funzionano :D questo è quello che importa!
grazie mille!!

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 11:44
Domenica, 28/03/2010
Di nulla!

Per quanto riguarda il secondo caso, puoi incrementare y all' interno del ciclo repeat, in modo da conteggiare i numeri effettivamente estratti.

Ho fatto un breve test, e ho concluso che mediamente servono 50 iterazioni.
Solo per l' 1.5% dei casi, servono più di 100 cicli.

PM Quote