寄娛於學第2天——大漠PHP之撲克牌21點之寫在編碼前

今天,嘗試一下用PHP來實現撲克牌的21點遊戲。

首先說說規則:

21點由1副或多副牌不等,2個以上的人玩:1個莊家+n個玩家。莊家給每個玩家發兩張明牌,牌面朝上面;給自己發兩張牌,一張牌面朝上(叫明牌),一張牌面朝下(叫暗牌);大家手中撲克點數的計算是:K、Q、J 和 10 牌都算作 10 點。A 牌既可算作1 點也可算作11 點,由玩家自己決定。其餘所有2 至9 牌均按其原面值計算。

這裏我們稍把規則簡單一點:牌不分花色;都是21點,平局;玩家大於21點,玩家輸;沒有暴點的情況下,誰點數大則贏。

PS:堅持有計劃的完成一件事真的很難,因爲忙,擱置了幾天了。

初步完成了發牌處理,思路還是很糟糕,先將就着上吧

 

 

  1. <?php 
  2.  
  3. /** 
  4.  * Description of Blackjack 
  5.  * 
  6.  * @author momosweb(AT)qq.com 
  7.  */ 
  8. class Blackjack { 
  9.  
  10.     /** 
  11.      * 21點由1副或多副牌不等,2個以上的人玩:1個莊家+n個玩家。莊家給每個玩家發兩張明牌, 
  12.      * 牌面朝上面;給自己發兩張牌,一張牌面朝上(叫明牌),一張牌面朝下(叫暗牌); 
  13.      * 大家手中撲克點數的計算是:K、Q、J 和 10 牌都算作 10 點。A 牌既可算作1 點也可算作11 點,由玩家自己決定。其餘所有2 至9 牌均按其原面值計算。 
  14.      * 這裏我們稍把規則簡單一點:都是21點,平局;玩家大於21點,玩家輸;沒有暴點的情況下,誰點數大則贏。 
  15.      *  
  16.      * 使用場景: 
  17.      * 開局每人發兩張牌,計算點數; 
  18.      * 如果發生要牌,每次發一張牌,重新計算點數; 
  19.      * 所有人停止要牌,公開牌局,亮出所有點數; 
  20.      *  
  21.      * 全程計算並顯示剩餘牌數; 
  22.      */ 
  23.     private $people = 2; 
  24.     private $number = 1; 
  25.     private $peoker = 'ABCDEFGHIJKLM'
  26.     private $peoker_key = array('A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8, 'I' => 9, 'J' => 10, 'K' => 10, 'L' => 10, 'M' => 10); 
  27.     private $peoker_str = ''
  28.  
  29.     /** 
  30.      * 設置牌的數量 
  31.      * @param intval $number 
  32.      */ 
  33.     public function set_number($number) { 
  34.      $number = intval($number); 
  35.      $this->number = $number ? $number : $this->number; 
  36.     } 
  37.  
  38.     /** 
  39.      * 初始化本局牌況 
  40.      */ 
  41.     private function inialize_peoker() { 
  42.      session_start(); 
  43.      if (is_null($_SESSION['peoker_number'])) { 
  44.          $peoker_now = str_repeat($this->peoker, $this->number * 4); //  加入牌的數量,一副牌有4個花色 
  45.          $_SESSION['peoker_content'] = str_shuffle($peoker_now);  // 進行洗牌 
  46.     } 
  47.     } 
  48.  
  49.     /** 
  50.      * 洗牌 
  51.      */ 
  52.     private function shuffle_peoker($peoker_str$str) { 
  53.      session_start(); 
  54.      unset($_SESSION['peoker_content']); 
  55.  
  56.      $peoker_new = ltrim($peoker_str$str);  // 把發過的牌從現有牌中清除 
  57.      $_SESSION['peoker_content'] = str_shuffle($peoker_new);  // 對剩餘牌進行隨機打亂 
  58.     } 
  59.  
  60.     /** 
  61.      * 記錄發牌次數 
  62.      */ 
  63.     private function record_peoker_num() { 
  64.     session_start(); 
  65.     intval($_SESSION['peoker_number']++); 
  66.     } 
  67.  
  68.     /** 
  69.      * 清空發牌次數 
  70.      */ 
  71.     private function remove_peoker_num() { 
  72.      unset($_SESSION['peoker_number']); 
  73.     } 
  74.  
  75.     /** 
  76.      * 發牌 
  77.      * @return array 
  78.      */ 
  79.     public function get_peoker() { 
  80.      $this->inialize_peoker(); 
  81.  
  82.      $this->record_peoker_num(); 
  83.      if ($_SESSION['peoker_number'] === 1) { 
  84.  
  85.          $arr_people = range(1, $this->people); 
  86.  
  87.          // 第一次發牌,每人發2張 
  88.          $fun = function () { 
  89.              $peoker_str = $_SESSION['peoker_content']; 
  90.              $str = substr($peoker_str, 0, 2); 
  91.              $this->shuffle_peoker($peoker_str$str); 
  92.              return $str
  93.             }; 
  94.  
  95.          $arr = array_map($fun$arr_people); 
  96.      } else { 
  97.  
  98.          $peoker_str = $_SESSION['peoker_content']; 
  99.          $arr[0] = substr($peoker_str, 0, 1); // 每次只發一張牌 
  100.          $this->shuffle_peoker($peoker_str$arr[0]); 
  101.      } 
  102.  
  103.      return $arr
  104.     } 
  105.  
  106.  
  107. $Game = new Blackjack(); 
  108. var_dump($Game->get_peoker()); 
  109. ?> 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章