Poker.class.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. <?php
  2. class Poker
  3. {
  4. /**
  5. * @var array
  6. */
  7. protected $colors = array(
  8. 'spade' => 0,
  9. 'heart' => 1,
  10. 'club' => 2,
  11. 'diamond' => 3,
  12. );
  13. /**
  14. * @var array
  15. */
  16. protected $figures = array(
  17. '2' => 0,
  18. '3' => 1,
  19. '4' => 2,
  20. '5' => 3,
  21. '6' => 4,
  22. '7' => 5,
  23. '8' => 6,
  24. '9' => 7,
  25. '10' => 8,
  26. 'J' => 9,
  27. 'Q' => 10,
  28. 'K' => 11,
  29. 'A' => 12,
  30. );
  31. /**
  32. * @var array
  33. */
  34. protected $type = array(
  35. 'bz' => 0,
  36. 'ths' => 1,
  37. 'th' => 2,
  38. 'sz' => 3,
  39. 'dz' => 4,
  40. 'dp' => 5,
  41. );
  42. /**
  43. * @var array
  44. */
  45. protected $cards;
  46. public function shuffleCards()
  47. {
  48. $cards = array();
  49. foreach ($this->colors as $color => $value) {
  50. foreach ($this->figures as $figure => $value2) {
  51. $cards[] = array($color, $figure);
  52. }
  53. }
  54. shuffle($cards);
  55. $this->cards = $cards;
  56. }
  57. /**
  58. * 判断牌的种类
  59. * @param $cards
  60. * @return array
  61. */
  62. public function checkCards($cards)
  63. {
  64. // 冒泡排序
  65. $max = sizeof($cards) - 1;
  66. for ($j = 0; $j < $max; $j++) {
  67. for ($i = 0; $i < $max - $j; $i++) {
  68. if ($this->figures[$cards[$i][1]] < $this->figures[$cards[$i + 1][1]]) {
  69. $card = $cards[$i];
  70. $cards[$i] = $cards[$i + 1];
  71. $cards[$i + 1] = $card;
  72. }
  73. }
  74. }
  75. $bz = true;
  76. $th = true;
  77. $sz = true;
  78. $dz = false;
  79. $color_flag = '';
  80. $figure_flag = 0;
  81. $figures = array();
  82. $colors = array();
  83. foreach ($cards as $key => $card) {
  84. $figures[$key] = $figure = $this->figures[$card[1]];
  85. $colors[$key] = $color = $this->colors[$card[0]];
  86. if ($key) {
  87. // 同花
  88. if ($color != $color_flag) {
  89. $th = false;
  90. }
  91. // 豹子
  92. if ($figure != $figure_flag) {
  93. $bz = false;
  94. }
  95. // 对子
  96. if ($figure == $figure_flag) {
  97. $dz = true;
  98. }
  99. // 顺子
  100. if ($figures[$key - 1] - 1 != $figure) {
  101. $sz = false;
  102. }
  103. }
  104. $color_flag = $color;
  105. $figure_flag = $figure;
  106. }
  107. // 顺子
  108. if ($figures == array(12, 1, 0)) {
  109. $figures = array(1, 0, -1);
  110. $sz = true;
  111. }
  112. // 对子
  113. $dz = $dz && !$bz;
  114. // 同花顺
  115. $ths = $th && $sz;
  116. // 牌型
  117. // $type = 'dp';
  118. $type = 5;
  119. foreach ($this->type as $key => $value) {
  120. if (isset($$key) && $$key) {
  121. $type = $this->type[$key];
  122. break;
  123. }
  124. }
  125. return compact('type', 'figures', 'colors');
  126. }
  127. /**
  128. * @return array|bool
  129. */
  130. public function pickCards($number = 3)
  131. {
  132. if (empty($this->cards)) {
  133. $this->shuffleCards();
  134. }
  135. if (sizeof($this->cards) < $number) {
  136. return false;
  137. }
  138. $cards = array();
  139. for ($i = 0; $i < $number; $i++) {
  140. $cards[] = array_shift($this->cards);
  141. }
  142. return $cards;
  143. }
  144. /**
  145. * 牌组大小
  146. * @param $player1
  147. * @param $player2
  148. * @return bool
  149. */
  150. public function compare($player1, $player2)
  151. {
  152. $type1 = $player1['check']['type'];
  153. $type2 = $player2['check']['type'];
  154. if ($type1 != $type2) {
  155. return $type1 < $type2;
  156. }
  157. $figure1 = $player1['check']['figures'];
  158. $figure2 = $player2['check']['figures'];
  159. $color1 = $player1['check']['colors'];
  160. $color2 = $player2['check']['colors'];
  161. switch ($type1) {
  162. case 0:
  163. return $figure1[0] > $figure2[0];
  164. break;
  165. case 1:
  166. case 3:
  167. if ($figure1 == $figure2) {
  168. return $color1[0] < $color2[0];
  169. } else {
  170. return $figure1[0] > $figure2[0];
  171. }
  172. break;
  173. case 4:
  174. $dui1 = $figure1[1];
  175. $dui2 = $figure2[1];
  176. if ($dui1 != $dui2) {
  177. return $dui1 > $dui2;
  178. }
  179. $dui1 = array_sum($figure1) - $dui1;
  180. $dui2 = array_sum($figure2) - $dui2;
  181. if ($dui1 == $dui2) {
  182. $i1 = $figure1[0] == $dui1 ? 2 : 0;
  183. $i2 = $figure2[0] == $dui2 ? 2 : 0;
  184. return $color1[$i1] < $color2[$i2];
  185. } else {
  186. return $dui1 > $dui2;
  187. }
  188. break;
  189. case 2:
  190. default:
  191. foreach ($figure1 as $key => $value) {
  192. if ($value != $figure2[$key]) {
  193. return $value > $figure2[$key];
  194. }
  195. }
  196. return $color1[0] < $color2[0];
  197. break;
  198. }
  199. }
  200. public function play($number = 3)
  201. {
  202. if ($number < 2 || $number > 17) {
  203. $number = 2;
  204. }
  205. $this->shuffleCards();
  206. $players = array();
  207. for ($i = 0; $i < $number; $i++) {
  208. $cards = $this->pickCards();
  209. $players[] = array(
  210. 'cards' => $cards,
  211. 'check' => $this->checkCards($cards),
  212. );
  213. }
  214. return $this->order($players);
  215. }
  216. public function order($players)
  217. {
  218. $max = sizeof($players) - 1;
  219. for ($j = 0; $j < $max; $j++) {
  220. for ($i = 0; $i < $max - $j; $i++) {
  221. if ($this->compare($players[$i + 1], $players[$i])) {
  222. $player = $players[$i];
  223. $players[$i] = $players[$i + 1];
  224. $players[$i + 1] = $player;
  225. }
  226. }
  227. }
  228. return $players;
  229. }
  230. protected static function combination($array, $number)
  231. {
  232. $r = array();
  233. $n = count($array);
  234. if ($number <= 0 || $number > $n) {
  235. return $r;
  236. }
  237. for ($i = 0; $i < $n; $i++) {
  238. $t = array($array[$i]);
  239. if ($number == 1) {
  240. $r[] = $t;
  241. } else {
  242. $b = array_slice($array, $i + 1);
  243. $c = self::combination($b, $number - 1);
  244. foreach ($c as $v) {
  245. $r[] = array_merge($t, $v);
  246. }
  247. }
  248. }
  249. return $r;
  250. }
  251. }