login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Slagingspercentage

Offline Bart - 20/06/2005 16:50
Avatar van BartPHP expert Hey,
Ik ben bezig met een eigen MMORPG (Massive Multiplayer Online Roleplaying Game) nu wil ik een "misdaden" script maken.
Dit is ongeveer hetzelfde aan; zoals de meeste van bootleggers, mobstar, barafranca kennen. Nu heb ik een script die wel werkt, maar toen kwam ik erachter dat die percentages van kans op slagen elke keer anders zijn. Nu weet ik dat dit kan met de functie: rand(). Maar ik weet niet hoe ik dat ook nog eens doe met de SQL. Want hij moet immers de slaginspercentage onthouden.

Weet iemand hoe ik dit kan doen, dit zou mij echt ongelooflijk helpen?

Voorbeeld

29 antwoorden

Gesponsorde links
Offline Gerard - 20/06/2005 16:59
Avatar van Gerard Ouwe rakker een slagingspercentage kan je bijvoorbeeld berekenen door het aantal items wat iemand heeft en hoeveel 'punten' deze waard zijn.

daarnaast kan je de xp (experience) van een user bijhouden en deze mee laten tellen.

Dan kan je weer een kleine som maken hoeveel xp//punten er nodig zijn om goed te slagen in een misdaad.

Het is niet zo makkelijk hoor, maar wel een boel logisch denken. 
Offline Bart - 20/06/2005 17:05 (laatste wijziging 20/06/2005 17:08)
Avatar van Bart PHP expert Maar als het slaginspercentage bijvoorbeeld 86% is, dan moet het ook zo zijn dat ie kan mislukken.

EDIT: Maar het moet wel weer zo zijn: Hoe hoger het percentage, hoe hoger de kans van slagen.
Offline Legolas - 20/06/2005 17:15
Avatar van Legolas Onbekend Dan kun je voor elk percentage een array opstellen met nullen en enen, netals binair^^
dus bereken de kans, bijv. 50%, dan is het:
array(0,1);
En daar haal je de random uit.
Offline Bart - 20/06/2005 17:17
Avatar van Bart PHP expert Kun je een iets uitgebreider voorbeeld geven. En dan ook hoe je die array gebruikt?
Offline Legolas - 20/06/2005 17:20
Avatar van Legolas Onbekend
  1. <?
  2. $array = array(0,0,1); // 33% ;-)
  3. $random = rand(0,count($array));
  4. if($array[$random] == 1)
  5. {
  6. echo "Geslaagd";
  7. }
  8. else echo "Mislukt:p";
  9. ?>
Offline Maarten - 20/06/2005 17:23
Avatar van Maarten Erelid dan kan je evengoed slaagkans(33); maken, en 33 enen en 76 nullen in een array gooien, want als je op jouw manier 87 procent wilt gebruiken ga je een nogal lange functie krijgen 
Offline Legolas - 20/06/2005 17:24
Avatar van Legolas Onbekend @Murfy:
hoe zou jij het dan doen;-)

volgens mij gaat dit toch best snel...

de array heeft maximaal 100 keys, wat nooit langzamer dan mss 1 seconde kan lopen, so what;-)
Offline Maarten - 20/06/2005 17:27 (laatste wijziging 20/06/2005 17:29)
Avatar van Maarten Erelid Snelheid maakt geen hol uit, het gaat om de overzichtelijkheid van je script.

  1. <?php
  2. function slaagkans($kans) {
  3. $arr = array_fill(1,$kans,1);
  4. }
  5. ?>
Op die manier kan je gemakkelijk $kans aantal eentjes erin gooien, dus als je gewoon die nullen dan nog aanvult en een outputmessage eraan hangt is het klaar (we geven hier de pap niet in de mond hoor) en gebruik je je functie gewoon als

slaagkans(blaat);
Offline Fenrir - 20/06/2005 17:35 (laatste wijziging 20/06/2005 17:38)
Avatar van Fenrir PHP expert Bij een spel maakt snelheid veel uit.
Het moet snel zijn, omdat je veel hits krijgt.
Dus beter dit:

  1. <?php
  2.  
  3. function ProcentKans($procent)
  4. {
  5. return rand(0, 100) < $procent; // Super elegant statement, en snel
  6. }
  7.  
  8. ?>


Genereert dus een bool, met $procent kans op true.

Dus voor een crime van 15% slagingskans:
  1. <?php
  2.  
  3. if(ProcentKans(15))
  4. {
  5. echo 'geslaagd';
  6. }else
  7. {
  8. echo 'mislukt';
  9. }
  10.  
  11. ?>
Offline Legolas - 20/06/2005 17:36
Avatar van Legolas Onbekend ah... ik dacht anders aan een for-loop:
  1. <?
  2. function slaagkans($kans)
  3. {
  4. $arr = array();
  5. $nullen = 100 - $kans;
  6. for($i = 0; $i < $nullen; $i++)
  7. {
  8. $arr[$i] = 0;
  9. }
  10. // stel dat $nullen 3 was geweest, dan moeten er nog 97 enen worden ingevuld:
  11. $aantal = 100 - $nullen;
  12. $start = count($arr);
  13. for($i = $start; $i < $aantal; $i++)
  14. {
  15. $arr[$i] = 1;
  16. }
  17. }
  18. ?>

