woolyg Posted October 21, 2009 Share Posted October 21, 2009 Hi all, I'm writing part of a game engine that needs to define the outcome success (1 or 0) of a set of numbers that two teams are being compared on. I'm looking at making the last part of the process a bit more streamlined, and wonder if anyone can help me. Current Process is as follows: 1. Collate Numeric Score for each team defined by team attributes 2. Compare the two scores, and the likelihood of success for a team 3. Taking the score comparisons into consideration, randomly choose whether the play was a success or a fail (1 or 0) Here's the code: <?php // 1. Collate Numeric Score for each team defined by team attributes // .. I'll just show the results of this section here, and assume the values are set $team1_complete_total = "5367"; $team2_complete_total = "6192"; //2. Compare the two scores, and the likelihood of success for a team // First, add the two scores up $passage_magic_number = ($team1_complete_total + $team2_complete_total); // Define a Success Array $passage_success_or_fail_array = array(); //Assuming Team 1 is in possession, Place the likelihood of success or failure into the Success Array for($t1=1;$t1<=$team1_complete_total;){ array_push($passage_success_or_fail_array, 1); $t1++; } for($t2=1;$t2<=$team2_complete_total;){ array_push($passage_success_or_fail_array, 0); $t2++; } // NOW we have an array with heaps of 1's and 0's in it //Shuffle the array shuffle($passage_success_or_fail_array); //Pick a random array placement number out of the current array $passage_random_value = rand(1, $passage_magic_number); // Define the outcome (1 or 0) $action_outcome = $passage_success_or_fail_array[$passage_random_value]; // NOW we have a 1 or 0 to say whether the whole thing was a success or a fail. // Crowd goes wild ?> (..hopefully you're still with me) My main worry is memory usage - if the $team1_complete_total & the $team2_complete_total values are MASSIVE (say around 100000), then the script above is attempting to load the sum of the two values, in 1's and 0's, into an array, which could well smash the memory of the host server machine, and the script might fall over. Can anyone think of a better way to compare the two team totals, and compare them, and pop out a randomised outcome, using those weightings? The most important aspect of this script is that there is scope for both success AND failure (I don't want the team with more than 51% of the weight to always be successful, you know?) - as a play in a sports game can go both ways, no matter how good the teams are! All input appreciated, WoolyG Quote Link to comment https://forums.phpfreaks.com/topic/178536-solved-is-there-a-better-way-to-do-this/ Share on other sites More sharing options...
KevinM1 Posted October 21, 2009 Share Posted October 21, 2009 Instead of creating a huge array, why not deal with percentages? Sports logic dictates that the team in the lead has the advantage. This advantage increases the larger the score gets. So why not simply use the percentage of points (out of the total number) scored by the leading team to help determine success or failure? That should save you from needing to deal with huge arrays. A couple of syntax things I noticed: 1. Your scores are strings, not integers. They may not behave the way you want them to (I don't know if automatic conversion will take place if both operands are strings). 2. Your for-loop uses irregular syntax. It's normally: for($t1 = 1; $t1 <= $team1_complete_total; $t1++) { array_push($passage_success_or_fail_array, 1); } Quote Link to comment https://forums.phpfreaks.com/topic/178536-solved-is-there-a-better-way-to-do-this/#findComment-941591 Share on other sites More sharing options...
woolyg Posted October 21, 2009 Author Share Posted October 21, 2009 Hey Nightslyr, Thanks for the syntax fix - I'll go about correcting this in the code. Regarding the percentage idea, I did think of this, but my poor brain couldn't think of a way to do it, without placing it all into an array, and randomly picking the outcome from the array. The main aspect I'm trying to maintain is weighting - if team 1 has 60% possiblity of success, and a 40% possibility of failure, I need to have the script pick a 1 or a 0 based on these weightings. Is there a way to do this without loading up the memory as much as I have? This is probably the difference between the match engine taking 1 second to parse a match and 15 seconds to parse a match WoolyG Quote Link to comment https://forums.phpfreaks.com/topic/178536-solved-is-there-a-better-way-to-do-this/#findComment-941595 Share on other sites More sharing options...
KevinM1 Posted October 21, 2009 Share Posted October 21, 2009 Hey Nightslyr, Thanks for the syntax fix - I'll go about correcting this in the code. Regarding the percentage idea, I did think of this, but my poor brain couldn't think of a way to do it, without placing it all into an array, and randomly picking the outcome from the array. The main aspect I'm trying to maintain is weighting - if team 1 has 60% possiblity of success, and a 40% possibility of failure, I need to have the script pick a 1 or a 0 based on these weightings. Is there a way to do this without loading up the memory as much as I have? This is probably the difference between the match engine taking 1 second to parse a match and 15 seconds to parse a match WoolyG Why does it have to be either a 1 or 0? Why not if($successChance >= $target) { //success } else { //failure } Where $target is the finalized (meaning tweaked so that for large point differences it wouldn't be nearly impossible to fail) target percentage that would grant a success on the play? To me, the simplest thing to do would be to randomly pick a number between 1 and 100, and test it against the percentage derived from the current game's score. It keeps the random element of the play, and accurately follows the probability of success based on the score differential. Quote Link to comment https://forums.phpfreaks.com/topic/178536-solved-is-there-a-better-way-to-do-this/#findComment-941613 Share on other sites More sharing options...
woolyg Posted October 22, 2009 Author Share Posted October 22, 2009 Nightslyr, Brilliant. Exactly the type of lightweight solution I was after - I have a tendency to go about things totally the long way. Thanks so much for your input on this - WoolyG Quote Link to comment https://forums.phpfreaks.com/topic/178536-solved-is-there-a-better-way-to-do-this/#findComment-941627 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.