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