Thomas. Skrevet 31. juli 2010 Del Skrevet 31. juli 2010 Hei, trenger hjelp med å erstatte deler av en string. En slik type string: $string = '13|33|33|5|53'; I denne stringen er det da disse verdiene: (programmerer blackjack, A = ess) 5|A|A|3|A Det jeg skal: jeg skal gjøre om verdien til essene om de overstiger 21. Om det ikke overstiger 21 skal det har verdien 11. Altså, eksempelet over vil jeg at skal bli: 5|11|1|3|1 Har kommet dit at jeg henter ut første ESS, men sliter litt med å få til resten (erstatte resten av essene med verdien 1). Noen som kan hjelpe? <?php function KortVerdi($kort) { if($kort >= 1 && $kort <= 4) $value = 2; if($kort >= 5 && $kort <= 8) $value = 3; if($kort >= 9 && $kort <= 12) $value = 4; if($kort >= 13 && $kort <= 16) $value = 5; if($kort >= 17 && $kort <= 20) $value = 6; if($kort >= 21 && $kort <= 24) $value = 7; if($kort >= 25 && $kort <= 28) $value = 8; if($kort >= 29 && $kort <= 32) $value = 9; if($kort >= 33 && $kort <= 36) $value = 1; if($kort >= 37 && $kort <= 40) $value = 10; if($kort >= 41 && $kort <= 44) $value = 10; if($kort >= 45 && $kort <= 48) $value = 10; if($kort >= 49 && $kort <= 52) $value = 10; if($kort >= 53 && $kort <= 56) $value = 11; return $value; } $string = '13|33|33|5|53'; $q = explode('|', $string); $c = count($q); $spillerTotal = 0; $a = 0; $ny = ''; /** henter ut total sum på kort **/ for($i = 0; $i <= ($c-1); $i++) $spillerTotal = KortVerdi($q[$i]) + $spillerTotal; /** sjekker om det er ess i stringen **/ for($i = 0; $i <= (count($q)-1); $i++) { if(in_array($q[$i], array(33, 34, 35, 36, 53, 54, 55, 56))) { $a = $a + 1; /** tar ut første esset **/ if($a == 1) { $f = $i; } } } /** hvis det er fler enn et ess **/ if($a > 1) { for($i = 0; $i <= (count($q)-1); $i++) { /** når man kommer til første ess i stringen **/ if($i == $f) { } else { } } } echo $string . '<br><br> Gammel sum: ' . $spillerTotal . '<br> Ny sum: '.$ny.'<br><br> Det er ' . $a . ' ess blandt kortene! Første ess er(index): ' . $f; ?> Lenke til kommentar
srbz Skrevet 1. august 2010 Del Skrevet 1. august 2010 (endret) Burde du ikke vurdere å behandle hånden som en tabell heller enn som en string? Er du sikker på at det er mer praktisk å behandle ess med verdi 1 og 11 som to kort med ulik identitet? Slik det er nå har du i praksis 56 kort i kortstokken. Jeg ville ha implementert en enkel sorteringsalgoritme som først sorterte hånden i stigende rekkefølge (der ess teller 11) - kan vel så gjerne sorteres etter ID dersom det er mest praktisk, men da må ess ha høyest ID-verdi. Deretter ville jeg ha summert, og fortløpende vurdert om summen overstiger 21. Dersom den gjør det, vil ess automatisk bli å telle 1. Dette ble en svært overfladisk forklaring. Jeg får sette meg grundigere inn i det i morgen dersom du trenger mer hjelp En logisk brist i eksempelet ditt er at du har to kort med samme ID, f.eks. to sparess. Vel mulig at du aldri vil få utdelt to identiske kort, men dette er også noe du må være obs på. Endret 1. august 2010 av srbz Lenke til kommentar
Thomas. Skrevet 7. august 2010 Forfatter Del Skrevet 7. august 2010 (endret) Burde du ikke vurdere å behandle hånden som en tabell heller enn som en string? Er du sikker på at det er mer praktisk å behandle ess med verdi 1 og 11 som to kort med ulik identitet? Slik det er nå har du i praksis 56 kort i kortstokken. Jeg ville ha implementert en enkel sorteringsalgoritme som først sorterte hånden i stigende rekkefølge (der ess teller 11) - kan vel så gjerne sorteres etter ID dersom det er mest praktisk, men da må ess ha høyest ID-verdi. Deretter ville jeg ha summert, og fortløpende vurdert om summen overstiger 21. Dersom den gjør det, vil ess automatisk bli å telle 1. Dette ble en svært overfladisk forklaring. Jeg får sette meg grundigere inn i det i morgen dersom du trenger mer hjelp En logisk brist i eksempelet ditt er at du har to kort med samme ID, f.eks. to sparess. Vel mulig at du aldri vil få utdelt to identiske kort, men dette er også noe du må være obs på. Kunne trenkt noe hjelp med denne biten, ja. Vil ikke poste hele koden her, pga folk kommer til å stjele den Hva som skal skje: - Når totalsummen overstiger 21 med ess skal den gjøres om til 1 istedenfor 11. - F.eks: 9, A = 20. Trekker du da en 5 blir det da A, 9, 5 = 15. Noen som kan hjelpe med det ved å bruke testkoden i førstepost? Edit: Løste det selv! <?php function KortVerdi($kort) { if($kort >= 1 && $kort <= 4) $value = 2; if($kort >= 5 && $kort <= 8) $value = 3; if($kort >= 9 && $kort <= 12) $value = 4; if($kort >= 13 && $kort <= 16) $value = 5; if($kort >= 17 && $kort <= 20) $value = 6; if($kort >= 21 && $kort <= 24) $value = 7; if($kort >= 25 && $kort <= 28) $value = 8; if($kort >= 29 && $kort <= 32) $value = 9; if($kort >= 33 && $kort <= 36) $value = 11; if($kort >= 37 && $kort <= 40) $value = 10; if($kort >= 41 && $kort <= 44) $value = 10; if($kort >= 45 && $kort <= 48) $value = 10; if($kort >= 49 && $kort <= 52) $value = 10; return $value; } $string = '9|33|37'; $q = explode('|', $string); $c = count($q); $spillerTotal = 0; $a = 0; $ny = 0; $ny1 = 0; $j = 0; $m = array(); $n = array(); $z = array(); $p = array(); /** vi legger essene i egen array, vanlige tall i annen array **/ for($i = 0; $i <= ($c-1); $i++) { do { if(!in_array($q[$i], array(33, 34, 35, 36))) { array_push($m, $q[$i]); } if(in_array($q[$i], $m)) { } else { if(in_array($q[$i], array(33, 34, 35, 36))) { array_push($n, $q[$i]); } } } while($c == ($c-1)); } /** henter ut total sum av kortene som ikke er ess **/ for($i = 0; $i <= (count($m)-1); $i++) $ny1 = KortVerdi($m[$i]) + $ny1; /** teller antall ess **/ $v = count($n); /** legger essen til i array med kortet **/ foreach($n as $b) array_push($z, $q[array_search($b, $q)]); if(count($n) > 1) { $ny2 = 0; for($i2 = 0; $i2 <= (count($m)-1); $i2++) { $ny2 = (KortVerdi($m[$i2]) + $ny2); } foreach($n as $h => $u) { if((KortVerdi($u) + ($ny2)) > 21) { array_push($p, 1); $ny2 = $ny2 + 1; } else { if((KortVerdi($u) + ($ny2)) > 21) { array_push($p, 1); $ny2 = $ny2 + 1; } else { array_push($p, 11); $ny2 = $ny2 + 11; } } } } else { for($i = 0; $i <= ($v-1); $i++) { if((KortVerdi($z[$i]) + ($ny1)) > 21) { array_push($p, 1); } else { array_push($p, 11); } } } $ny = array_sum($p) + $ny1; echo $string.'<br>Sum før ess: '.$ny1.'<br>Antall ess: '.$v.'<br>Sum: '.$ny.'<br><br>'; ?> Endret 8. august 2010 av Thomas. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå