NiuNiu.class.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. require_once dirname(__FILE__) . '/Poker.class.php';
  3. /**
  4. * Created by PhpStorm.
  5. * User: L
  6. * Date: 2016/12/14
  7. * Time: 09:49
  8. */
  9. class NiuNiu extends Poker
  10. {
  11. /**
  12. * [$figures description]
  13. * @var array
  14. */
  15. protected $figures = array(
  16. 'A' => 1,
  17. '2' => 2,
  18. '3' => 3,
  19. '4' => 4,
  20. '5' => 5,
  21. '6' => 6,
  22. '7' => 7,
  23. '8' => 8,
  24. '9' => 9,
  25. '10' => 10,
  26. 'J' => 11,
  27. 'Q' => 12,
  28. 'K' => 13,
  29. );
  30. /**
  31. * @var array
  32. */
  33. protected $type = array(
  34. 'wx' => 0,
  35. 'zd' => 1,
  36. 'wh' => 2,
  37. 'sh' => 3,
  38. 'nn' => 4,
  39. 'n9' => 5,
  40. 'n8' => 6,
  41. 'n7' => 7,
  42. 'n6' => 8,
  43. 'n5' => 9,
  44. 'n4' => 10,
  45. 'n3' => 11,
  46. 'n2' => 12,
  47. 'n1' => 13,
  48. 'mn' => 14,
  49. );
  50. public function checkCards($cards)
  51. {
  52. // 冒泡排序
  53. $max = sizeof($cards) - 1;
  54. for ($j = 0; $j < $max; $j++) {
  55. for ($i = 0; $i < $max - $j; $i++) {
  56. if ($this->figures[$cards[$i][1]] < $this->figures[$cards[$i + 1][1]]) {
  57. $card = $cards[$i];
  58. $cards[$i] = $cards[$i + 1];
  59. $cards[$i + 1] = $card;
  60. }
  61. }
  62. }
  63. $h = 0;
  64. $yn = false;
  65. $figures = array();
  66. $colors = array();
  67. $figures_flag = array();
  68. $figures_count = array();
  69. foreach ($cards as $key => $card) {
  70. $figure = $this->figures[$card[1]];
  71. if (isset($figures_count[$figure])) {
  72. $figures_count[$figure]++;
  73. } else {
  74. $figures_count[$figure] = 1;
  75. }
  76. if ($figure > 10) {
  77. $h++;
  78. $figures_flag[] = 10;
  79. } else {
  80. $figures_flag[] = $figure;
  81. }
  82. $figures[$key] = $figure;
  83. $colors[$key] = $this->colors[$card[0]];
  84. }
  85. $res = array_sum($figures_flag) % 10;
  86. $yn = false;
  87. $data = self::combination($figures_flag, 3);
  88. foreach ($data as $value) {
  89. if (array_sum($value) % 10 == 0) {
  90. $yn = true;
  91. break;
  92. }
  93. }
  94. $wh = $h == 5;
  95. $sh = !$res && $h == 4;
  96. $wx = array_sum($figures) < 10;
  97. $zd = false;
  98. if (sizeof($figures_count) < 3) {
  99. foreach ($figures_count as $value) {
  100. if ($value == 4) {
  101. $zd = true;
  102. break;
  103. }
  104. }
  105. }
  106. // 牌型
  107. $type = 'mn';
  108. foreach ($this->type as $key => $value) {
  109. if (isset($$key) && $$key) {
  110. $type = $key;
  111. }
  112. }
  113. if ($yn && $type == 'mn') {
  114. if (!$res) {
  115. $type = 'nn';
  116. } else {
  117. $type = 'n' . $res;
  118. }
  119. }
  120. $type = $this->type[$type];
  121. return compact('type', 'figures', 'colors');
  122. }
  123. /**
  124. * 牌组大小
  125. * @param $player1
  126. * @param $player2
  127. * @return bool
  128. */
  129. public function compare($player1, $player2)
  130. {
  131. $type1 = $player1['check']['type'];
  132. $type2 = $player2['check']['type'];
  133. if ($type1 != $type2) {
  134. return $type1 < $type2;
  135. }
  136. $figure1 = $player1['check']['figures'];
  137. $figure2 = $player2['check']['figures'];
  138. $color1 = $player1['check']['colors'];
  139. $color2 = $player2['check']['colors'];
  140. if ($figure1[0] == $figure2[0]) {
  141. return $color1[0] < $color2[0];
  142. } else {
  143. return $figure1[0] > $figure2[0];
  144. }
  145. }
  146. public function play($number = 3)
  147. {
  148. if ($number < 2 || $number > 10) {
  149. $number = 2;
  150. }
  151. $this->shuffleCards();
  152. $players = array();
  153. for ($i = 0; $i < $number; $i++) {
  154. $cards = $this->pickCards(5);
  155. $players[] = array(
  156. 'cards' => $cards,
  157. 'check' => $this->checkCards($cards),
  158. );
  159. }
  160. return $this->order($players);
  161. }
  162. }