Wedstrijd Indeling
Pellens - 18/01/2008 19:42
PHP interesse
Hi
Ik heb een wedstrijdschema op deze manier gemaakt:
<?php
$players[] = "Belg";
$players[] = "Amerikaan";
$players[] = "Vietnamees";
$players[] = "Duitser";
$players[] = "Nederlander";
$players[] = "Chinees";
$players[] = "Afrikaan";
$players[] = "Spanjaard";
$players[] = "Italiaan";
$players[] = "Turk";
foreach($players as $firstplayer)
{
foreach($players as $secondplayer)
{
if($firstplayer != $secondplayer)
{
echo '<tr><td>'.$firstplayer.'</td><td>'.$secondplayer.'</td></tr>';
}
}
}
?>
<?php
$players [ ] = "Belg" ;
$players [ ] = "Amerikaan" ;
$players [ ] = "Vietnamees" ;
$players [ ] = "Duitser" ;
$players [ ] = "Nederlander" ;
$players [ ] = "Chinees" ;
$players [ ] = "Afrikaan" ;
$players [ ] = "Spanjaard" ;
$players [ ] = "Italiaan" ;
$players [ ] = "Turk" ;
foreach ( $players as $firstplayer )
{
foreach ( $players as $secondplayer )
{
if ( $firstplayer != $secondplayer )
{
echo '<tr><td>' . $firstplayer . '</td><td>' . $secondplayer . '</td></tr>' ; }
}
}
?>
Als je deze code even bekijkt, is het niet logisch hoe dat alles ingedeelt is. Ik zou nu moeten bekomen dat wanneer BV. Belgie tegen Amerika moet spelen, het niet kan dat Amerika die dag ook tegen Duitsland speelt...
De bedoeling is dat elke dag ieder land 1 wedstrijd speelt tegen elkaar, dit moet dus juist verlopen...
Het is de basis van een online tekst spel. Kan iemand me verder helpen? (Heb te lang gezocht om dit te bekomen, maar ik vind de juiste touch niet...)
Alvast merci
11 antwoorden
Gesponsorde links
BramBo - 18/01/2008 19:56 (laatste wijziging 18/01/2008 19:56)
JS gevorderde
Kun je 't niet beter met een random genereren ?
dus
$used = array();
while(count($used) < count($players)) {
$fPlayer = getPlayer($players, $used);
$splayer = getPlayer($players, $used);
echo "...";
}
.........
function getPlayer($pArr, $uArr) {
$r = rand(0, (count($pArr)-1));
while($r < count($uArr)) $r = rand(0, (count($pArr)-1));
$p = $pArr[$r];
$uArr[] = $p;
return $p
}
$fPlayer = getPlayer( $players , $used ) ;
$splayer = getPlayer( $players , $used ) ;
}
.........
function getPlayer( $pArr , $uArr ) {
$p = $pArr [ $r ] ;
$uArr [ ] = $p ;
return $p
}
Pellens - 18/01/2008 20:13
PHP interesse
Deze functie geeft ook gewoon een schema weer zoals ik had, toch?
Wat zie ik anders over het hoofd...?
BramBo - 18/01/2008 20:25
JS gevorderde
Nee, hij genereert ze random, terwijl jou code slechts alles doorloopte en het in een lijst zette. Ook wordt er bij gehouden welke reeds gebruikt zijn.
Pellens - 18/01/2008 20:36 (laatste wijziging 18/01/2008 20:44)
PHP interesse
Deze versie is toch niet goed... Zoals ik hem aangepast heb zet hij bv. 1 land dat tegen zichzelf speelt, en het is ongeloofelijk zwaar om te laden (mijn PC bleeft vast hangen)... hij zit in een oneindige lus.
Dit is wat ik gedaan heb:
EDIT
<?php
function getPlayer($pArr, $uArr)
{
$r = rand(0, (count($pArr)-1));
while($r < count($uArr)) $r = rand(0, (count($pArr)-1));
$p = $pArr[$r];
$used[] = $p;
return $p;
}
$players[] = "Belg";
$players[] = "Amerikaan";
$players[] = "Vietnamees";
$players[] = "Duitser";
$players[] = "Nederlander";
$players[] = "Chinees";
$players[] = "Afrikaan";
$players[] = "Spanjaard";
$players[] = "Italiaan";
$players[] = "Turk";
$used = array();
$i = 1;
while(count($used) < count($players))
{
$fPlayer = getPlayer($players, $used);
$splayer = getPlayer($players, $used);
if($i == 200) exit();
else{
echo "<tr><td>$fPlayer - $splayer</td></tr>";
$i++;}
}
?>
<?php
function getPlayer( $pArr , $uArr )
{
$p = $pArr [ $r ] ;
$used [ ] = $p ;
return $p ;
}
$players [ ] = "Belg" ;
$players [ ] = "Amerikaan" ;
$players [ ] = "Vietnamees" ;
$players [ ] = "Duitser" ;
$players [ ] = "Nederlander" ;
$players [ ] = "Chinees" ;
$players [ ] = "Afrikaan" ;
$players [ ] = "Spanjaard" ;
$players [ ] = "Italiaan" ;
$players [ ] = "Turk" ;
$i = 1 ;
{
$fPlayer = getPlayer( $players , $used ) ;
$splayer = getPlayer( $players , $used ) ;
else {
echo "<tr><td>$fPlayer - $splayer </td></tr>" ; $i ++; }
}
?>
BramBo - 18/01/2008 21:36 (laatste wijziging 18/01/2008 21:43)
JS gevorderde
ah ja, vergeten de players en used in global te plaatsen.. Iets dat ik nog steeds niet als logisch beschouw in php...
Anyway herzie je code naar:
while(count($used) < count($players))
{
$fPlayer = getPlayer();
$splayer = getPlayer();
echo "$fPlayer - $splayer<br />";
}
function getPlayer() {
global $players, $used;
$r = rand(0, (count($players)-1));
while(in_array($r, $used)) $r = rand(0, (count($players)-1));
$p = $players[$r];
$used[] = $r;
return $p;
}
{
$fPlayer = getPlayer( ) ;
$splayer = getPlayer( ) ;
echo "$fPlayer - $splayer <br />" ; }
function getPlayer( ) {
$p = $players [ $r ] ;
$used [ ] = $r ;
return $p ;
}
Pellens - 18/01/2008 21:45 (laatste wijziging 18/01/2008 21:46)
PHP interesse
Wat doen die globals precies?
Want dit geeft ook niet het gewenste resultaat...
BramBo - 18/01/2008 21:47 (laatste wijziging 18/01/2008 21:49)
JS gevorderde
global $var; maakt een eerder (hoger gelegen in de hiërarchie) beschikbaar voor een functie.
dus:
$i = 0;
function a() { print $i; }
$i = 0 ;
function a
( ) { print $i ; }
doet niets, terwijl:
$i = 0;
function a() {
global $i;
print $i; }
`0` print
edit: Pak even de laatste aangepaste, zat nog n klein foutje in.
Pellens - 18/01/2008 21:54
PHP interesse
Mmm raar maar ik kom er niet uit... Morgen maar eens herzien dan allemaal... Alvast bedankt BramBo, spijtig dat het niet meteen werkt.
nemesiskoen - 18/01/2008 23:04
PHP expert
Citaat:
ah ja, vergeten de players en used in global te plaatsen.. Iets dat ik nog steeds niet als logisch beschouw in php...
In welke taal heb jij leren coden dan? Want die global is smerig. Geef ze door per referentie, zoals in C, dat is veel sneller. Wat ik niet als logisch beschouw is dat jij x aantal keren de lengte van die array bepaalt. Variabelen dienen ervoor om berekende gegevens op te slaan, gebruik ze daar dan ook voor;-)
Pellens - 18/01/2008 23:07
PHP interesse
Vage, kan je me mss dan verder helpen? Ik zit namelijk nogal vast met de kennis waarover ik beschikt i.z. PHP...
nemesiskoen - 18/01/2008 23:21
PHP expert
Splits je probleem op:
- Je wil dat elk land tegen elk land moet spelen.
- Je wil dat elk land een maal per dag speelt.
Het voordeel van PHP is dat het associatieve arrays heeft, hierdoor kan je eender wat als key gebruiken voor een array, wat het een logische "look" geeft, maar je kan ook gebruik maken van nummertjes.
Ik gebruik hieronder idiote maar eenvoudige variabelnamen, zodat je begrijpt wat ze doen.
De syntax klopt niet, ik heb al een jaar niet geprogrammeerd in PHP, maar verbeter de syntaxfoutjes en je krijgt een goed resultaat.
<?php
$i = 0;
$j = 0;
$rand = 0;
$wedstrijden = array();
$nationaliteiten = array('vlaming', 'nederlander', 'duitser', 'zwitser');
$data = array('dag1', 'dag2', 'dag3');
$hoeveel_nationaliteiten = count($nationaliteiten);
$hoeveel_dagen = count($data);
for(;$i<$hoeveel_nationaliteiten;$i++) {
$wedstrijden[$i] = array();
for(;$j<$hoeveel_dagen;$j++) {
do {
$rand = rand(0, $hoeveel_nationaliteiten-1);
} while(in_array($rand, $wedstrijden[$i]) || in_array($i, $wedstrijden[$rand])|| $rand==$i);
$wedstrijden[$i][$j] = $rand;
printf("%s speelt tegen %s op %s", $nationaliteiten[$i], $nationaliteiten[$rand], $data[$j]);
}
}
<?php
$i = 0 ;
$j = 0 ;
$rand = 0 ;
$nationaliteiten = array ( 'vlaming' , 'nederlander' , 'duitser' , 'zwitser' ) ; $data = array ( 'dag1' , 'dag2' , 'dag3' ) ;
$hoeveel_nationaliteiten = count ( $nationaliteiten ) ; $hoeveel_dagen = count ( $data ) ;
for ( ; $i < $hoeveel_nationaliteiten ; $i ++ ) {
$wedstrijden [ $i ] = array ( ) ; for ( ; $j < $hoeveel_dagen ; $j ++ ) {
do {
$rand = rand ( 0 , $hoeveel_nationaliteiten - 1 ) ; } while ( in_array ( $rand , $wedstrijden [ $i ] ) || in_array ( $i , $wedstrijden [ $rand ] ) || $rand == $i ) ; $wedstrijden [ $i ] [ $j ] = $rand ;
printf ( "%s speelt tegen %s op %s " , $nationaliteiten [ $i ] , $nationaliteiten [ $rand ] , $data [ $j ] ) ; }
}
Gesponsorde links
Dit onderwerp is gesloten .