[ ventura @ 14.11.2004. 12:18 ] @

Da li mozete da mi pomognete sa sledecim:
Imam jedan array:

Karte: array[1..14] of String = ('1','2','3','4','5','6','7','8','9','X','J','Q','K','A');

Zeleo bi da iskoristim RandomFrom funkciju da izvucem neko nasumicno polje (odnosno kartu) iz array-a.

E sada, dali je moguce nakon sto izvucem recimo 'X', da ja to polje u array-u ponistim? i da umesto X upisem recimo '0' ili '-', i kako to izvesti?
[ reiser @ 14.11.2004. 13:33 ] @
Zasto bas RandomForm ? Mozes sa Random() samo...

Evo primer :
Code:

var
  RndNum : Integer;
begin
  Randomize;
  RndNum := Random(14) + 1; // Slucajan broj od 1 do 14
  MessageBox(0, PAnsiChar(Karte[RndNum]), nil, mb_OK); // Prikazimo kartu
  Karte[RndNum] := '0'; // I na kraju upisimo '0' u to polje
end;

[ ventura @ 14.11.2004. 13:53 ] @
Onda array gubi znacenje... Dakle poenta je sledeca

u Array-u se nalaze sve karte iz Spila, kada se neka karta izvuce (RandomFrom), ta karta vise ne postoji u spilu (taj field u array je setovan na 0).
Ja hocu to da izvedem ali ne umem kako..
Palo mi je na pamet da po izvlacenju karte uradim search&replace u array-u, i to bi radilo posao, ali nazalost ja to u deplhiju ne umem da uradim, pa sad trazim po netu kako to izvesti.

[ reiser @ 14.11.2004. 14:13 ] @
Citat:
u Array-u se nalaze sve karte iz Spila, kada se neka karta izvuce (RandomFrom), ta karta vise ne postoji u spilu (taj field u array je setovan na 0).


Onaj kod gore radi bas to ??
[ ventura @ 14.11.2004. 14:18 ] @
probel je u tome sto ceo array izgleda ovako:

Code:

Karte: array[1..14] of String = 
('1','2','3','4','5','6','7','8','9','X','J','Q','K','A',
'1','2','3','4','5','6','7','8','9','X','J','Q','K','A',
'1','2','3','4','5','6','7','8','9','X','J','Q','K','A',
'1','2','3','4','5','6','7','8','9','X','J','Q','K','A');


znaci to je spil od 56 karata, sa tvojim metodom mozes samo prvih 14 da prepisujes, to sam odmah video, ali to nije primenljivo kad imas 1, 2, 3, 4 ili n spilova.

Dakle, trebala bi da se koristi neka fleksibilnija metoda
[ Milos Stojanovic @ 14.11.2004. 14:23 ] @
A zašto ne bi "promešao" špil, i onda izvlačio karte redom?
Code:

var
  Rnd,i : Integer;
  p : string;
begin
  Randomize();
  for i := 1 to 14 do
  begin;
     Rnd := Random(i) + 1;
     p := Karte[i];
     Karte[i] := Karte[Rnd];
     Karte[Rnd] := p;
   end;

// I onda negde u kodu
//   for i := 1 to 14 do
// Izvuci I-tu kartu
     
end;
[ ventura @ 14.11.2004. 14:33 ] @
trooper: radi se o ukupno 6 spilova odnosno 336 karata iliti elemenata array-a, ali je fora u tome sto u tom array-u MORA da bude 24 od svake karte da bi racunica bila tacna na kraju...
ovaj tvoj kod ne pazi na to....

