랜덤으로 카드뽑기, 족보 판별하기

Tom·2024년 12월 20일
0

카드게임 만들기

목록 보기
4/13

Draggable 상속받는 카드 만들기

카드게임을 만들기 위해 이제 각각 카드 오브젝트에 데이터를 추가해주기로 했다. 지금은 드래그만 가능한 오브젝트였는데, 이걸 제네릭타입으로 바꿔주고 상속받는 Card를 만들기로 했음.

public class DraggableUIObject<T> : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler, IPointerDownHandler, IPointerUpHandler where T : DraggableUIObject<T>
{
    protected Image image;
    private Vector3 offset;
    private bool isDragging;
    private CanvasGroup canvasGroup;
    public RectTransform rectTransform;

    public Action<T> beginDragAction;
    public Action<T> endDragAction;
    public Action<T> onDragAction;
    public Action<T> pointerDownAction;
    public Action<T> pointerUpAction;
    
    // ~구현한 인터페이스들~
}

카드는 전에 만들어두었던걸 고대로 사용했다.

public enum HandValue
{ 
    HighCard = 1, OnePair, TwoPair, ThreeOfAKind, Straight, Flush, FullHouse, FourOfAKind, StraightFlush, RoyalFlush, Max
}

public enum CardValue
{
   Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Max
}

public enum CardSuit
{
    Heart, Diamond, Spade, Clover, Max
}

public enum CardType
{ 
    common, Joker, Max
}
public class CardData
{
    public CardValue cardValue;
    public CardSuit cardSuit;
    public CardType cardType;

    public CardData(CardType _cardType)
    {
        cardType = _cardType;
    }

    public CardData(CardType _cardType, CardValue _cardValue, CardSuit _cardSuit)
    {
        cardValue = _cardValue;
        cardSuit = _cardSuit;
        cardType = _cardType;
    }
}

public class Card : DraggableUIObject<Card>
{
    public CardValue value;
    public CardSuit suit;
    public CardType type;
    [SerializeField] private Sprite backImage;
    [SerializeField] private Sprite frontImage;
    
    public void SetCardData(CardData cardData)
    {
        type = cardData.cardType;
        
        if(type == CardType.common)
        {
            value = cardData.cardValue;
            suit = cardData.cardSuit;
        }
    }
}

그리고 간단하게 카드매니저를 만들어 데이터를 기반으로 새 카드를 뽑을 수 있게 만들었다.

using UnityEngine;

public class CardManager : Singleton<CardManager>
{
    private const string cardPath = "Prefab/Card";
    public GameObject cardPrefab;
    
    protected override void Init()
    {
        base.Init();
        cardPrefab = Resources.Load<GameObject>(cardPath);
    }

    public Card NewCard(CardData cardData)
    {
        GameObject go = Instantiate(cardPrefab);
        Card card = go.GetComponent<Card>();
        card.SetCardData(cardData);
        card.GetCardImage();
        return card;
    }
}

그리고 데이터자리에 enum범위 내 랜덤값을 배치해서 카드를 뽑아봤음. 잘되는 모습

카드 족보 판별하기

이제 카드안에 밸류와 문양 데이터도 들어있으시겠다, 필드에 내놓은 카드에서 현재 구성되어있는 패가 어떤 패인지 확인해주면 되겠다. 높은 족보부터 확인하며 내려가서 현재 맞는 족보일 경우 리턴해주면 됨.

if (카드가 5장 미만) return 아무것도 아님.
if (로티플인가요?) return 로티플이군요!
if (스티플인가요?) return 스티플이군요!
if (포카드인가요?) return 포카드군요!
if (풀하우스인가요?) return 풀하우스군요!
~~~
else (아무것도 아님ㅋ;) return 하이카드!

아오 언제하냐.. 이런건 AI한테 맡기면 금방 해결됨ㅎ!
근데 로티플을 판별하는 부분만 정상적으로 작동이 안돼서 이건 직접 만들어줬다.

    private bool IsRoyalFlush(List<Card> cards)
    {
        Card card = cards[0];

        for(int i = 1; i < 5; i++)
        {
            if (card.suit != cards[i].suit) return false;
        }

        List<Card> dupList = new List<Card>(cards);
        
        dupList = dupList.OrderBy(card => card.value).ToList();
        
        if (dupList[0].value != CardValue.Ace) return false;
        if (dupList[1].value != CardValue.Ten) return false;
        if (dupList[2].value != CardValue.Jack) return false;
        if (dupList[3].value != CardValue.Queen) return false;
        if (dupList[4].value != CardValue.King) return false;

        return true;
    }

대충 이런 판별코드가 족보별로 쭉 나열되어있다. AI가 짠건데 당연히 잘 되겠지?

profile
여기 글은 보통 틀린 경우가 많음

0개의 댓글

관련 채용 정보