Dat is nog overzichtelijker, en volgens mij ook beter.
Deze klopt denk ik.
Overigens kwam het idee van een array wel van mijn kant;-)
Offline Fenrir - 20/06/2005 17:37 (laatste wijziging 20/06/2005 17:43)
Avatar van Fenrir PHP expert Wordt wakker!

Citaat:
Overigens kwam het idee van een array wel van mijn kant;-)

En daar ben je trots op? 

Ennuh:
Citaat:
[..code..]

Werkt niet altijd, want als een array 3 elementen heeft, dan geeft count() 3 terug. En de hoogste index is dan 2, dus krijg je errors:
Notice: undefined index 3
Offline Tuinstoel - 20/06/2005 17:42
Avatar van Tuinstoel PHP expert Ik zal even uitleg geven hoe ik dat doe.

Ik heb in de MySQL een kolom "misdaden"
In deze kolom zit hetvolgende
0|0|0|0|0|0|0|0|0
Dit zijn er negen, de eerste voor de tijd wanneer de misdaad is gedaan.
Ik snij het eerst met explode() in stukken, zodat je de percentage's van 8 misdaden hebt.
Dan doe je gewoon $aGesneden[$iMisdaadNr]; en dan > dan rand(1,100);

En zo heb ik per type misdaad een bepaald aantal %en dat er bij of er af kan gaan, onder de 25% is dit standaard wat meer, omdat je anders nooit op weg kan komen.

Btw op een eind moet je altijd een for loopje doen die controleert of het niet boven de honderd zit.
Offline Fenrir - 20/06/2005 17:43
Avatar van Fenrir PHP expert @Tuinstoel: kun je niet beter een aparte tabel "misdaden" maken? Volgens de regels van normalisatie wel.
Offline Tuinstoel - 20/06/2005 17:47
Avatar van Tuinstoel PHP expert Normaliseren? Shut the 
Ik heb gewoon alles in een tabel geflikkerd genaamd "leden", werkt gewoon wat praktiser, hoef je ook niet zo te kloten. Jij hebt geen benul hoe hoog de serverloads kunnen zijn dankzij al die mysql query's, en dat is echt knooi werk om zo zuinig mogelijk te zijn .
Offline Gerard - 20/06/2005 17:48
Avatar van Gerard Ouwe rakker normaliseren zal je h00ker ! 
Offline Legolas - 20/06/2005 18:35
Avatar van Legolas Onbekend Ik heb die van mij even uitgewerkt, want hij deed het eerst niet, allebei niet, erg dom van me, dus ik dacht dat moet ik even rechtzetten:p
Netjes uitgewerkt kom ik tot dit:
  1. <?
  2. $kans,
  3. $arr,
  4. $nullen,
  5. $array;
  6. function create_array($kans)
  7. {
  8. $nullen = 100 - $kans;
  9. for (
  10. $i = 0;
  11. $i < $nullen;
  12. $i++
  13. )
  14. {
  15. $arr[$i] = 0;
  16. }
  17. $aantal = 100 - $nullen;
  18. $aantal += 50;
  19. for (
  20. $j = $kans;
  21. $j < $aantal;
  22. $j++
  23. )
  24. {
  25. $arr[$j] = 1;
  26. }
  27. return $arr;
  28. }
  29. $array = create_array(50);
  30. if($array[rand(0,99)] === 1)
  31. echo "Geslaagd!!";
  32. else
  33. echo "Jammer!";
  34. ?>

Laadtijd blijft op mijn erg langzame server zelfs onder de 0,5 seconden, dus it will do;-)
Offline Tuinstoel - 20/06/2005 18:40
Avatar van Tuinstoel PHP expert omg wat doen jullie moeilijk.
Btw waarom zet je die global buiten de functie? Klinkt niet logisch in mijn oren.
Offline Legolas - 20/06/2005 18:43
Avatar van Legolas Onbekend Omdat ik een hele tijd met $arr en $kans heb lopen kl***en, en global was de oplossing, daarvoor gingen alle variabelen verloren:|
Offline Bart - 20/06/2005 18:50
Avatar van Bart PHP expert @Tuinstoel
En wat doe je dan na dat een misdaad is gelukt?
Offline nemesiskoen - 20/06/2005 18:59 (laatste wijziging 20/06/2005 19:01)
Avatar van nemesiskoen Gouden medaille

PHP expert
@legolas:
of ik vergis me heel erg, of dit is heel erg raar.
  1. $nullen = 100 - $kans;
  2. //code
  3. $aantal = 100 - $nullen;

is aantal dan niet gewoon gelijk aan $kans?

bv.
$kans = 60
$nullen = 100 - 60; (40)
$aantal = 100 - 40; (60)

kan je niet gewoon beter verder werken met $kans?
en er bestaat 1 kleine functie voor die 2 loops, namelijk array_fill

  1. <?php
  2. $arr = array_fill(0, $nullen, 0);
  3. $arr = array_fill($nullen, 100, 1);
  4. ?>


