You are on page 1of 5

27/04/2017 Deck de Baralho ­ Contribuição ­ Unity3D ­ Fórum

Estou trabalhando em um jogo de cartas e então resolvi contribuir para a comunidade com um simples porém promissor sistema
de DECK de baralho!.
VI no google que muita gente tem dificuldae na hora de começar seus jogos de CARTAS. O Maior dificuldade que eu notei foi no
desenvolvimento de uma classe que gerencie o DECK e a distribuição cartas. Então vou contribuir com este pequeno porém
dificultoso COMEÇO! Tenho certeza que apartir daqui, aqueles que tinham esta dificuldade, conseguirão dar continuidade e
expandir o mesmo!.

VAMOS LA:
Fiz pequena baseada no baralho comun de 52 Cartas (sem o coringa), Sendo 13 cartas em 4 Naipes Diferente.
Ass, 2,3,4,5,6,7,8,9,10,Vallete, Dama, Rei.
> Vocês serão capazes de Gerar o DECK em ordem e automaticamente.
> Poderão Embaralhar o DECK
> Poderão Retirar uma carta do Deck (por vez) e logicamente receber a carta Retirada do DECK.
VOcês vão observar que após o deck ser gerado e embaralhado, a ação de retirar uma carta é consistem em pegar a proxima carta
do DECK. Ex: Se seu deck estiver em ordem, (AC,2O,3E,4P) e retirar uma carta do deck, esta carta sera a (ACopas), e a proxima
(2Ouro), E asism sucessivamente. Para aumentar a segurança contra hacks, vocês poderão efetuar o Embaralhamento após cada
retirada e ou Antes e apos cada Retirada. Isto vai depender do estilo de jogo que vc vai fazer apartir daqui
 
Cards.Collections.cs

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 
using System.Linq; 
using System; 

namespace Cards.Collections 

    /// <summary> 
    /// Naipe de cartas use: ([string] para nomes e [int] para valores numéricos) Ao iniciar um novo Deck 
    /// 52 Cartas são ordenadas de 1 a 13 com ordem de Naipe 
    /// </summary> 
    public enum Naipe 
    { 
        Paus = 1,   //Paus 
        Ouro = 2,   //Ouro 
        Copas = 3,  //Copas 
        Espada = 4, //Espada 
    } 
    /// <summary> 
    /// Valores de cartas use: ([string] para nomes e [int] para valores numéricos) 
    /// </summary> 
    public enum CardValue 
    { 
        Ass = 1, //As 
        Dois = 2, 
        Tres = 3, 
        Quatro = 4, 
        Cinco = 5, 
        Seis = 6, 
        Sete = 7, 
        Oito = 8, 
        Nove = 9, 
        Dez = 10, 
        Valete = 11, 
        Dama = 12, 
        Rei = 13,   
    } 

    /// <summary> 
    /// Retorna ou Seta Naipe e Valor da carta 
    /// </summary> 
    public class Card 
    { 
        public Naipe Naipe { get; set; } 
        public CardValue CardValue { get; set; } 
    } 

http://www.unidev.com.br/index.php?/topic/55769­deck­de­baralho­contribui%C3%A7%C3%A3o/ 1/5
27/04/2017 Deck de Baralho ­ Contribuição ­ Unity3D ­ Fórum
    /// <summary> 
    ///  //DECK é Maço de cartas do qual apartir dele são distribuidas as cartas para os jogadores 
    /// </summary>   
    public class Deck 
    { 
        public List<Card> Cards { get; set; } //NAIPE e VALOR 

        public Deck() 
        { 
            Reset(); 
        } 

        /// <summary> 
        ///  Inicia DECK com 52 Cartas em ordem 
        /// </summary>    
        public void Reset() 
        { 
            Cards = Enumerable.Range(1, 4).SelectMany( 
                naipe => Enumerable.Range(1, 13).Select( 
                    cardValue => new Card() { Naipe = (Naipe)naipe, CardValue = (CardValue)cardValue })).ToList(); 
        } 

        /// <summary> 
        ///  Embaralha ordem das cartas do deck 
        /// </summary>   
        public void DeckMix() 
        { 
            Cards = Cards.OrderBy(cardValue => Guid.NewGuid()).ToList(); 
        } 

        /// <summary> 
        ///  Remove a proxima carta do DECK e retorna esta Carta 
        /// </summary>   
        public Card TakeCard() 
        { 
            if (Cards.Count > 0) 
            { 
                Card card = Cards.FirstOrDefault(); //Pega o primeiro da sequencia no Deck 
                Cards.Remove(card); //Removemos esta carta do Deck 
                return card; 
            } 
            else 
            {                                
                return null; 
            } 
        } 

    } 

COMO USAR?

using Cards.Collections; //OBSERVE A INCLUSAO DO NAMESPACE QUE EU CRIEI ANTERIORMENTE 

public class testCards : MonoBehaviour { 

private Deck deck; //Nosso Maço de cartas 
void start() 

 deck = new Deck();  //Acabamos de criar nosso maço de cartas com 52 cartas ordenadas Agora é ser feliz 

Quandidade de cartas no deck:
http://www.unidev.com.br/index.php?/topic/55769­deck­de­baralho­contribui%C3%A7%C3%A3o/ 2/5
27/04/2017 Deck de Baralho ­ Contribuição ­ Unity3D ­ Fórum

               Debug.Log(Mydeck.Cards.Count); //52

Quantidade de Cartas por NAIPE:

        Mydeck = new Deck(); 
        Debug.Log(Mydeck.Cards.Count(card => card.Naipe == Naipe.Copas)); //13 
        Debug.Log(Mydeck.Cards.Count(card => card.Naipe == Naipe.Espada)); //13 
        Debug.Log(Mydeck.Cards.Count(card => card.Naipe == Naipe.Ouro)); //13 
        Debug.Log(Mydeck.Cards.Count(card => card.Naipe == Naipe.Paus)); //13

Todas as Cartas do DECK:

        Mydeck = new Deck(); 
        for (int a = 0; a < Mydeck.Cards.Count; a++) 
        { 
            Debug.Log(Mydeck.Cards[a].CardValue + " de " + Mydeck.Cards[a].Naipe); 
        }

Vericando a carta por VALOR

       
        for (int a = 0; a < Mydeck.Cards.Count; a++) 
        { 
            Debug.Log((int)Mydeck.Cards[a].CardValue); //Ass = 1 / Valete = 11 etc etc 
        }

     
        Paus = 1,   //Paus 
        Ouro = 2,   //Ouro 
        Copas = 3,  //Copas 
        Espada = 4, //Espada 
        for (int a = 0; a < Mydeck.Cards.Count; a++) 
        { 
            Debug.Log((int)Mydeck.Cards[a].Naipe); 
        }

Embaralhando o DECK e Mostrando novamente as cartas:

       
        Mydeck.DeckMix(); //Embaralhou o deck. Use quantas vezes necessitar do embaralho 

        for (int a = 0; a < Mydeck.Cards.Count; a++) 
        { 
            Debug.Log(Mydeck.Cards[a].CardValue + " de " + Mydeck.Cards[a].Naipe); 
        }

Criando o deck, Embaralhando, Pegando uma carta e Embaralhando novamente.

      
        Mydeck.DeckMix(); //Embaralha 

        Card card = Mydeck.TakeCard(); //Pega uma carta e remove ela do Deck 
        Debug.Log(card.CardValue + " de " + card.Naipe); //Mostra a carta removida do deck 

        Mydeck.DeckMix(); //Embaralhamos as cartas restantes do deck

E se quiserem um exemplo VISUAL do DECK  fiz um exemplo simples com onGUI.

using UnityEngine; 
using System.Collections; 
using System.Linq; 

http://www.unidev.com.br/index.php?/topic/55769­deck­de­baralho­contribui%C3%A7%C3%A3o/ 3/5
27/04/2017 Deck de Baralho ­ Contribuição ­ Unity3D ­ Fórum
using Cards.Collections; 

public class teste2 : MonoBehaviour { 

    private Deck deck; //Maço de cartas 
    private GUIStyle StyleDeck; 
    private Vector2 ScrollDeck = Vector2.zero; 

    void Start () 
    { 

        Mydeck = new Deck();         
        StyleDeck = new GUIStyle(); 
        StyleDeck.fontSize = 10; 
        StyleDeck.normal.textColor = Color.white; 
        StyleDeck.padding = new RectOffset(10, 5, 0, 0); 

    } 
     
    // Update is called once per frame 
    void Update () 
    { 
        if (Input.GetKeyDown(KeyCode.M)) 
        { 
            for (int a = 0; a < Mydeck.Cards.Count; a++) 
            { 
                Debug.Log(Mydeck.Cards[a].CardValue + " of the "+Mydeck.Cards[a].Naipe); 
            } 
        } 
        if (Input.GetKeyDown(KeyCode.E)) 
        { 
            Mydeck.DeckMix(); 
             
        } 
        if (Input.GetKeyDown(KeyCode.P)) 
        { 
            Card card = Mydeck.TakeCard(); 
            if (card != null) 
            { 
                Debug.Log(card.CardValue + " " + card.Naipe); 
            } 
        } 

    } 

    void OnGUI() 
    { 

        GUI.BeginGroup(new Rect(10, 10, 200, Screen.height‐20));          
        GUI.Box(new Rect(0, 0, 190, Screen.height ‐ 30), "DECK"); 

         
        ScrollDeck = GUI.BeginScrollView(new Rect(0, 30, 190, Screen.height ‐ 120), ScrollDeck, new Rect(0, 0, 0, 26
         
        for (int a = 0; a < Mydeck.Cards.Count; a++) 
        { 
            //GUILayout.Label(DeckText += deck.Cards[a].CardValue + " de " + deck.Cards[a].Naipe + "\n");
           GUI.Box(new Rect(10,26*a,160,26),Mydeck.Cards[a].CardValue + " de " + Mydeck.Cards[a].Naipe); 

        } 
        GUI.EndScrollView(); 

        if (GUI.Button(new Rect(100, Screen.height ‐ 60, 80, 22), "Embaralhar")) { Mydeck.DeckMix(); } 
        GUI.EndGroup(); 

    } 

http://www.unidev.com.br/index.php?/topic/55769­deck­de­baralho­contribui%C3%A7%C3%A3o/ 4/5
27/04/2017 Deck de Baralho ­ Contribuição ­ Unity3D ­ Fórum

Aperte (E ) para Embaralhar
Aperte (P) para pegar uma carta e mostrar do LOG a carta que pegou. A s cartas do deck serao atualizadas!

http://www.unidev.com.br/index.php?/topic/55769­deck­de­baralho­contribui%C3%A7%C3%A3o/ 5/5

You might also like