/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
at generere et kampprogram
Fra : Thomas


Dato : 22-07-03 14:30

hej,

jeg er i gang med et projekt hvor jeg har brug for at generere et
kampprogram for en liga/division fx vores egen superliga. antal spillerunder
og antal hold behøver ikke hænge sammen proportionalt. som det ser ud nu har
jeg alle holdene i et array fra 0 til antal hold-1 (arrayet bliver opbygget
så holdene kommer ind i tilfældig rækkefølge)

ideen med dette kampprogram er jo at alle hold skal spille en gang mod
hinanden. hvis der så er flere spillerunder tilbage derefter skal rutinen
bare gentages. alle hold skal bare have lige mange kampe stadigvæk.

her kommer mit løsningsforslag så: jeg kører et for-loop fra 1 til antallet
af hold. inde i dette for-loop har jeg så et while-loop der kører indtil en
bestemt variabel (som blive +1 hver gang while loopet køres korrekt) har
nået antallet af spillerunder. i dette while-loop bliver holdet fra
for-loopet sat op imod det næste hold i hold-arrayet hvis det ikke er holdet
selv.

men her kommer jeg til kort. selvom det ser meget pænt ud er der lækager i
mit forslag. bl.a. kan jeg ikke kontrollere at de samme hold ikke spiller
mod hinanden i de samme spillerunder. jeg har brugt meget tid på at finde en
løsning på hvordan man genererer et kampprogram ordentligt, men det har
endnu ikke lykkes mig. derfor bringer jeg det nu her.

på forhånd tak for hjælp/forslag,
Thomas P



 
 
Jesper Brunholm (23-07-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 23-07-03 07:07

Thomas wrote:
> men her kommer jeg til kort. selvom det ser meget pænt ud er der lækager i
> mit forslag. bl.a. kan jeg ikke kontrollere at de samme hold ikke spiller
> mod hinanden i de samme spillerunder. jeg har brugt meget tid på at finde en
> løsning på hvordan man genererer et kampprogram ordentligt, men det har
> endnu ikke lykkes mig. derfor bringer jeg det nu her.

jeg ville nok lægge de forskellige kampe i nogle arrays mens jeg laver
opstillingerne, og så checke tilbage mod forekomst i de arrays med
in_array().

Det skulle være ret let at sikre at holde ikke spiller mod sig selv med
en if...

Du kender foreach() til gennemløbning af arrays som ret stærkt
alternativ til while ikke?

Derudover en strøtanke: jeg vil tro at andre før dig har lavet det her,
men jeg aner ikke om det er til at finde på de internationale
programmeringsgrupper, eller i fx hotscripts.com...

mvh

Jesper Brunholm


Thomas (23-07-2003)
Kommentar
Fra : Thomas


Dato : 23-07-03 11:06

> jeg ville nok lægge de forskellige kampe i nogle arrays mens jeg laver
> opstillingerne, og så checke tilbage mod forekomst i de arrays med
> in_array().

Måske lave et array for hver spillerunde? Jeg har fundet ud af at antal
spillerunder alligevel ikke skal være noget man selv kan bestemme. Antal
hold skal være et lige tal og antal spillerunder skal så være 1 mindre end
antal hold. Så hvis der er 8 hold er der 7 spillerunder.

> Det skulle være ret let at sikre at holde ikke spiller mod sig selv med
> en if...
>
> Du kender foreach() til gennemløbning af arrays som ret stærkt
> alternativ til while ikke?

For at være helt ærlig er jeg forholdsvist ny i php, så jeg kender ikke så
mange kontrolstrukturer udover if, while og for (men jeg kender dog til
programmering fra de gamle pascal). Så, tak for hjælpen - det har i hvert
fald givet mig nyt håb om at løse problemet :)

- Thomas



Thomas (23-07-2003)
Kommentar
Fra : Thomas


Dato : 23-07-03 14:53

Jeg har produceret noget kode på baggrund af dit forslag om at bruge arrays
til at vise hvem der har spillet sammen.

<kode>

$c_teams=$i_teams; //i_teams er parameter der afspejler antal hold
$c_teams_div2=$i_teams/2; //kampe per spillerunde
$c_rounds=$c_teams-1; //spillerunder

//$b_teams_ar skal indeholde alle teams - arrayet inde i dette indeholder så
de teams de HAR spillet mod
$b_teams_ar = array();

for ($k=0;$k<=$c_teams;$k++) {
$b_teams_ar[$k] = array ("$k"); //fordi de alligevel ikke skal spille mod
hinanden
}

if($c_teams % 2) //hvis tallet er ulige
{
echo "Tallet er ulige - det holder bare ikke";
}

else if ($c_teams > 0) //hvis tallet er lige og over 0
{

for ($i=1;$i<=$c_rounds;$i++)
{
for ($j=1;$j<=$c_teams_div2;$j++) {

//En kamp i den givne runde - det er her jeg er i tvivl

echo "round $i: <br>"; }
}

}

