今天,嘗試一下用PHP來實現撲克牌的21點遊戲。
首先說說規則:
21點由1副或多副牌不等,2個以上的人玩:1個莊家+n個玩家。莊家給每個玩家發兩張明牌,牌面朝上面;給自己發兩張牌,一張牌面朝上(叫明牌),一張牌面朝下(叫暗牌);大家手中撲克點數的計算是:K、Q、J 和 10 牌都算作 10 點。A 牌既可算作1 點也可算作11 點,由玩家自己決定。其餘所有2 至9 牌均按其原面值計算。
這裏我們稍把規則簡單一點:牌不分花色;都是21點,平局;玩家大於21點,玩家輸;沒有暴點的情況下,誰點數大則贏。
PS:堅持有計劃的完成一件事真的很難,因爲忙,擱置了幾天了。
初步完成了發牌處理,思路還是很糟糕,先將就着上吧
- <?php
- /**
- * Description of Blackjack
- *
- * @author momosweb(AT)qq.com
- */
- class Blackjack {
- /**
- * 21點由1副或多副牌不等,2個以上的人玩:1個莊家+n個玩家。莊家給每個玩家發兩張明牌,
- * 牌面朝上面;給自己發兩張牌,一張牌面朝上(叫明牌),一張牌面朝下(叫暗牌);
- * 大家手中撲克點數的計算是:K、Q、J 和 10 牌都算作 10 點。A 牌既可算作1 點也可算作11 點,由玩家自己決定。其餘所有2 至9 牌均按其原面值計算。
- * 這裏我們稍把規則簡單一點:都是21點,平局;玩家大於21點,玩家輸;沒有暴點的情況下,誰點數大則贏。
- *
- * 使用場景:
- * 開局每人發兩張牌,計算點數;
- * 如果發生要牌,每次發一張牌,重新計算點數;
- * 所有人停止要牌,公開牌局,亮出所有點數;
- *
- * 全程計算並顯示剩餘牌數;
- */
- private $people = 2;
- private $number = 1;
- private $peoker = 'ABCDEFGHIJKLM';
- 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);
- private $peoker_str = '';
- /**
- * 設置牌的數量
- * @param intval $number
- */
- public function set_number($number) {
- $number = intval($number);
- $this->number = $number ? $number : $this->number;
- }
- /**
- * 初始化本局牌況
- */
- private function inialize_peoker() {
- session_start();
- if (is_null($_SESSION['peoker_number'])) {
- $peoker_now = str_repeat($this->peoker, $this->number * 4); // 加入牌的數量,一副牌有4個花色
- $_SESSION['peoker_content'] = str_shuffle($peoker_now); // 進行洗牌
- }
- }
- /**
- * 洗牌
- */
- private function shuffle_peoker($peoker_str, $str) {
- session_start();
- unset($_SESSION['peoker_content']);
- $peoker_new = ltrim($peoker_str, $str); // 把發過的牌從現有牌中清除
- $_SESSION['peoker_content'] = str_shuffle($peoker_new); // 對剩餘牌進行隨機打亂
- }
- /**
- * 記錄發牌次數
- */
- private function record_peoker_num() {
- session_start();
- intval($_SESSION['peoker_number']++);
- }
- /**
- * 清空發牌次數
- */
- private function remove_peoker_num() {
- unset($_SESSION['peoker_number']);
- }
- /**
- * 發牌
- * @return array
- */
- public function get_peoker() {
- $this->inialize_peoker();
- $this->record_peoker_num();
- if ($_SESSION['peoker_number'] === 1) {
- $arr_people = range(1, $this->people);
- // 第一次發牌,每人發2張
- $fun = function () {
- $peoker_str = $_SESSION['peoker_content'];
- $str = substr($peoker_str, 0, 2);
- $this->shuffle_peoker($peoker_str, $str);
- return $str;
- };
- $arr = array_map($fun, $arr_people);
- } else {
- $peoker_str = $_SESSION['peoker_content'];
- $arr[0] = substr($peoker_str, 0, 1); // 每次只發一張牌
- $this->shuffle_peoker($peoker_str, $arr[0]);
- }
- return $arr;
- }
- }
- $Game = new Blackjack();
- var_dump($Game->get_peoker());
- ?>