Verkorten van werkend uitreken-script

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Richard Hansma

Richard Hansma

05/09/2015 14:51:51
Quote Anchor link
Hallo PHP-ers,

Laatst kreeg ik het verzoek van een vriend van mij om een stuk code te schrijven die moet uitrekenen hoeveel 'loot' je krijgt als je iemand aangevallen hebt. Het gaat om: goud, steen en voedsel. De bedoeling is om 33% goud en steen mee te nemen en 34% voedsel. Mocht het zo zijn dat er bijv. te weinig voedsel is, wordt dit verrekent met het goud en steen.

Het is gelukt om een script te schrijven die hiervoor zorgt, echter vind ik het ontzettend lang voor zoiets "simpels". Misschien dat een frisse blik voor een verkorte versie kan zorgen.

Aangezien de source vrij groot is, heb ik het in pastebin gezet: http://pastebin.com/91kjVN3s

Alvast bedankt!
 
PHP hulp

PHP hulp

28/03/2024 22:45:13
 
Eddy E

Eddy E

05/09/2015 16:39:11
Quote Anchor link
Mijn inziens.

Stel je hebt 9 goud.
Wat er vanaf gaat is dus 3 (9 / 3 = 3, afronden naar beneden).
Stel je hebt 3 goud: 3/3 = 1, dus dat gaat.
Stel je hebt 2 goud: 2/3 = 0,666, floor() erover = 0 eraf.
Stel je hebt 200 goud: 200/3 = 66,666, floor() erover = 66 eraf.

Dus het gaat altijd. Je zal (door de floor() nooit) te weinig goud of steen hebben.
Dat is gewoon onmogelijk.
Dus al die controles of je wel genoeg hebt, is onzin.
Enige wat kan gebeuren, is dat je te weinig voedsel hebt... waarom daar niet gewoon 34% van?
Met floor() erover, kan het altijd.

Stel, goud = 1; steen = 1; voedsel = 0.
Goud (1) / 3 = 0,33 >> 0 eraf
Steen (1) / 3 = 0,33 >> 0 eraf
Voedsel (1) * 0.34 >> 0 eraf
Geen probleem dus.

Dan even bij 1000 van alles, maar te 'weinig' voedsel
Goud: 1000 / 3 = 333,333 >> 333 eraf
Steen: 1000 / 3 = 333,333 >> 333 eraf
Voedsel: 1000 / 0.34 = 340 >> 340 eraf

Bedenk eens een scenario waarin het niet gaat?
Ipv delen door 3 kan je natuurlijk ook keer * 0.33 doen ;)
 
Richard Hansma

Richard Hansma

05/09/2015 17:20:01
Quote Anchor link
Bedankt voor het reageren!

Ik zie dat ik iets niet helemaal duidelijk verwoord heb. Elke aanvaller heeft een bepaalde opslagplaats. Die inhoud wordt gevuld door 33%, 33%, 34%. Als je dan een opslag van 100 hebt en er is maar 25 goud is er dus ruimte over in je opslag voor extra steen/voedsel.
 
Eddy E

Eddy E

05/09/2015 17:35:57
Quote Anchor link
Dat volg ik niet helemaal.
Een opslag kan dus een capaciteit van 200 hebben?
Dan is dus automatisch daarvan 33% goud (dus 66), 33% steen (66) en de rest (34%) is voedsel 68?

Maar er kan een limiet zijn van 25 goud (meer niet beschikbaar), dan is er dus 25 goud, 66 steen (33%) en de rest (118) is dan dus voedsel?
En bij een overval gaat van die 25, 66 en 118 33% eraf?
Maar jij rekent nu 33% van de opslag, niet vanaf wat er daadwerkelijk is.

Dat lijkt mij krom.
 
Richard Hansma

Richard Hansma

