<?php
namespace App\Games;
use App\Constants\Status;
class AndarBahar extends Game
{
protected $alias = 'andar_bahar';
protected $extraValidationRule = [
'choose' => 'required|in:andar,bahar'
];
protected function deck()
{
$suits = ['H', 'D', 'C', 'S'];
$ranks = range(2, 10);
$faceCards = ['J', 'Q', 'K', 'A'];
$deck = [];
foreach ($suits as $suit) {
foreach ($ranks as $rank) {
$deck[] = "{$rank}-{$suit}";
}
foreach ($faceCards as $face) {
$deck[] = "{$face}-{$suit}";
}
}
return $deck;
}
protected function winLoss()
{
$probableWin = $this->demoPlay
? $this->game->probable_win_demo
: $this->game->probable_win;
$random = mt_rand(0, 100);
if ($random <= $probableWin) {
$winLossData['win_status'] = Status::WIN;
$winLossData['result'] = $this->request->choose;
} else {
$winLossData['win_status'] = Status::LOSS;
$winLossData['result'] = $this->request->choose == 'andar' ? 'bahar' : 'andar';
}
return $winLossData;
}
protected function sendTempResultCard($card, $deck, $randomCard)
{
if ($card[0] != $randomCard[0]) {
return $card;
}
return $this->sendTempResultCard(array_pop($deck), $deck, $randomCard);
}
protected function gameResult()
{
$deck = $this->deck();
shuffle($deck);
$randomCard = array_pop($deck);
$andarCards = [];
$baharCards = [];
$turn = 'andar';
$winLossData = $this->winLoss();
$maxIterations = 50;
$iteration = 0;
while (!empty($deck) && $iteration < $maxIterations) {
$iteration++;
$drawnCard = array_pop($deck);
if ($turn === 'andar') {
$andarCards[] = $drawnCard;
if ($drawnCard[0] == $randomCard[0]) {
if ($winLossData['win_status'] == Status::WIN && $this->request->choose == 'andar') {
break;
} else {
if ($this->request->choose == 'bahar' && $winLossData['win_status'] == Status::LOSS) {
break;
} else {
$tempResultCard = array_pop($andarCards);
$newCard = $this->sendTempResultCard(array_pop($deck), $deck, $randomCard);
if ($newCard !== null) {
$andarCards[] = $newCard;
$deck[] = $tempResultCard;
}
}
}
}
$turn = 'bahar';
} else {
$baharCards[] = $drawnCard;
if ($drawnCard[0] == $randomCard[0]) {
if ($winLossData['win_status'] == Status::WIN && $this->request->choose == 'bahar') {
break;
} else {
if ($this->request->choose == 'andar' && $winLossData['win_status'] == Status::LOSS) {
break;
} else {
$tempResultCard = array_pop($baharCards);
$newCard = $this->sendTempResultCard(array_pop($deck), $deck, $randomCard);
if ($newCard !== null) {
$baharCards[] = $newCard;
$deck[] = $tempResultCard;
}
}
}
}
$turn = 'andar';
}
}
$this->extraResponseOnStart = array_merge($this->extraResponseOnStart, [
'randomCard' => $randomCard,
'andarCards' => $andarCards,
'baharCards' => $baharCards
]);
return $winLossData;
}
}