dali ima neka funkcija koja radi search u array i vraca poziciju polja?
[ Milos Stojanovic @ 14.11.2004. 14:57 ] @
Da li tebi treba algoritam koji, kada se izvadi jedna karta od jedne vrste, više ne može da se vadi ta vrsta karata, ili može? Ako može, onda ovaj moj kod radi, jer on meša proizvoljan broj karata. Osim ako ti nije bitan redosled karata u špilu/arrayu.
Da li ti je sve jedno da li imaš array:
1,2,3,4,5,6,7,8,9,10,J,Q,K,1,2,3,4....
ili
J,4,9,1,8,7,K,2,10,Q,6,3,5...
?
[ ventura @ 14.11.2004. 15:03 ] @
Nije mi bitan redosled, ali mi je bitno da kad naprimer izvucem 24 karte od jedne vrste (8 recimo, nebitno koja je boja) da vise u spilu ne postoji nijedna karta 8, vec da je sve ravnomerno raporedjeno, bas kao sto bi bilo u pravom spilu
[ Milos Stojanovic @ 14.11.2004. 15:10 ] @
Pa ovo moje meša "ravnomerno", baš kao što bi se mešalo u pravom špilu.
Žao mi je, ali zaista ne razumem. Ako možeš malo bolje da objasniš pa da uradimo to kako treba.
[ ventura @ 14.11.2004. 15:15 ] @
Ovako, pokusavam da napravim igru BlackJack, koja se igra sa 6 spilova.

Znaci, broj karata je konacan, kao i broj deljenja.

Broj karata je 336, znaci po 24 karte od svakog broja (ne uzimajuci u obzir boju).

Ideja mi je bila da svih 336 karata smestim u array, i po 'izvlacenju' da ih ponistim u array-u, upisijuci nuli umesto karte, i ako je pri sledecem izglacenju izvucena 0, onda bi reeat petljom ponovio izvlacenje sve dok ne izvucem 'svezu' kartu, koju cu iskoristiti i potom na isti nacin ponistiti.
I tako u krug.

Jedina stvar koju je neophodno paziti je da broj i raspored karata unutar spila nije random, vec se u spilu nalazi 24 karte od svakog broja, ukupno 336. Redosled karata je proizvoljan i nema nekog posebnog znacaja.

[ Milos Stojanovic @ 14.11.2004. 15:33 ] @
Nezgodno je postavljati 0. Jer recimo ako naiđeš na 0 pa ponovo pozoveš random dok ne naiđeš na polje koje nije nula, to može da potraje jer može da se desi da te random stalno vraća na polja koja su 0.

Dakle tebi je nebitan raspored karata unutar tog niza od 336, bitno ti je koliko ima koje karte u tom nizu? Pa onda je u redu ovo što sam ja gore napisao. Šta ovo moje radi? Polazi od niza u kome su karte redom raspoređene, i zatim za svaku kartu zameni mesto te karte i neke random karte u špilu. Dakle broj karata od svake vrste ostaje isti, jer su svi elementi niza i dalje tu. Ali nakon ove zamene mesta kartama ti imaš pomešan (čak bi se usudio da kažem i homogeno) špil. Tako da više nema potrebu da uzimaš kartu sa random mesta iz niza, već je dovoljno da uzimaš karte redom. Ne znam kako ovo bolje da objasnim. Jednostavno si promešao karte kao što bi radio u pravom životu, i uzimaš karte sa vrha špila ne vraćajući ih u njega, baš kao što bi radio u pravom životu.
[ ventura @ 14.11.2004. 15:48 ] @
Tacno je da tvoj kod mesa, ali on i dalje mesa istu kolicinu karata, a ja recimo kad izvucem jednog kralja, vise nemam 24 kralja u spilu, vec je ostalo samo 23 kralja, i on od tih mora onda da izvlaci
[ Milos Stojanovic @ 14.11.2004. 15:55 ] @
dakle tebi treba, da kad od 24 kralja izvučeš jednog kralja , da ih i dalje ima 24, tj. da odradiš izvlačenje sa vraćanjem?
[ bancika @ 14.11.2004. 18:56 ] @
ako trebas da izbacujes iz niza mozda je malo bolje da koristis listu umesto niz. a moze i dinamickim nizom.

Code:

var a: array of char;
...
SetLength(a, 20);
//da izbacis k-ti ide
for i := k to High(a) do //indexiranje ide od 0
 a[i - 1] := a[i];
SetLength(a, Length(a) - 1);
...