Socket/app/services/scan/ScanBaccaratService.php
2026-01-28 23:48:20 +08:00

172 lines
8.8 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\services\scan;
use freedom\utils\CardPosition;
use freedom\utils\RedisUtil;
/**
* TODO Baccarat扫描
* Class ScanBaccaratService
* @package app\services\scan
*/
class ScanBaccaratService
{
/**
* TODO Baccarat扫描处理
* @param array $event
* @param array $tableInfo
* @return array
*/
public static function doScanBaccarat(array $event, array $tableInfo): array{
$checkScanRes = ScanCommonService::checkScan($event,$tableInfo);
if ($checkScanRes['status'] == false){
return $checkScanRes;
}else{
$numberTabInfo = $checkScanRes['numberTabInfo'];
$cardInfo = $checkScanRes['cardInfo'];
}
if (!isset($event['card']) || !isset($event['position'])) return ['status' => false, 'msg' => 'CardPosition Unable Distinguish'];
$card = CardPosition::interchangeCard($event['card']);
if (!$card) return ['status' => false, 'msg' => 'CardPosition Unable Distinguish'];
$position = CardPosition::interchangePosition($event['position']);
if (!$position) return ['status' => false, 'msg' => 'Position Error'];
if (isset($cardInfo[$position]) && $cardInfo[$position] > 0 && $cardInfo[$position] != $event['card']) {
if (!(isset($event['change']) && $event['change'] == 1)) {
return ['status' => false, 'msg' => 'Already Exists'];
}
}
//判断接受牌的先后顺序
if($event['position'] == 11 || $event['position'] == 12 || $event['position'] == 21 || $event['position'] == 22){
$returnPosition = intval($event['position']);
$cardInfo[$position] = intval($event['card']);
$res = RedisUtil::saveCardPosition($numberTabInfo['id'],$returnPosition,intval($event['card']));
if (!$res) return ['status' => false, 'msg' => 'Redis Cache Save Error'];
}else if($event['position'] == 13){
$change = (isset($event['change']) && $event['change'] == 1)? 1 : 0;
$returnData = self::baccaratReplenish($cardInfo,$event['position'], $change);
if($returnData['status'] == true){
if($returnData['position'] == 'banker_3'){
$returnPosition = 23;
}else{
$returnPosition = 13;
}
$cardInfo[$returnData['position']] = intval($event['card']);
$res = RedisUtil::saveCardPosition($numberTabInfo['id'],$returnPosition,intval($event['card']));
if (!$res) return ['status' => false, 'msg' => 'Redis Cache Save Error'];
}else{
return ['status' => false, 'msg' => $returnData['msg']];
}
}else if($event['position'] == 23){
$returnPosition = 23;
if(isset($cardInfo['player_3']) && $cardInfo['player_3'] > 0){
$change = (isset($event['change']) && $event['change'] == 1)? 1 : 0;
$returnData = self::baccaratReplenish($cardInfo,$event['position'], $change);
if($returnData['status'] == true){
$cardInfo[$returnData['position']] = intval($event['card']);
$res = RedisUtil::saveCardPosition($numberTabInfo['id'],$returnPosition,intval($event['card']));
if (!$res) return ['status' => false, 'msg' => 'Redis Cache Save Error'];
}else{
return ['status' => false, 'msg' => $returnData['msg']];
}
}else{
return ['status' => false, 'msg' => 'player3_is_not_cannot_scan_banker3'];
}
}else{
return ['status' => false, 'msg' => 'position_error'];
}
$round = array(
'tid' => intval($tableInfo['id']),
'number_tab_id' => $numberTabInfo['id'],
'card' => intval($event['card']),
'number' => intval($card),
'position' => $returnPosition,
'boot_id' => intval($numberTabInfo['boot_id']),
'boot_num' => intval($numberTabInfo['boot_num']),
'number_tab_number' => intval($numberTabInfo['number']),
'card_info' => $cardInfo
);
if ($numberTabInfo['bet_status'] == 2) {
$round['is_scan'] = true;
} else {
$round['is_scan'] = false;
}
return ['status' => true, 'data' => $round];
}
/**
* TODO Baccarat开牌条件计算方法
* @param array $cardInfo
* @param int $position
* @return array
*/
public static function baccaratReplenish(array $cardInfo, int $position, int $change = 0): array
{
if (!isset($cardInfo['banker_1']) || !isset($cardInfo['banker_2']) || !isset($cardInfo['player_1']) || !isset($cardInfo['player_2'])){
return array('status' => false, 'msg' => 'player_banker_not_full');
}
if($cardInfo['banker_1'] > 0 && $cardInfo['banker_2'] > 0 && $cardInfo['player_1'] > 0 && $cardInfo['player_2'] > 0){
$player_count = (CardPosition::interchangeNumber(CardPosition::interchangeCard($cardInfo['player_1'])) + CardPosition::interchangeNumber(CardPosition::interchangeCard($cardInfo['player_2']))) % 10;
$banker_count = (CardPosition::interchangeNumber(CardPosition::interchangeCard($cardInfo['banker_1'])) + CardPosition::interchangeNumber(CardPosition::interchangeCard($cardInfo['banker_2']))) % 10;
if($position == 13){
if(isset($cardInfo['player_3']) && $cardInfo['player_3'] > 0 && $change != 1){
//第1张增牌已经存在不允许更改
return array('status' => false, 'msg' => 'fail_already_exists');
}
if($player_count == 8 || $player_count == 9){
//闲家8,9点不允许增牌
return array('status' => false, 'msg' => 'fail_player_8_9');
}
if($banker_count == 8 || $banker_count == 9){
//庄家8,9点不允许增牌
return array('status' => false, 'msg' => 'fail_banker_8_9');
}
if($player_count == 6 || $player_count == 7){
return self::baccaratReplenish($cardInfo,23);
}
return array('status' => true, 'position' => 'player_3', 'msg' => 'Success');
}else if($position == 23){
if(isset($cardInfo['banker_3']) && $cardInfo['banker_3'] > 0 && $change != 1){
//第2张增牌已经存在不允许更改
return array('status' => false, 'msg' => 'fail_already_exists');
}
if($player_count == 8 || $player_count == 9){
//闲家8,9点不允许增牌
return array('status' => false, 'msg' => 'fail_player_8_9');
}
if($banker_count == 8 || $banker_count == 9){
//庄家8,9点不允许增牌
return array('status' => false, 'msg' => 'fail_banker_8_9');
}
if(isset($cardInfo['player_3']) && $cardInfo['player_3'] > 0){
//闲已经补牌
$player_3_count = (CardPosition::interchangeNumber(CardPosition::interchangeCard($cardInfo['player_3']))) % 10;
if($banker_count < 3 || ($banker_count == 3 && in_array($player_3_count,array(1,2,3,4,5,6,7,9,0))) || ($banker_count == 4 && in_array($player_3_count,array(2,3,4,5,6,7))) || ($banker_count == 5 && in_array($player_3_count,array(4,5,6,7))) || ($banker_count == 6 && in_array($player_3_count,array(6,7)))){
return array('status' => true, 'position' => 'banker_3', 'msg' => 'Success');
}else{
//庄家不符合补牌条件,不接受补牌数据
return array('status' => false, 'msg' => 'banker_lby_lfx');
}
}else{
//闲不需要补牌
if($banker_count < 6){
return array('status' => true, 'position' => 'banker_3', 'msg' => 'Success');
}else{
//闲家不补牌,庄家点数>=6点不接受补牌数据
return array('status' => false, 'msg' => 'player3_is_not_banker_num_egt_6');
}
}
}else{
//定位错误
return array('status' => false, 'msg' => 'position_error');
}
}else{
//前面牌数据未全,不接受补牌数据
return array('status' => false, 'msg' => 'player_banker_not_full');
}
}
}