jueves, 22 de septiembre de 2016

JUEGO DE POKER C# Propósito: Esta aplicación funcionará similar a un juego de póquer. El programa tratará a cabo 2 mano de cinco cartas y determinar qué contiene cada mano. FUNCIONES El programa creará una baraja de 52 cartas. Será entonces barajar "trato" 5 cartas para el Jugador uno y el jugador Dos. El programa evaluará lo que tiene cada mano y mostrar las tarjetas gráficamente por consola, así como la impresión del valor de las manos. Acont ALGORITMO Y PRECEDIMIENTO:
 namespace JUEGOPOKER
{
    class Program
    {
        static void Main(string[] args)
        {
 Console.SetWindowSize(65, 40);
 Console.BufferWidth = 65;
 Console.BufferHeight = 40;            
 Console.Title = "juego de Poker";
 RepartirCarta dc = new RepartirCarta();
 bool quit = false;

  while (!quit)
  {
 dc.Deal();

   char seleccion = ' ';
  while (!seleccion.Equals('S') && !seleccion.Equals('N'))
   {
    Console.WriteLine("                      JUGAR DE NUEVO? SI-NO");
   seleccion = Convert.ToChar(Console.ReadLine().ToUpper());

if (seleccion.Equals('S'))
  quit = false;
  else if (seleccion.Equals('N'))
  quit = true;
   else
    Console.WriteLine("Seleccion invalida. Inténtalo de nuevo");
    }
    }
     Console.ReadKey();
    }
    }
    }

CLASE BARAJA HEREDADA DE LA CLASE CARTA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JUEGOPOKER
{
    class Baraja : Carta
    {
        const int NumCarta = 52; 
        private Carta[] deck; 

        public Baraja()
        {
            deck = new Carta[NumCarta];
        }

        public Carta[] getDeck { get { return deck; } } 
        public void setUpDeck()
        {
            int i = 0;
            foreach(SUIT s in Enum.GetValues(typeof(SUIT)))
            {
                foreach(VALUE v in Enum.GetValues(typeof(VALUE)))
                {
                    deck[i] = new Carta { MySuit = s, MyValue = v };
                    i++;
                }
            }

            ShuffleCards();
        }

      
        public void ShuffleCards()
        {
            Random rand = new Random();
            Carta temp;

           
            for (int shuffleTimes = 0; shuffleTimes < 1000; shuffleTimes++)
            {
                for (int i = 0; i < NumCarta; i++)
                {
                    
                    int secondCardIndex = rand.Next(13);
                    temp = deck[i];
                    deck[i] = deck[secondCardIndex];
                    deck[secondCardIndex] = temp;
                }
            }
        }
    }
}

