comments plus input validation
[anyfivecardpokerhand.git] / include / classes / anyfivecardpokerhand.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
 
/**
 * Any five card poker hand generator
 *
 * http://rip94550.wordpress.com/2011/03/14/poker-hands-%E2%80%93-5-card-draw/
 * http://en.wikipedia.org/wiki/List_of_poker_hands
 * http://en.wikipedia.org/wiki/Poker_probability
 *
 * @author      Razvan Stanga <git@razvi.ro>
 */
 
class Anyfivecardpokerhand {
        public static $types            = array ("hearts" , "diamonds" , "clubs" , "spades");
        public static $cards            = array ("ace" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" , "jack" , "queen" , "king");
        public static $hands            = array (
                0       =>      "nothing",
                1       =>      "one pair",
                2       =>      "two pair",
                3       =>      "flush",
                32      =>      "full house",
                4       =>      "four of a kind",
        );
        private $deckOfCards            = array ();
        private $debug                  = false;
        private $dbConnection           = null;
 
        function __construct () {
                if ( $_SERVER['HTTP_HOST'] && !isset ($_GET['override']) ) {
                        echo "This script should be run in cli. To override click <a href=\"generator.php?override=true\">here</a>.";
                        exit ();
                }
                $this->getDeckOfCards ();
        }
 
        /**
         * Generates a deck of cards
         *
         * @return array
         */
 
        private function generateDeckOfCards () {
                foreach (self::$cards as $card) {
                        foreach (self::$types as $type) {
                                $combo = $card.' '.$type;
                                array_push( $this->deckOfCards, $combo);
                    }
                }
                return $this->deckOfCards;
        }
 
        /**
         * Fetches the deck of cards
         *
         * @return array
         */
 
        public function getDeckOfCards () {
                if ( count($this->deckOfCards) == 0 ) {
                        return $this->generateDeckOfCards ();
                }
                return $this->deckOfCards;
        }
 
        /**
         * Generates all card combinations and inserts them in the database
         *
         * @param bool $debug shows card combinations total while generating
         * @return void
         */
 
        public function generateAnyFiveCardPokerHand ($debug=false) {
                $this->debug = $debug;
                $this->dbConnection = new dbConnection;
 
                $arr1 = $this->deckOfCards;
                $i = 0;
                foreach ( $arr1 as $k1 => $v1 ) {
                        $key = array_search($v1, $this->deckOfCards)+1;
                        $arr2 = array_slice($this->deckOfCards, $key);
 
                        foreach ( $arr2 as $k2 => $v2 ) {
                                $key = array_search($v2, $this->deckOfCards)+1;
                                $arr3 = array_slice($this->deckOfCards, $key);
 
                                foreach ( $arr3 as $k3 => $v3 ) {
                                        $key = array_search($v3, $this->deckOfCards)+1;
                                        $arr4 = array_slice($this->deckOfCards, $key);
 
                                        foreach ( $arr4 as $k4 => $v4 ) {
                                                $key = array_search($v4, $this->deckOfCards)+1;
                                                $arr5 = array_slice($this->deckOfCards, $key);
 
                                                foreach ( $arr5 as $k5 => $v5 ) {
                                                        $combo = array ();
                                                        array_push ($combo, $v1, $v2, $v3, $v4, $v5);
                                                        sort ($combo);
                                                        $hand = $this->getCardCombination ($combo);
                                                        $this->dbConnection->dbQuery ("INSERT INTO `cards` (`id`, `card1`, `card2`, `card3`, `card4`, `card5`, `combo`, `combohash`, `hand`) VALUES (NULL, '".$combo[0]."', '".$combo[1]."', '".$combo[2]."', '".$combo[3]."', '".$combo[4]."', '".implode (",", $combo)."', '".md5 ( implode ("", $combo) )."', '".$hand."')");
                                                        $i++;
                                                        if ( $this->debug ) {
                                                                echo "total card combinations : ".$i."\n";
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
 
        /**
         * Determines the card combinations like a pair, two pair, full house, flash, four of a kind
         *
         * @param array $combo five cards
         * @return int
         */
 
        public function getCardCombination ($combo) {
                $result = array ();
                foreach ( self::$cards as $card ) {
                        $r = array_filter($combo, function ($item) use ($card) {
                            if (stripos($item, $card) !== false) {
                                return true;
                            }
                            return false;
                        });
                        if ($r){
                                $result[] = $r;
                        }
                }
                if ( count ($result) == 5 ) { // nothing
                        return 0;
                } elseif ( count ($result) == 4 ) { // four of a kind
                        return 1;
                } elseif ( count ($result) == 3 ) {
                        if ( count ($result[0])>=3 || count ($result[1])>=3 || count ($result[2])>=3 ) { // flash
                                return 3;
                        } else { // two pairs
                                return 2;
                        }
                } elseif ( count ($result) == 2 ) {
                        if ( count ($result[0])==4 || count ($result[1])==4 ) { // four of a kind
                                return 4;
                        } elseif ( (count ($result[0])==2 || count ($result[1])==3) || (count ($result[0])==3 || count ($result[1])==2) ){ // full house
                                return 32;
                        } else {
                                return 10;
                        }
                }
        }
}
 
?>
comments