Created
January 19, 2014 19:08
-
-
Save YOUR1/8509498 to your computer and use it in GitHub Desktop.
PHP Dart score calculater
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* PHP Dartgame calculating class | |
* @author Youri van den Bogert | |
*/ | |
class Darts { | |
/** | |
* @var string | |
*/ | |
public static $notation_triple = 'T'; | |
/** | |
* @var string | |
*/ | |
public static $notation_double = 'D'; | |
/** | |
* @var int | |
*/ | |
private static $maxCheckout = 170; | |
/** | |
* @var string | |
*/ | |
private static $doubleBull = 'Bull'; | |
/** | |
* @var string | |
*/ | |
private static $singleBull = 'Single'; | |
/** | |
* @var array | |
*/ | |
private static $scoreSheet = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '25', '50'); | |
/** | |
* Get a total thrown score | |
* @param $score1 | |
* @param $score2 | |
* @param $score3 | |
* @return array | |
*/ | |
public static function getTotalScore ($score1, $score2, $score3) { | |
return array( | |
'dart1' => self::getScoreOfDart($score1), | |
'dart2' => self::getScoreOfDart($score2), | |
'dart3' => self::getScoreOfDart($score3), | |
'total' => self::getScoreOfDart($score1) + self::getScoreOfDart($score2) + self::getScoreOfDart($score3) | |
); | |
} | |
/** | |
* Get score of a single dart | |
* @param $score | |
* @return mixed | |
*/ | |
public static function getScoreOfDart ($score) { | |
if (is_numeric($score)) { | |
return $score; | |
} | |
if ($score[0] == self::$notation_triple) { | |
$multiplier = 3; | |
} elseif ($score[0] == self::$notation_double) { | |
$multiplier = 2; | |
} else { | |
$multiplier = 1; | |
} | |
$correctScore = filter_var($score, FILTER_SANITIZE_NUMBER_INT); | |
return ($correctScore * $multiplier); | |
} | |
public static function getScoreSheet () { | |
return self::$scoreSheet; | |
} | |
public static function calculatePossibleCheckout ($currentScore) { | |
// We cant checkout higher then $maxCheckout | |
if ($currentScore > self::$maxCheckout || $currentScore == 1) { | |
return false; | |
} | |
// Return bull | |
if ($currentScore == 50) { | |
return array( | |
'dart1' => self::$doubleBull | |
); | |
} | |
if ($currentScore == self::$maxCheckout) { | |
return array( | |
'dart1' => self::$notation_triple . '20', | |
'dart2' => self::$notation_triple . 'T20', | |
'dart3' => 'Bull' | |
); | |
} | |
$lastScore = $currentScore; | |
$lastPossibleThrow = 0; | |
$checkOut = array(); | |
// Can current score be checked out? | |
if (self::canScore($currentScore) == true) { | |
return array( | |
'dart1' => self::$notation_double . ($currentScore / 2) | |
); | |
// Current score can't be checked out - calculate what to throw | |
} else { | |
for ($x=60; $x >= 0; --$x) { | |
if ($x <= 20 || $x == 50 || $x == 25 || ($x % 3 == 0) || ($x <= 40 && ($x % 2 == 0))) { | |
for ($xx=60; $xx >= 0; --$xx) { | |
if ($x <= 20 || $x == 50 || $x == 25 || ($x % 3 == 0) || ($x <= 40 && ($x % 2 == 0))) { | |
for ($xxx=50; $xxx > 0; $xxx = $xxx - 2) { | |
if ($xxx == 48) { | |
$xxx = 40; | |
} | |
if (self::checkIfScoreExists($xxx) == true && self::checkIfScoreExists($xx) == true && self::checkIfScoreExists($x) == true && ($xxx + $xx + $x) == $currentScore) { | |
$score_1 = self::getCorrectDartName($xxx); | |
$score_2 = self::getCorrectDartName($xx); | |
$score_3 = self::getCorrectDartName($x, true); | |
if ($score_1[0] == 'D' || $score_2[0] == 'D' || $score_3[0] == 'D') { | |
$nextKey = (count($checkOut)+1); | |
if ($xxx != 0) $checkOut[$nextKey][] = $score_1; | |
if ($xx != 0) $checkOut[$nextKey][] = $score_2; | |
if ($x != 0) $checkOut[$nextKey][] = $score_3; | |
usort($checkOut[$nextKey], function($a, $b) { | |
if (is_int($a) || is_float($a)) { | |
if (is_int($b) || is_float($b)) { | |
return $a - $b; | |
} | |
else | |
return -1; | |
} | |
elseif (is_int($b) || is_float($b)) { | |
return 1; | |
} | |
else { | |
return strcmp($b, $a); | |
} | |
}); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
return array_unique($checkOut, SORT_REGULAR); | |
} | |
public static function getCorrectDartName ($total, $isLast = false) { | |
if ($total == 25 || $total == 50) { | |
return $total; | |
} | |
if ($total < 20 && $isLast == false) { | |
return $total; | |
} | |
if ($total %3 == 0) { | |
return self::$notation_triple . ($total/3); | |
} elseif ($total %2 == 0) { | |
return self::$notation_double . ($total/2); | |
} | |
return $total; | |
} | |
/** | |
* Check if score exists | |
* @param $score | |
* @return bool | |
*/ | |
public static function checkIfScoreExists ($score) { | |
if ($score == 50 || $score == 25 || $score == 0) return true; | |
$possibleScores = array_merge(range(1,20)); | |
foreach ($possibleScores as $posScore) { | |
if ($score == self::getScoreOfDart(self::$notation_double . $posScore) || $score == self::getScoreOfDart(self::$notation_triple . $posScore) || $score == $posScore) { | |
return true; | |
} | |
} | |
return false; | |
} | |
/** | |
* Check if a specific score can be thrown by one dart | |
* @param $score | |
* @return bool | |
*/ | |
public static function canScore ($score) { | |
if ($score == 50) { | |
return true; | |
} elseif ($score < 40 || $score == 40) { | |
if ($score % 2 == 0) { | |
return true; // Score is even - so its possible to throw | |
} else { | |
return false; | |
} | |
} | |
return false; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment