Avatar billede palito Nybegynder
22. august 2008 - 20:01 Der er 19 kommentarer

Bilspil - Bil mod bil

Jeg har før forsøgt at få hjælp til et bilspil her på eksperten, men tråden døde vist helt ud.

Jeg vil have at to biler kører mod hinanden, og af disse to skal der findes en vinder. Jeg har fået hjælp til nedenstående, men mangler stadig at få udregnet vinderen af kampen.

<?php
$car_one = 240;
$car_two = 380;

$total = $car_one+$car_two;

$car_one_percent = round( $car_one/$total*100 );
$car_two_percent = round( $car_two/$total*100 );
Avatar billede jakobdo Ekspert
22. august 2008 - 21:01 #1
Hvad er det du spørger om hjælp til ?
Avatar billede jensgram Nybegynder
22. august 2008 - 21:05 #2
$winner = $car_one > $car_two ? 'CAR ONE' : 'CAR TWO';

???
Avatar billede palito Nybegynder
22. august 2008 - 21:06 #3
At finde en vinder blandt $car_one og $car_two, og tallene jeg har angivet er selvfølgelig det antal hestekræfter hver bil besidder :-D

$car_one_percent og $car_two_percent indeholder den chance den pågældende bil har for at vinde 'kampen'.
Avatar billede palito Nybegynder
22. august 2008 - 21:06 #4
jensgram - nej. den dårlige bil skal jo også have en chance for at vinde :P
Avatar billede palito Nybegynder
22. august 2008 - 21:07 #5
så det er noget med rand(0,100) i hvert fald :)
Avatar billede jakobdo Ekspert
22. august 2008 - 21:11 #6
Men du skal vel have en vægtning, så din bil2 har en fordel, men ikke altid vil vinde.
Avatar billede palito Nybegynder
22. august 2008 - 21:12 #7
Jeg har ingen idé om hvordan det skal gøres :-)
Avatar billede jakobdo Ekspert
22. august 2008 - 21:22 #8
Måske noget ala:

<?php
//http://www.eksperten.dk/spm/842623

$car_one = 240;
$car_two = 380;

$total = $car_one+$car_two;

$car_one_percent = round($car_one/$total*100);
$car_two_percent = round($car_two/$total*100);

$value = rand(0,100);

if($value > 0 && $value <= $car_one_percent){
    echo 'CAR1 Vinder';
}else{
    echo 'CAR2 Vinder';
}

?>
Avatar billede palito Nybegynder
22. august 2008 - 21:32 #9
jakobdo -> tak for det! er det den smarteste måde at gøre det på? scriptet virker ret rodet sådan, men jeg kan i hvert fald ikke selv regne noget smartere ud :D
Avatar billede jakobdo Ekspert
22. august 2008 - 21:35 #10
Jeg synes måske ikke det er smuk kode, men kan ikke lige finde på en smartere løsning her og nu.
Men der er jo nok nogle skarpe knive derude, som bare lige skal finde vej til keyboardet, så vent evt. og se tiden an.
Avatar billede jensgram Nybegynder
22. august 2008 - 21:35 #11
Jaja, jeg kunne da ikke vide, at tallene "er selvfølgelig det antal hestekræfter hver bil besidde" :)
Avatar billede palito Nybegynder
22. august 2008 - 21:41 #12
jakobdo -> har du et forslag til at finde vinderen hvis koden ser således ud:

# Set $cars
$cars = array(
    1 => 250,
    2 => 500,
    3 => 1000
);

# Set $total
$total = array_sum( $cars );

# Calculate winner-chances
foreach( $cars as $id => $hp )
{
    $cars_winner_percentage[$id] = round( $hp/$total*100 );
}
Avatar billede palito Nybegynder
22. august 2008 - 21:55 #13
Nu har jeg prøvet noget alá:

<?php
# Set $cars
$cars = array(
    1 => 250,
    2 => 500,
    3 => 750,
    4 => 10000
);

# Set $total
$total = array_sum( $cars );

# Calculate winner-chances
foreach( $cars as $id => $hp )
{
    $cars_winner_percentage[$id] = round( ( $hp/$total )*100 );
}

# Calculate position
foreach( $cars_winner_percentage as $id => $winner_percentage )
{
    # Set $lucky_number
    $lucky_number = rand( 0, 100 );

    # Print $winner_percentage
    echo "<div>Car #{$id}: " . ( $lucky_number < $winner_percentage ? "yes" : "no" );
}
?>
Avatar billede palito Nybegynder
22. august 2008 - 21:56 #14
Men det ville være lidt blæret med nogle placeringer :)
Avatar billede jensgram Nybegynder
22. august 2008 - 21:57 #15
Hvis vi skal følge idéen fra tidligere:

...


$winner = NULL;
$rnd = rand(1, 100);
$sum = 0;
foreach ($cars_winner_percentage as $id => $p) {
    $sum += $p;
    if ($rnd <= $sum) {
        $winner = $id;
        break;
    }
}


Utestet!
Avatar billede jakobdo Ekspert
22. august 2008 - 21:58 #16
Ikke en flot løsning igen, men:

$value = rand(0,100);

foreach( $cars as $id => $hp )
{
    if($cars_winner_percentage[$id] <= $value){
die('Vinderen er bil: ' . $id . '<br />';
}
}
Avatar billede jensgram Nybegynder
22. august 2008 - 21:58 #17
Mit var en kommentar til  22/08-2008 21:41:34
Avatar billede palito Nybegynder
22. august 2008 - 22:00 #18
hvad hvis jeg vil sortere mit array $cars efter vinderen? jeg har også søgt nettet tyndt efter sådan en funktion. jeg ville ellers tro der lå massere bilspil osv på nettet, men jeg har intet kunnet finde.
Avatar billede jakobdo Ekspert
23. august 2008 - 08:50 #19
Denne er måske lidt bedre:

<?php
//http://www.eksperten.dk/spm/842623

$cars = array(
    1 => 250,
    2 => 500,
    3 => 750,
    4 => 10000
);

function returnWinner($carsArray){
    $temp = array();
   
    $total = array_sum( $carsArray );
    $cars_winner_percentage = array();

    foreach($carsArray as $id => $hp ){
        $cars_winner_percentage[$id] = round( ( $hp/$total )*100 );
    }
   
    foreach($cars_winner_percentage as $id => $weight ){
        $temp = array_merge($temp,array_fill(0,$weight,$id));
    }
   
    $random = rand(0,99);
    return $temp[$random];
}

$temp = $cars;

for($i = 1; $i <= count($cars); $i++){
    $winner = returnWinner($temp);
    echo 'Nummer ' . $i . ' blev bil : ' . $winner . '<br />';
    unset($temp[$winner]);
}

?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester