상세 컨텐츠

본문 제목

1001 TIL - C# 프로젝트 4일차

스파르타 코딩캠프/'24 Today I Learned

by lucar 2024. 10. 1. 21:56

본문

게임 속 카지노에 들어갈 포커 족보 알고리즘을 만들었다.

private HandRank HandRanking(List<Card> WhosHand)
{
    int flushCount = 0;
    int straightCount = 0;
    int pairCount = 0;
    bool isFlush = false;
    bool isStraight = false;
    bool isRoyal = false;
    //숫자 순 정렬
    for (int i = 0; i < WhosHand.Count; i++)
    {
        for (int j = 0; j > WhosHand.Count; j++)
        {
            if ((int)WhosHand[i].RankOfCard > (int)WhosHand[j].RankOfCard)
            {
                var temp = WhosHand[i];
                WhosHand[i] = WhosHand[j];
                WhosHand[j] = temp;
            }
        }
    }
    for (int i = 0; i < WhosHand.Count - 1; i++)
    {
        if ((int)WhosHand[i].RankOfCard + 1 == (int)WhosHand[i + 1].RankOfCard)
        {
            straightCount++;
        }
        if ((int)WhosHand[i].RankOfCard == (int)WhosHand[i + 1].RankOfCard)
        {
            pairCount++;
        }
        if (WhosHand[i].SuitOfCard == WhosHand[i + 1].SuitOfCard)
        {
            flushCount++;
        }
    }
    if (flushCount == 4) isFlush = true; //플러시
    if (straightCount >= 3)
    {
        if ((int)WhosHand[0].RankOfCard == 1 &&
            (int)WhosHand[4].RankOfCard == 13)
        {
            isRoyal = true; //로얄,마운틴
            isStraight = true;
        }
        if (straightCount == 4) isStraight = true; //스트레이트
    }
    if (pairCount == 1) return HandRank.Pair; //원페어
    else if (pairCount == 2)
    {
        if (WhosHand.GroupBy(card => card.RankOfCard).Count(group => group.Count() == 2) == 2)
        {
            //투페어
            return HandRank.TwoPair;
        }
        //트리플
        else return HandRank.ThreeOfAKind;
    }
    else if (pairCount == 3)
    {
        if (WhosHand.GroupBy(card => card.RankOfCard).Any(group => group.Count() == 4))
        {
            //포카드
            return HandRank.FourOfAKind;
        }
        else return HandRank.FullHouse; //풀하우스 
    }
    if (isStraight == true)
    {
        if (isFlush == true && isRoyal == true) return HandRank.RoyalStraight; //로얄스트레이트플러시
        else if (isFlush == true) return HandRank.StraightFlush; //스트레이트플러시
        else if (isRoyal == true) return HandRank.Mountain; //마운틴
        else return HandRank.Straight; //스트레이트
    }
    else if (isFlush == true) return HandRank.Flush; //플러시

    return HandRank.Top;
}

 

파이브카드 포커라 족보 구현이 그나마? 간단? 했다.

 

우선 오름차 배열로 선택 정렬한 후

Hand[i] 번째 카드 값 + 1 == Hand[i+1] 번째 카드 값과 같다면

Straight 카운트를 하나 늘려서

4라면 스트레이트

3이지만 A로 시작해서 K로 끝난다면 마운틴

같은 식으로 우겨 넣어서 만들었다

 

같은 패가 있다면 Pair카운트를 늘리고

 

같은 문양이 있다면 Flush 카운트를 늘려서

 

Pair카운트가 2인데 같은 랭크끼리 묶은 그룹이 2개라면 투페어

아니라면 트리플

 

Pair카운트가 3인데 같은 랭크끼리 묶은 그룹의 길이가 4라면 포카드

아니라면 풀하우스

 

Flush카운트가 4라면 플러시

 

플러시면서 스트레이트라면 스트레이트 플러시

플러시면서 스트레이트이면서 마운틴이라면 로얄 스트레이트 플러시

 

다 아니라면 탑

 

같은 방식으로 최대한 간단하게 하드코딩했다 ㅎㅎ

 

그럼 이만 TTE

관련글 더보기