mss iets korter?
Offline Legolas - 20/06/2005 19:00
Avatar van Legolas Onbekend @nemesiskoen:
array_fill deed het bij mij niet, want dan werd de hele array leeg gemaakt, en dan dus gefillt...
verder heb je wel gelijk;-):p
Offline nemesiskoen - 20/06/2005 19:02
Avatar van nemesiskoen Gouden medaille

PHP expert
je moet aanvullen, niet gewoon vullen
door het eerste argument geef je mee vanwaar hij moet beginnen
(denk'k toch)
Offline Maarten - 20/06/2005 19:15
Avatar van Maarten Erelid @nemesis: idd, het eerste argument is de beginindex. Dat stelde ik ook voor eerst, maar Fenrir gaf het NOG korter, dus ik snap niet waarom je al die moeite doet, Legodoos, als het ook in 1 regel kan. En dat is volgens mij ietsje sneller.
Offline nemesiskoen - 20/06/2005 19:21
Avatar van nemesiskoen Gouden medaille

PHP expert
Woops je hebt gelijk murfy. Sorry, heb volledig over jou code gezien. Maar je hebt gelijk, het antwoord is al lang gegeven op zijn beste, eenvoudigste, logischte en snelste manier.
Offline riekele - 21/06/2005 14:18 (laatste wijziging 21/06/2005 14:22)
Avatar van riekele PHP beginner hmm ik heb het op een veel langere maar makkelijkere manier gedaan...

als ik een misdaad heb gedaan laat ik met dit scriptje in de databases nieuwe slagingskansen opslaan
  1. <?php
  2. if($crimes<=2)
  3. {
  4. $rand1=rand(0,2);
  5. $rand2=rand(0,1);
  6. $rand3=rand(0,1);
  7. $rand4=rand(0,0);
  8. $rand5=rand(0,0);
  9. $query = 'UPDATE Login SET crime1 = "'.$rand1.'" WHERE naam = "'.$username.'"';
  10. $result = mysql_query($query);
  11. $query = 'UPDATE Login SET crime2 = "'.$rand2.'" WHERE naam = "'.$username.'"';
  12. $result = mysql_query($query);
  13. $query = 'UPDATE Login SET crime3 = "'.$rand3.'" WHERE naam = "'.$username.'"';
  14. $result = mysql_query($query);
  15. $query = 'UPDATE Login SET crime4 = "'.$rand4.'" WHERE naam = "'.$username.'"';
  16. $result = mysql_query($query);
  17. $query = 'UPDATE Login SET crime5 = "'.$rand5.'" WHERE naam = "'.$username.'"';
  18. $result = mysql_query($query);
  19. }
  20. ?>

en dan zo door voor $crimes <= 5 enz enz.. tis veel werk maar wel eenvoudig
Offline Tuinstoel - 21/06/2005 14:33
Avatar van Tuinstoel PHP expert en het werkt voor geen meter, want dat lijkt me heel erg slecht. Verder voer je gewoon vijf volle query's uit

Misschien dat jij op z'n hoogst dus 2 leden online hebt, maar als je 200 leden online hebt, dan zijn dat alleen al 1000 query's per seconde (theoretisch hè ).
Offline nemesiskoen - 21/06/2005 14:37 (laatste wijziging 21/06/2005 14:37)
Avatar van nemesiskoen Gouden medaille

PHP expert
  1. $query = 'UPDATE Login SET crime1 = "'.$rand1.'" WHERE naam = "'.$username.'"';
  2. $result = mysql_query($query);
  3. $query = 'UPDATE Login SET crime2 = "'.$rand2.'" WHERE naam = "'.$username.'"';
  4. $result = mysql_query($query);
  5. $query = 'UPDATE Login SET crime3 = "'.$rand3.'" WHERE naam = "'.$username.'"';
  6. $result = mysql_query($query);
  7. $query = 'UPDATE Login SET crime4 = "'.$rand4.'" WHERE naam = "'.$username.'"';
  8. $result = mysql_query($query);
  9. $query = 'UPDATE Login SET crime5 = "'.$rand5.'" WHERE naam = "'.$username.'"';
  10. $result = mysql_query($query);

de komma is uitgevonden voor iets

  1. <?php
  2. $query = 'UPDATE Login SET crime1 = "'.$rand1.'", crime2 = "'. $rand2 .'", crime3 = "'. $rand3 .'", crime4 = "'. $rand4 .'", crime5 = "'. $rand5 .'", " WHERE naam = "'.$username.'"';
Offline Gerard - 21/06/2005 14:37
Avatar van Gerard Ouwe rakker gewoon even goed nadenken over een algoritme 
dit is inderdaad geen oplossing, tuinstoel heeft het helemaal bij het goede eind als hij zegt dat dit een ontzettende load op de server kan veroorzaken al gaat je game een keer helemaal goed lopen en krijg je enkele honderden mensen die aan het spelen zijn.
Offline Fenrir - 21/06/2005 17:15
Avatar van Fenrir PHP expert Ik snap niets van je script. Maar als je 5 keer ongeveer dezelfde code hebt, dan heb je wat fout gedaan.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.294s