Exemple #1
0
 /**
  * Get the response based on previous player responses
  * @param ResponseEnum $partnerPreviousResponse
  * @param ResponseEnum $playerPreviousResponse
  * @return $this|ResponseEnum
  */
 public function getResponse(ResponseEnum $partnerPreviousResponse = null, ResponseEnum $playerPreviousResponse = null)
 {
     // if there was not a previous response, default to cooperation
     if (null === $partnerPreviousResponse) {
         return ResponseEnum::create(ResponseEnum::COOPERATE);
     }
     // if both players cooperated, cooperate
     if ($partnerPreviousResponse->cooperated() && $playerPreviousResponse->cooperated()) {
         return ResponseEnum::create(ResponseEnum::COOPERATE);
     }
     // if I exploited opponent, cooperate
     if ($partnerPreviousResponse->cooperated() && $playerPreviousResponse->confessed()) {
         return ResponseEnum::create(ResponseEnum::COOPERATE);
     }
     // if opponent exploited me, small change to cooperate
     if ($partnerPreviousResponse->confessed() && $playerPreviousResponse->cooperated()) {
         return $this->getResponseByChanceToCooperate(function ($coefficient) {
             return ($coefficient - 1) / (3 * $coefficient + 2);
         });
     }
     // if both players confessed, small chance to cooperate
     return $this->getResponseByChanceToCooperate(function ($coefficient) {
         return 2 * ($coefficient - 1) / (3 * $coefficient + 2);
     });
 }