05/09/2015 17:44:16
Quote Anchor link
Nee, het overschot aan opslag wordt 50/50 verdeeld over de andere 2 grondstoffen. Mocht ook dit falen, wordt de opslag gevuld met wat er maar "over" is.

Dus:

Opslag: 100
Goud: 25
Steen: 50
Voedsel: 50

Er is alleen te weinig goud, want er mist 8. Dus om alsnog tot een volle opslag te komen wordt er 4 steen en 4 voedsel extra meegenomen.

Opslag: 100
Goud: 25
Steen: 35
Voedsel: 75

In dit geval is er te weinig goud en te weinig steen om het overschot 50/50 te verdelen. Dit zorgt ervoor dat er nog eens extra voedsel meegenomen wordt om tot een volle opslag te komen.
 
Richard Hansma

Richard Hansma

09/09/2015 20:29:47
Quote Anchor link
Niemand die me een zetje in de goede richting kan geven?
Gewijzigd op 09/09/2015 20:30:03 door Richard Hansma
 
Eddy E

Eddy E

09/09/2015 20:32:44
Quote Anchor link
Teken die verdeling eens.
Want echt snappen doe ik het niet.

Je hebt een opslag (een maximale capaciteit) en goud is bepalend.
De rest wordt vanzelf gevuld, zonder enige logica?

In je eerste voorbeeld heb je 25+50+50 materiaal in een opslag van 100... en dan is er te weinig goud? In mijn beleving is je opslag overvol...
En dan doe je er nog 8 bij... waarbij je daarna zegt dat 25+35+75 ook in een opslag van 100 past.
Sorry... mijn wiskunde klopt niet helemaal???
 
Richard Hansma

Richard Hansma

09/09/2015 20:55:27
Quote Anchor link
Tekenen is niet mijn ding, dus ik zal zo gedetailleerd mogelijk antwoorden.

Elke aanvaller stuurt een X aantal troepen naar de verdediger. Al deze troepen hebben een bepaalde opslagcapaciteit beschikbaar.

Voorbeeld:

Aanvaller stuurt 5 troepen met elk 20 opslagcapaciteit mee. (= 100 totaal) Vervolgens na het vechten blijkt er de volgende resources beschikbaar te zijn: 25 goud, 35 steen en 50 voedsel. In totaal is er dus 110 opslagcapaciteit nodig om alles mee te nemen. Aangezien er maar 100 meegenomen kan worden valt er al 10 weg. De beschikbare 100 moet verdeeld worden over 33%, 33% en 34%. Dit komt dus neer op 33 goud, 33 steen en 34 voedsel.

Nu blijkt dat er genoeg steen en voedsel is voor deze verdeling, maar er is 8 goud te weinig. Om toch 100 mee te nemen wordt de overige ruimte 50/50 verdeeld over de resources steen en voedsel. Dit wordt dus +4 (33 - 25 == 8 / 2 == 4) voor beide.

Echter is er nog maar 2 steen "over" (35 - 33 == 2) waardoor de laatste resource ervoor moet zorgen om toch tot 100 te komen.

Uiteindelijk kom je dus op 25 goud, 35 steen en 40 voedsel.
 
Bo Ter Ham

Bo Ter Ham

10/09/2015 00:42:35
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

$total_capacity
= 100;
$resources = array('gold'=>25,'stone'=>35,'food'=>50);
$loot = array();

asort($resources);
foreach($resources as $type => $resource)
{

    $max = floor(($total_capacity-array_sum($loot))/(3-count($loot)));
    if($max > $resource) {
        $loot[$type] = $resource;
    }

    else {
        $loot[$type] = $max;
    }
}


print_r($loot);

?>


Je bedoelt dus zoiets?
Gewijzigd op 10/09/2015 10:08:38 door Bo Ter Ham
 
Richard Hansma

Richard Hansma

10/09/2015 19:13:40
Quote Anchor link
Lijkt precies te doen wat er verwacht wordt. Ontzettend bedankt!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.