Negli ultimi anni il Poker, nella sua accezione del Texas Hold’em, è diventato il gioco più amato dagli italiani, scavalcato solo dalle scommesse, legalizzate da molto più tempo. Al momento, secondo l’istituto di ricerca Eurispes, quella del gioco d’azzardo è la terza industria del paese per volume d’affari. Il fenomeno è supportato da canali televisivi a tema e dal fenomeno del “divismo” dei giocatori più conosciuti che espongono sui loro capi di abbigliamento sponsor del poker on line.

Dal punto di vista più strettamente informatico sono interessanti alcuni progetti ospitati su code google con licenza GNU GPL che mettono a disposizione un framework e un logic engine per il il Texas Hold’em openholdembot,cspoker.

Nell’ipotesi di sviluppare un servizio RESTFull con Microsoft WCF che faccia da dealer e che possa servire come base per sviluppare un software sul poker ipotizziamo come possibile output un flusso JSON.
Creiamo una WCF Service Application chiamata PokerWcfService e cancelliamo il servizio creato di defaul per crearne uno nostro chiamato PokerService.svc. All’interfaccia IPokerService aggiungiamo un semplice metodo getCards che restituisce che prende in input il numero di giocatori

[OperationContract]
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "getCards/{playersNumber}")]
ResultGetCards getCards(string playersNumber);

Per implementare questo metono ho creato una classe ResultGetCards la quale al suo interno contiente una lista di oggetti di tipo PlayerHand e un oggetto ShowDown.

    /// <summary>
    /// Player hand, two cards
    /// </summary>
    public class PlayerHand
    {
        private string _firstCard;
 
        public string firstCard
        {
            get { return _firstCard; }
            set { _firstCard = value; }
        }
 
        private string _secondCard;
 
        public string secondCard
        {
            get { return _secondCard; }
            set { _secondCard = value; }
        }
    }
 
    /// <summary>
    /// ShowDown Flop
    /// </summary>
    public class ShowDown
    {
        private string _firstCardFlop;
 
        public string firstCardFlop
        {
            get { return _firstCardFlop; }
            set { _firstCardFlop = value; }
        }
 
        private string _secondCardFlop;
 
        public string secondCardFlop
        {
            get { return _secondCardFlop; }
            set { _secondCardFlop = value; }
        }
 
        private string _thirdCardFlop;
 
        public string thirdCardFlop
        {
            get { return _thirdCardFlop; }
            set { _thirdCardFlop = value; }
        }
 
        private string _turn;
 
        public string turn
        {
            get { return _turn; }
            set { _turn = value; }
        }
 
        private string _river;
 
        public string river
        {
            get { return _river; }
            set { _river = value; }
        }
    }


La classe ResultGetCards risulterebbe quindi strutturata in questo modo:

    /// <summary>
    /// getCards Output 
    /// </summary>
    public class ResultGetCards
    {
        private ShowDown _showDown;
 
        public ShowDown showDown
        {
            get { return _showDown; }
            set { _showDown = value; }
        }
 
        private List<PlayerHand> _playerHands;
 
        public List<PlayerHand> playerHands
        {
            get { return _playerHands; }
            set { _playerHands = value; }
        }
    }

Questa è la struttura dei files

Una volta creato il servizio, definito il model e strutturata la soluzione non resta che implementare il metodo getCards.

La tecnica utilizzata è quella di recuperare dall’array di stringhe card i valori per popolare il result composto dallo showdown e dalle playerCards senza ripetere mai gli stessi valori e in maniere casuale. Questo è possibile recuperando il numero necessario di valori, in base al numero di giocatori in input, dall’array che viene ogni volta ordinato in maniera casuale.
L’output finale sarà del tipo:

{"playerHands":[{"firstCard":"6H","secondCard":"QC"},{"firstCard":"1H","secondCard":"4S"},{"firstCard":"3H","secondCard":"8H"},{"firstCard":"6D","secondCard":"JC"},{"firstCard":"QH","secondCard":"3D"},{"firstCard":"2D","secondCard":"9C"},{"firstCard":"KD","secondCard":"10D"},{"firstCard":"6S","secondCard":"8D"}],"showDown":{"firstCardFlop":"5C","river":"9D","secondCardFlop":"JD","thirdCardFlop":"1S","turn":"1D"}}

Se i miei post ti sono stati di aiuto o ti sono sembrati intressanti puoi offrirmi un caffè :)