Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] jak rozdać karty do gry?
Forum PHP.pl > Forum > Przedszkole
ibalyx
hejo smile.gif proszę o pomoc.

mam 4 stosy kart (A,B,C,D). w każdym stosie mam 4 karty (1,2,3,4). karty mają jakąś wartość liczbową (od 5 do 20). mam też 4 graczy.
chcę rozdać te karty graczom z pewnymi wymaganiami:
- każdy gracz może mieć tylko jedną kartę z każdego stosu
- suma wartości kart każdego gracza ma być możliwie wyrównana

dlatego potrzebuję skryptu który mi to obliczy, czyli przejrzy wszystkie możliwe kombinacje. nie wiem jak to zrobić. próbowałem z 4 pętlami, jedna w drugiej ale to chyba nie to. macie jakieś pomysły?
Gelio
Nie jest to rozwiązanie optymalne, ale jedno z prostszych - wystarczy te stosy posortować i po kolei dawać każdemu graczowi skrajne wartości.

Dla przykładu:
  1. $tablica = array(
  2. array(5,10,15,20),
  3. array(6,11,14,19),
  4. array(7,12,13, 18),
  5. array(8, 11, 16, 19)
  6. ); // to musi być posortowane
  7. $gracz1 = array($tablica[0][0], $tablica[1][0], $tablica[2][3], $tablica[3][3]);
  8. $gracz2 = array($tablica[0][1], $tablica[1][1], $tablica[2][2], $tablica[3][2]);
  9. $gracz3 = array($tablica[0][2], $tablica[1][2], $tablica[2][1], $tablica[3][1]);
  10. $gracz4 = array($tablica[0][3], $tablica[1][3], $tablica[2][0], $tablica[3][0]);


Rozwiązanie jest szybkie, nie wymaga żadnych pętli, jednak są i minusy - dwóch graczy będzie miało wartości zbliżone do siebie, natomiast dwóch innych graczy będzie miało wartości skrajne.

Mam nadzieję, że kod się przyda.
Pyton_000
Musisz stworzyć wszystkie możliwe czwórki kart. Tutaj najprościej 4 pętle coś na zasadzie:
  1. for($a=0;$a<4;$a++)
  2. for($b=0;$b<4;$b++)
  3. for($c=0;$c<4;$c++)
  4. for($d=0;$d<4;$d++)
  5. $tablica["{$a},{$b},{$b},{$c}"] = $t1[$a]+$t2[$b]+$t3[$c]+$t4[$d];
  6.  
  7. sort($tablica);
  8. var_dump($tablica);
ibalyx
Cytat(Pyton_000 @ 18.12.2013, 18:17:37 ) *
Musisz stworzyć wszystkie możliwe czwórki kart. Tutaj najprościej 4 pętle coś na zasadzie:
  1. for($a=0;$a<4;$a++)
  2. for($b=0;$b<4;$b++)
  3. for($c=0;$c<4;$c++)
  4. for($d=0;$d<4;$d++)
  5. $tablica["{$a},{$b},{$b},{$c}"] = $t1[$a]+$t2[$b]+$t3[$c]+$t4[$d];
  6.  
  7. sort($tablica);
  8. var_dump($tablica);


tylko potrzebuję wyświetlić kto jakie karty dostał :-) też z tymi pętlami kombinowałem. przynajmniej wiem, że jest jakieś 331 776 kombinacji.
Pyton_000
jako klucz masz po przecinku klucze z talii
ibalyx
zapomniałem o najważniejszej rzeczy. karty są podzielone na kolory wg hierarchii:
- czerwone (3 karty) - najsilniejsze
- niebieskie (4karty)
- zielone (5 kart)
- żółte (4 karty) - najsłabsze

tak więc "czerwona 5" jest silniejsza od "niebieskiej 20". wiele kombinacji teraz nie będzie, ale mimo wszystko wolałbym, żeby skrypt mi to wyliczył :-)

przykład:
STOS_A
- czerwona 5
- zielona 10
- zielona 10
- żółta 11

STOS_B
- czerwona 10
- czerwona 10
- zielona 15
- żółta 16

STOS_C
- niebieska 7
- niebieska 7
- zielona 9
- żółta 10

STOS_D
- niebieska 7
- niebieska 7
- zielona 9
- żółta 10

to nadal obowiązuje:
- każdy gracz może mieć tylko jedną kartę z każdego stosu

po kilku próbach wyszło mi tak: gracz_A = 39, gracz_B = 37, gracz_C = 37, gracz_D = 40.
nie wiem czy wszystkie kombinacje sprawdziłem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.