알고리즘 - 포커-0

백승일·2020년 12월 9일
// 무작위 5개의 문자열의 배열이 들어온다는 가정
// 문양은 C,H,D,S / 숫자는 A~JQK
function foker(cards){
  const nums = ["A","1","2","3","4","5","6","7","8","9","T","J","Q","K"];
  const feat = ["C","H","D","S"];
  // cards는 ["3C","AS","TC","kC"] 이런 식으로 들어옴
  const jokbo = ["탑","원페어","투페어","트리플","스트레이트","백스트레이트","플러쉬","풀하우스","포카드","스트레이트 플러쉬","로얄 스트레이트 플러쉬"];
  // 패의 숫자와 문양을 구분
  const myNumsBeforeFliter = cards.map(card=>card.slice(0,1));
  const myFeat = cards.map(card=>card.slice(1,2));
// 결과값을 담을 변수와 점수판
  let result ="";
  let resultFeatPoint = 0;
  let resultPoint =0;
  // 문자인 숫자를 nums의 인덱스를 이용하여 변경
  const myNumsAfterFliter = myNumsBeforeFliter.map(num=> nums.indexOf(num)+1);
  //족보 계산 시작

  // 플러쉬 확인 함수
  const isSameFeat = feat =>{
    const result = feat.reduce((acc,cur,idx)=>{
      if(idx ===0){
        return acc
      }
      if(acc === cur){
        return acc
      }else{
        return false
      }
    });
    return result
  } 
  // 스트레이트 계산 함수
  const stright = nums => {
    // 숫자를 낮은 수 부터 정렬
    let result = false;
    nums.sort((a,b)=>a-b);

    for(let idx= 0; idx<nums.length;idx++){
      if(!(nums[idx]+1 === nums[idx+1])){
        return result
      }else{
        result = true;
      }
    }
    return result
  }
  // 로티플 계산 함수
  const LSF = (numArray,featArray)=>{
    let resultSet = {
      result:false,
      feat:""
    };
    const cardFeat = isSameFeat(featArray);
    if(!cardFeat) {
      // 다른 무늬가 있으면 바로 끝
      return resultSet.result
    }
    // 로티플의 숫자는 고정
    const LSFNum = [1,11,12,13,14];
    for(let value of numArray){
      if(!LSFNum.includes(value)){
        return resultSet.result
      }
    }
    resultSet.result = true;
    resultSet.feat = cardFeat;
    return resultSet;
  };
  // 스트레이트 플러쉬
  const SF = (numArray,featArray)=>{
    let resultSet = {
      result:false,
      feat:""
    };
    const cardFeat = isSameFeat(featArray);
    const cardNums = stright(numArray);

    if(cardFeat && cardNums) {
      resultSet.result = true;
      resultSet.feat = cardFeat;
      return resultSet
    }else{
      // 다른 무늬가 있으면 바로 끝
      return resultSet
    }
  }

  // 포카드


  // 손패 계산
  // 세밀한 점수를 위해서 문양도 뺴고 싶은데 이러면 너무 불합리하다. 족보에 맞으면 계산하지 않을 방법이 없을까
  const resultLSF = LSF(myNumsAfterFliter,myFeat);
  const resultSF = SF(myNumsAfterFliter,myFeat);
  if(resultLSF.result){
    result = "로얄 스트레이트 플러쉬";
    resultFeatPoint = feat.indexOf(resultLSF.feat)/10;
  }else if(resultSF.result){
    result = "스트레이트 플러쉬";
    resultFeatPoint = feat.indexOf(resultSF.feat)/10;
  }
  resultPoint = jokbo.indexOf(result)
  const finalPoint = resultPoint+resultFeatPoint
  console.log(finalPoint)
  return finalPoint;
}

const a = ["TH","9H","QH","JH","KH"];
foker(a);

여기까지 진행하면서 든 생각이 점수를 좀더 디테일하게 주기 위해서는 문양의 점수를 주어야한다. 이렇게 하니 함수를 실행한 값을 저장, 값의 정보 확인 순으로 코드가 흘러서 결국 모든 족보를 확인하고 넘어가야하는 식이 되었다. 이 부분을 좀 더 고쳐봐야겠다.

profile
뉴비 개발자

0개의 댓글