</kode>

Det lader til at det bagvedliggende nu skulle kunne fungere. Jeg kan bare
ikke finde ud af hvordan jeg skal løbe holdene igennem for at lave kampe til
dem. Du nævnte foreach, men jeg kan ikke helt se hvordan. Koden her synes
jeg fungerer som fin skabelon - håber I kan hjælpe mig.

- Thomas



Jesper Brunholm (23-07-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 23-07-03 23:50

Thomas wrote:
> Jeg har produceret noget kode på baggrund af dit forslag om at bruge arrays
> til at vise hvem der har spillet sammen.

[snip: en stak kode]

Jeg må indrømme at jeg har svært ved at finde ud af præcist hvad du vil
og hvorfor du gør det du gør.

Kan du ikke prøve at lave en funktionalitetsskitse i stilen

ListeMedAlleHold /* fås ved at ... */

ListeMedPuljeAKampe /* fås ved at løbe første halvdel af

ListeMedAlleHold igennem og parre med random partnere i anden halvdel */

ListeMedPuljeBKampe /* samme fremgangsmåde, men nu skal der checkes for
gengangere med in_array op mod ListeMedPuljeAKampe. Samtidig sikres imod
at spille mod sig selv */

osv. Så er du sikker på at få det tænkt logisk igennem. Det vil
sandsynligvis også gøre det lettere at få os til at forstå de
programmeringsproblemer der måtte ligge tilbage.


Hvad foreach angår så se her: http://www.php.net/foreach
Der hvor det bliver sjovt er:
$mitArray=array(1=>'en', 2=>'to'3=>'tre');

foreach($mitArray as $noegle => $indhold){
echo 'På plads'.$noegle.' ligger værdien '.$indhold;
}


mvh

Jesper Brunholm


Meta Lion (03-09-2003)
Kommentar
Fra : Meta Lion


Dato : 03-09-03 01:03

Thomas wrote:
> hej,
>
> jeg er i gang med et projekt hvor jeg har brug for at generere et
> kampprogram for en liga/division fx vores egen superliga. antal spillerunder
> og antal hold behøver ikke hænge sammen proportionalt. som det ser ud nu har
> jeg alle holdene i et array fra 0 til antal hold-1 (arrayet bliver opbygget
> så holdene kommer ind i tilfældig rækkefølge)

[...]

Jeg står selv over for at lave en algoritme som sørger for at alle hold
møder alle lige mange gange og spille én kamp pr. runde.
Jeg startede ud med at lave en liste over alle kampene ved at lade
hjemmeholdet køre i en for() og udeholdet i en indre for() (og valgte i
første omgang at se bort fra ude/hjemme, og lod blot holdene møde
hinanden én gang).
Det virkede også fint, men problemet opstod da der skulle rundenumre på
de forskellige kampe.
Jeg kunne ikke finde på nogen simpel algoritme som sørgede for at alle
mødte alle og spillede én kamp per runde. "Systemet" virker mere og mere
tilfældigt jo flere hold man smider i kampprogrammet.
Jeg tog så fat på problemet fra den anden ende hvor jeg tog en runde af
gangen. Men det så stadig lige tilfældigt ud. Da den perfekte algoritme
var ude af syne bestemte jeg mig for at gå på kompromis med min
perfektionisme og ganske enkelt for hver kamp checke om det givne hold
havde spillet mod en bestemt modstander. I det tilfælde ville en løkke
forsøge med et nyt hold til der var bid, og så så det lige pludselig
godt ude, men...
Endnu en gang viste hele kampprograms problematikken sig meget
kompliceret. Det virkede fint med 4, 6 og 8 hold men derefter stødte jeg
i problemer, da de 4 første kampe, i en 5-kamps runde, var planlagt og
de resterende to hold tidligere havde mødt hinanden.
Jeg er klar over at dette problem sikkert ville kunne løses ved at lade
scriptet gå tilbage og fortryde første planlagte kampe i en runde, eller
i særtilfælde sæson. Men så er det til sidst så kedeligt.
Jeg kan ikke tro at dette problem ikke kan løses rent matematisk. Hvad
gør de mange ligaer rundt omkring i verden? Bruger én bestemt algoritme
og retter det til hvor den ikke holder?
Jeg undrer mig for jeg har ikke fundet nogen løsning på problemet på
nettet, hvor jeg nu er kommet frem.
Jeg fandt dog noget som lignede en universitetsrapport om emnet, men den
var ikke så specifik i forhold til algoritmen, men den bekræftede mig
dog i at dette emne er mere kompliceret end jeg hidtil havde troet.

Nogen som har noget at tilføje? Skriv endelig hvis jeg har taget
grundigt fejl og der findes en såre simpel algoritme som planlægger et
kampprogram :)


Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408946
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste