Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: losowe minuty do wyniku meczu
Forum PHP.pl > Forum > PHP
ibalyx
hejo :-)

poproszę o poradę jak mam to zrobić.

powiedzmy, że wygenerowałem sobie jakiś wynik meczu.
i teraz chcę wylosować minuty w których padły gole. ale z rozróżnieniem dla kogo, gospodarz, czy gość i w kolejności od najwcześniejszej do najpóźniejszej.

męczę się z tablicami, pętlami i warunkami i mi nie wychodzi :-/
Crozin
Pokaż co zrobiłeś do tej pory.
sazian
to by trzeba z fryzjerem porozmawiać smile.gif
ibalyx
zapomniałem dodać, że potrzebuję jeszcze rozbicie na połowy :-)

Wynik meczu:
  1. $gosp45 = mt_rand(0,2);
  2. $gosp90 = mt_rand(0,2);
  3.  
  4. $gosc45 = mt_rand(0,2);
  5. $gosc90 = mt_rand(0,2);

Losowanie minut:
  1. for($i=0; $i<$gosp45; $++){
  2. $min_gosp_45[] = mt_rand(1,45);
  3. }
  4.  
  5. for($i=0; $i<$gosp90; $++){
  6. $min_gosp_90[] = mt_rand(46,90);
  7. }
  8.  
  9. for($i=0; $i<$gosc45; $++){
  10. $min_gosc_45[] = mt_rand(1,45);
  11. }
  12.  
  13. for($i=0; $i<$gosc90; $++){
  14. $min_gosc_90[] = mt_rand(46,90);
  15. }


wiem, że mogą się powtarzać. nie umiem wykombinować jak to połączyć, żeby losowało z jednej połowy dla obu drużyn.
kreatiff
Możliwości jest tyle, ilu programistów wink.gif

Nudziło mi się, to zrobiłem sobie mini symulator, udanej zabawy:
  1. $gole_gospodarze = 0;
  2. $gole_goscie = 0;
  3.  
  4. // ile % szans w każdej minucie mają drużyny (1% daje wyniki zbliżone do realnych), gdy. np. gra Australia z Samoa Amerykańskie (było onegdaj 31:0) można dać wartości 30 i 0, gdy Polska z Niemcami np. 1 i 2 czy 1 i 3 (czyli, że Niemcy mają więcej szans na gola, bo są lepsi)
  5. $szansa_na_gola_gospodarzy = 1;
  6. $szansa_na_gola_gosci = 1;
  7.  
  8. $gole = array(
  9. 'gospodarze' => array(),
  10. 'goscie' => array()
  11. );
  12. $relacja[] = '---[1 połowa]---'; // początek relacji z meczu
  13.  
  14. $minuta = 1; // początek meczu, pierwsza minuta
  15. while ( $minuta <= 90 ) {
  16. if ( mt_rand(1, 100) <= $szansa_na_gola_gospodarzy ) {
  17. $gole['gospodarze'][$minuta <= 45 ? 1 : 2][] = $minuta;
  18. $gole_gospodarze++;
  19. $relacja[] = "$minuta' gol dla Gospodarzy";
  20. }
  21. if ( mt_rand(1, 100) <= $szansa_na_gola_gosci ) {
  22. $gole['goscie'][$minuta <= 45 ? 1 : 2][] = $minuta;
  23. $gole_goscie++;
  24. $relacja[] = "$minuta' gol dla Gości";
  25. }
  26. if ( $minuta == 45 ) $relacja[] = '---[2 połowa]---';
  27. ++$minuta;
  28. }
  29. $relacja[] = "Wynik meczu: Gospodarze $gole_gospodarze:$gole_goscie Goście";
  30. $relacja[] = 'Komentował dla Państwa Dariusz Pehapowski';
  31. $relacja = implode('<br>', $relacja);
  32.  
  33. echo $relacja;
Tablica $gole zawiera rozpiskę meczu w postaci tablicy z podziałem na gospodarzy/gości i połowy meczu z minutami, kiedy padły bramki.

Acha, skrypt nie uwzględnia możliwości, że padają dwie bramki dla tej samej drużyny w tej samej minucie. Poprawę tego pozostawiam już inwencji własnej.
Szanse na gola można łatwo z procentów przerobić też na procenty i promile, gdy np. 1 i 2 to zbyt duża rozbieżność w szansach drużyn na bramki, ale jednocześnie nadal chcemy zachować jakąś proporcję co do drużyn, że jedna jest lepsza, a druga gorsza (czyli np. chcielibyśmy dać szanse 1 i 1,1 - druga drużyna lepsza od pierwszej o 10%).
ibalyx
nie dokładnie o to mi chodziło :-) ale pomysł ciekawy.

ale wróćmy do mojego problemu. mam już wygenerowany wynik meczu i teraz chciałbym do tego minuty, proszę o pomoc.

chcę taki raport meczowy:
TEAMA - TEAMB 3:1 (1:1)
1:0 [7] 12min.
1:1 [9] 39min.
2:1 [8] 63min.
3:1 [10] 77min.