CLASE CARTA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JUEGOPOKER
{
    class Carta
    {
        public enum SUIT
        {
            CORAZON,
            PICA,
            DIAMANTE,
            TREBOL
        }

        public enum VALUE
        {
            DOS = 2, TRES, CUATRO, CINCO, SEIS, SIETE,
            OCHO,NUEVE, DIEZ, J, Q, K, A
        }
        
        //properties
        public SUIT MySuit { get; set; }
        public VALUE MyValue { get; set; }
    }
}
CLASE EVALUADOR DE MANO Se creo este métodos para comparar y determinar lo el jugar uno y el jugador dos espera. Utilizamos matrices para realizar comparaciones de las cartas.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JUEGOPOKER
{
    public enum Mano
    {
        NADA,
        PAR,
        DOSPARES,
        TRIO,
        ESCALERA,
        COLOR,
        FULLHOUSE,
        POQUER
    }

    public struct ValorMano
    {
        public int Total { get; set; }
        public int HighCard { get; set; }
    }

    class EvaluarMano : Carta
    {
        private int corazonSum;
        private int diamanteSum;
        private int trebolSum;
        private int PicaSum;
        private Carta[] cartas;
        private ValorMano valormano;

        public EvaluarMano(Carta[] sortedHand)
        {
            corazonSum = 0;
            diamanteSum = 0;
            trebolSum = 0;
            PicaSum = 0;
            cartas = new Carta[5];
            Cards = sortedHand;
            valormano = new ValorMano();
        }

        public ValorMano HandValues
        {
            get { return valormano; }
            set { valormano = value; }
        }

        public Carta [] Cards
        {
            get { return cartas; }
            set
            {
                cartas[0] = value[0];
                cartas[1] = value[1];
                cartas[2] = value[2];
                cartas[3] = value[3];
                cartas[4] = value[4];
            }
        }

        public Mano EvaluateHand()
        {
            
            getNumberOfSuit();
            if (POQUER())
                return Mano.POQUER;
            else if (FULLHOUSE())
                return Mano.FULLHOUSE;
            else if (COLOR())
                return Mano.COLOR;
            else if (ESCALERA())
                return Mano.ESCALERA;
            else if (TRIO())
                return Mano.TRIO;
            else if (DOSPARES())
                return Mano.DOSPARES;
            else if (PAR())
                return Mano.PAR;
            
            valormano.HighCard = (int)cartas[4].MyValue;
            return Mano.NADA;
        }

        private void getNumberOfSuit()
        {
            foreach (var element in Cards)
            {
                if (element.MySuit == SUIT.CORAZON)
                    corazonSum++;
                else if (element.MySuit == SUIT.DIAMANTE)
                    diamanteSum++;
                else if (element.MySuit == SUIT.TREBOL)
                    trebolSum++;
                else if (element.MySuit == SUIT.PICA)
                    PicaSum++;
            }
        }

        private bool POQUER()
        {
           
            if(cartas[0].MyValue == cartas[1].MyValue && cartas[0].MyValue == cartas[2].MyValue && cartas[0].MyValue == cartas[3].MyValue)
            {
                valormano.Total = (int)cartas[1].MyValue * 4;
                valormano.HighCard = (int)cartas[4].MyValue;
                return true;
            }
            else if (cartas[1].MyValue == cartas[2].MyValue && cartas[1].MyValue == cartas[3].MyValue && cartas[1].MyValue == cartas[4].MyValue)
            {
                valormano.Total = (int)cartas[1].MyValue * 4;
                valormano.HighCard = (int)cartas[0].MyValue;
                return true;
            }

            return false;
        }

        private bool FULLHOUSE()
        {
            
            if ((cartas[0].MyValue == cartas[1].MyValue && cartas[0].MyValue == cartas[2].MyValue && cartas[3].MyValue == cartas[4].MyValue) ||
                (cartas[0].MyValue == cartas[1].MyValue && cartas[2].MyValue == cartas[3].MyValue && cartas[2].MyValue == cartas[4].MyValue))
            {
                valormano.Total = (int)(cartas[0].MyValue) + (int)(cartas[1].MyValue) + (int)(cartas[2].MyValue) +
                    (int)(cartas[3].MyValue) + (int)(cartas[4].MyValue);
                return true;
            }

            return false;
        }

        private bool COLOR()
        {
         
            if (corazonSum == 5 || diamanteSum == 5 || trebolSum == 5 || PicaSum == 5)
            {
                
                valormano.Total = (int)cartas[4].MyValue;
                return true;
            }

            return false;
        }

        private bool ESCALERA()
        {
            
            if (cartas[0].MyValue + 1 == cartas[1].MyValue &&
                cartas[1].MyValue + 1 == cartas[2].MyValue &&
                cartas[2].MyValue + 1 == cartas[3].MyValue &&
                cartas[3].MyValue + 1 == cartas[4].MyValue)
            {
                
                valormano.Total = (int)cartas[4].MyValue;
                return true;
            }

            return false;
        }

        private bool TRIO()
        {
            
            if ((cartas[0].MyValue == cartas[1].MyValue && cartas[0].MyValue == cartas[2].MyValue) ||
            (cartas[1].MyValue == cartas[2].MyValue && cartas[1].MyValue == cartas[3].MyValue))
            {
                valormano.Total = (int)cartas[2].MyValue * 3;
                valormano.HighCard = (int)cartas[4].MyValue;
                return true;
            }
            else if (cartas[2].MyValue == cartas[3].MyValue && cartas[2].MyValue == cartas[4].MyValue)
            {
                valormano.Total = (int)cartas[2].MyValue * 3;
                valormano.HighCard = (int)cartas[1].MyValue;
                return true;
            }
            return false;
        }

        private bool DOSPARES()
        {
            
            if (cartas[0].MyValue == cartas[1].MyValue && cartas[2].MyValue == cartas[3].MyValue)
            {
                valormano.Total = ((int)cartas[1].MyValue * 2) + ((int)cartas[3].MyValue * 2);
                valormano.HighCard = (int)cartas[4].MyValue;
                return true;
            }
            else if (cartas[0].MyValue == cartas[1].MyValue && cartas[3].MyValue == cartas[4].MyValue)
            {
                valormano.Total = ((int)cartas[1].MyValue * 2) + ((int)cartas[3].MyValue * 2);
                valormano.HighCard = (int)cartas[2].MyValue;
                return true;
            }
            else if (cartas[1].MyValue == cartas[2].MyValue && cartas[3].MyValue == cartas[4].MyValue)
            {
                valormano.Total = ((int)cartas[1].MyValue * 2) + ((int)cartas[3].MyValue * 2);
                valormano.HighCard = (int)cartas[0].MyValue;
                return true;
            }
            return false;
        }

        private bool PAR()
        {
            
            if (cartas[0].MyValue == cartas[1].MyValue)
            {
                valormano.Total = (int)cartas[0].MyValue * 2;
                valormano.HighCard = (int)cartas[4].MyValue;
                return true;
            }
            else if (cartas[1].MyValue == cartas[2].MyValue)
            {
                valormano.Total = (int)cartas[1].MyValue * 2;
                valormano.HighCard = (int)cartas[4].MyValue;
                return true;
            }
            else if (cartas[2].MyValue == cartas[3].MyValue)
            {
                valormano.Total = (int)cartas[2].MyValue * 2;
                valormano.HighCard = (int)cartas[4].MyValue;
                return true;
            }
            else if (cartas[3].MyValue == cartas[4].MyValue)
            {
                valormano.Total = (int)cartas[3].MyValue * 2;
                valormano.HighCard = (int)cartas[2].MyValue;
                return true;
            }

            return false;
        }

    }
}


CLASE MARCO DE LAS CARTAS Utilizamos métodos y propiedades para crear un motor de dibujo para mostrar nuestras cartas en la ventana de la consola. Creamos el contorno de la tarjeta e imprimimos la carta y el valor dentro de la carta utilizando la página de códigos 437
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JUEGOPOKER
{
    class MarcoCarta
    {
      
        public static void DrawCardOutline (int xcoor, int ycoor)
        {
            


            Console.ForegroundColor = ConsoleColor.White;


            int x = xcoor * 12;
            int y = ycoor;

            Console.SetCursorPosition(x, y);
            Console.Write(" **********\n"); 

            for (int i = 0; i < 10; i++)
            {
                Console.SetCursorPosition(x, y + 1 + i);

                if (i != 9)
                    Console.WriteLine("*          *");
                else
                    Console.WriteLine("************");
            }
        }

        
        public static void DrawCardSuitValue(Carta card, int xcoor, int ycoor)
        {
            char cardSuit = ' ';
            int x = xcoor * 12;
            int y = ycoor;

          
            switch(card.MySuit)
            {
                case Carta.SUIT.CORAZON:
                    cardSuit = Encoding.GetEncoding(437).GetChars(new byte[] { 3 })[0];
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
                case Carta.SUIT.DIAMANTE:
                    cardSuit = Encoding.GetEncoding(437).GetChars(new byte[] { 4 })[0];
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
                case Carta.SUIT.TREBOL:

                    cardSuit = Encoding.GetEncoding(437).GetChars(new byte[] { 5 })[0];
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
                case Carta.SUIT.PICA:
                    cardSuit = Encoding.GetEncoding(437).GetChars(new byte[] { 6 })[0];
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
            }

          
            Console.SetCursorPosition(x +5 , y + 5);
            Console.Write(cardSuit);
            Console.SetCursorPosition(x + 4, y + 7);
            Console.Write(card.MyValue);

        }
    }
}

ESTA ES LA CLASE REPARTIR CARTA Creamos una clase Repartir Cartas que sirve como motor para repartir 5 cartas al Jugador uno y al Jugador dos. A continuación, ordenamos la mano para poder comparar los valores nominales más fáciles.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JUEGOPOKER
{
    class RepartirCarta : Baraja
    {
        private Carta[] playeruno;
        private Carta[] playerdos;
        private Carta[] sortedPlayeruno;
        private Carta[] sortedplayerdos;

        public RepartirCarta()
        {
            playeruno = new Carta[5];
            sortedPlayeruno = new Carta[5];
            playerdos = new Carta[5];
            sortedplayerdos = new Carta[5];
        }

        public void Deal()
        {
            setUpDeck(); 
            getHand();//obtener mano
            ordenarcarta();
            presentacioncarta();
            evaluadormano();
        }

        public void getHand()
        {
            
            for (int i = 0; i < 5; i++)
                playeruno[i] = getDeck[i];

            
            for (int i = 5; i < 10; i++)
                playerdos[i -5] = getDeck[i];
        }

        public void ordenarcarta()
        {
            var queryPlayer = from hand in playeruno
                              orderby hand.MyValue
                              select hand;

            var queryComputer = from hand in playerdos
                                orderby hand.MyValue
                                select hand;

            var index = 0;
            foreach(var element in queryPlayer.ToList())
            {
                sortedPlayeruno[index] = element;
                index++;
            }

            index = 0;
            foreach (var element in queryComputer.ToList())
            {
                sortedplayerdos[index] = element;
                index++;
            }
        }

        public void presentacioncarta()
        {
            Console.Clear();
            int x = 0; 
            int y = 1;

           
            Console.WriteLine("                           JUGADOR UNO");
            for (int i = 0; i < 5; i++)
            {
                MarcoCarta.DrawCardOutline(x, y);
                MarcoCarta.DrawCardSuitValue(sortedPlayeruno[i], x, y);
                x++;
            }
            y = 15; 
            x = 0; 
            Console.SetCursorPosition(x, 14);
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("                            JUGADOR DOS");
            for (int i = 5; i < 10; i++)
            {
                MarcoCarta.DrawCardOutline(x, y);
                MarcoCarta.DrawCardSuitValue(sortedplayerdos[i - 5], x, y);
                x++;
            }

        }

        public void evaluadormano()
        {
          
            EvaluarMano playerHandEvaluator = new EvaluarMano(sortedPlayeruno);
            EvaluarMano computerHandEvaluator = new EvaluarMano(sortedplayerdos);

            
            Mano playeruno = playerHandEvaluator.EvaluateHand();
            Mano playerdos = computerHandEvaluator.EvaluateHand();

            
            Console.WriteLine("\n\n\n\n\n                      JUGADOR UNO: " + playeruno);
            Console.WriteLine("\n                      JUGADOR DOS: " + playerdos);

            //evaluar las manos
            if (playeruno > playerdos)
            {
                Console.WriteLine("\n                      JUGADOR UNO GANADOR!");
            }
            else if (playeruno < playerdos)
            {
                Console.WriteLine("\n                      JUGADOR DOS GANADOR!");
            }
            else //Si las manos son los mismos, evaluar los valores
            {
                //Primero en evalua quién tiene mayor en valor de la mano de póker
                if (playerHandEvaluator.HandValues.Total > computerHandEvaluator.HandValues.Total)
                    Console.WriteLine("\n                      JUGADOR UNO GANADOR!");
                else if (playerHandEvaluator.HandValues.Total < computerHandEvaluator.HandValues.Total)
                    Console.WriteLine("\n                      JUGADOR DOS GANADOR!");
               
                else if (playerHandEvaluator.HandValues.HighCard > computerHandEvaluator.HandValues.HighCard)
                    Console.WriteLine("\n                      JUGADOR UNO GANADOR!");
                else if (playerHandEvaluator.HandValues.HighCard < computerHandEvaluator.HandValues.HighCard)
                    Console.WriteLine("\n                      JUGADOR DOS GANADOR!");
                else
                    Console.WriteLine("\n                      NO HAY GANADOR!");
            }
        }
    }
}
En esta parte final del código en el cual se comparan las manos de POKER de los jugadores y determinar el ganador. A continuación, mostramos los resultados en la pantalla. LINK DE DESCARGA https://drive.google.com/open?id=0BwJNBThSd1cfWDZTbUtnWFd1ajg

No hay comentarios.:

Publicar un comentario