w nawiasie kwadratowym nr zawodnika, ale z tym to sobie poradzę raczej.
Pyton_000
A gdzie kod?
ibalyx
Cytat(Pyton_000 @ 7.03.2015, 10:15:31 ) *
A gdzie kod?

w poscie #4

po za tym chcę tylko poradę jak to zrobić, mój kod nie działa, więc się Wam nie przyda do niczego. po prostu nie wiem jak to zrobić :-)
kreatiff
Można i tak:
  1. $wynik_gosp = 3;
  2. $wynik_goscie = 1;
  3.  
  4. $minuty = range(1,90);
  5.  
  6. shuffle($minuty);
  7. $gosp = array_slice($minuty, 0, $wynik_gosp);
  8. sort($gosp);
  9.  
  10. shuffle($minuty);
  11. $goscie = array_slice($minuty, 0, $wynik_goscie);
  12. sort($goscie);
  13.  
  14. echo'<pre>',var_dump( $gosp ),'</pre>';
  15. echo'<pre>',var_dump( $goscie ),'</pre>';
Podział na połowy to już kwestia <= 45
Pyton_000
Proszę, w ramach relaksacji spłodziłem to. Może nie jest idealne i można wieeele poprawić ale..
  1. <?php
  2.  
  3. $times = array_fill(0, 91, null);
  4.  
  5. $score1 = mt_rand(0,4);
  6. $score2 = mt_rand(0,4);
  7.  
  8. while($score1 != 0)
  9. {
  10. $key = (int)mt_rand(0, 91);
  11. if(!empty($times[$key]['team1']))
  12. {
  13. continue;
  14. }
  15. $times[$key]['team1'] = 1;
  16. $score1--;
  17. }
  18.  
  19. while($score2 != 0)
  20. {
  21. $key = (int)mt_rand(0, 91);
  22. if(!empty($times[$key]['team2']))
  23. {
  24. continue;
  25. }
  26. $times[$key]['team2'] = 1;
  27. $score2--;
  28. }
  29.  
  30. $times = array_filter($times);
  31. foreach($times as $minute => $time)
  32. {
  33. if(!empty($time['team1']))
  34. {
  35. $times[$minute]['team1'] = ++$score1;
  36. }
  37. if(!empty($time['team2']))
  38. {
  39. $times[$minute]['team2'] = ++$score2;
  40. }
  41. }
  42. echo '<pre>'; print_r($times);
ibalyx
Cytat(kreatiff @ 7.03.2015, 11:36:21 ) *
Można i tak:
  1. $wynik_gosp = 3;
  2. $wynik_goscie = 1;
  3.  
  4. $minuty = range(1,90);
  5.  
  6. shuffle($minuty);
  7. $gosp = array_slice($minuty, 0, $wynik_gosp);
  8. sort($gosp);
  9.  
  10. shuffle($minuty);
  11. $goscie = array_slice($minuty, 0, $wynik_goscie);
  12. sort($goscie);
  13.  
  14. echo'<pre>',var_dump( $gosp ),'</pre>';
  15. echo'<pre>',var_dump( $goscie ),'</pre>';
Podział na połowy to już kwestia <= 45


to mnie nie urządza, bo już mam podany wynik do przerwy. np. 3:1 (2:0)

Cytat(Pyton_000 @ 7.03.2015, 14:56:41 ) *
Proszę, w ramach relaksacji spłodziłem to. Może nie jest idealne i można wieeele poprawić ale..
  1. <?php
  2.  
  3. $times = array_fill(0, 91, null);
  4.  
  5. $score1 = mt_rand(0,4);
  6. $score2 = mt_rand(0,4);
  7.  
  8. while($score1 != 0)
  9. {
  10. $key = (int)mt_rand(0, 91);
  11. if(!empty($times[$key]['team1']))
  12. {
  13. continue;
  14. }
  15. $times[$key]['team1'] = 1;
  16. $score1--;
  17. }
  18.  
  19. while($score2 != 0)
  20. {
  21. $key = (int)mt_rand(0, 91);
  22. if(!empty($times[$key]['team2']))
  23. {
  24. continue;
  25. }
  26. $times[$key]['team2'] = 1;
  27. $score2--;
  28. }
  29.  
  30. $times = array_filter($times);
  31. foreach($times as $minute => $time)
  32. {
  33. if(!empty($time['team1']))
  34. {
  35. $times[$minute]['team1'] = ++$score1;
  36. }
  37. if(!empty($time['team2']))
  38. {
  39. $times[$minute]['team2'] = ++$score2;
  40. }
  41. }
  42. echo '<pre>'; print_r($times);


dzięki :-) o to mi chodziło. już sobie podzielę na połowy.
kreatiff
Cytat(ibalyx @ 7.03.2015, 15:40:47 ) *
to mnie nie urządza, bo już mam podany wynik do przerwy. np. 3:1 (2:0)
No bez jaj, wystarczy rozbić na dwie połowy ten kod. Trochę inwencji. No ale skoro już masz rozwiązanie to ok.
ibalyx
no nie wystarczy :-) bo już teraz losujesz z jednej tablicy dwa razy, więc ta sama minuta może wystąpić dwa razy - a ja tego nie chcę.
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.