Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.07.2021, 17:51
Аспирант
Отправить личное сообщение для prototip Посмотреть профиль Найти все сообщения от prototip
 
Регистрация: 15.05.2021
Сообщений: 35

метод сравнения
Ребят подскажите пожалуйста, пишу техасский холдем. Написал уже все комбинации, теперь нужно написать как-то метод сравнения карт всех игроков, с лежащими на столе картами и отсортировать на выходе руки от самой слабой до самой сильной. Гляньте пожалуйста код и подскажите как что я упустил и что нужно сделать чтобы выглядело так:
example 1:
Input: 4cKs4h8s7s Ad4s Ac4d As9s KhKd 5d6d
Output: Ac4d=Ad4s 5d6d As9s KhKd
example 2:
Input: 2h3h4h5d8d KdKs 9hJh
Output: KdKs 9hJh

const suitValue = {'T': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14}

class PokerHand {
    private hand: any;

    constructor(hand) {
        this.hand = hand
    }

    breakHighCardTie(player, opponent) {
        const playerHand = this.getFaceValues(player).reverse()
        const opponentHand = this.getFaceValues(opponent).reverse()
        for (let i = 0; i < playerHand.length; i++) {
            if (playerHand[i] > opponentHand[i]) return "win: player1"
            if (playerHand[i] < opponentHand[i]) return "win: player2"
            if (i === playerHand.length - 1 && playerHand[i] === opponentHand[i]) return "tie"
        }
    }

//переводит комбинации в числа  "KS AS TS QS JS" => [ 10, 11, 12, 13, 14 ]
    getFaceValues(hand) {
        hand = hand.replace(/\s/g, '').split('')
        const inOrder = []
        hand.forEach((value, idx) => {
            if (idx % 2 === 0) inOrder.push(suitValue[value] || parseInt(value))
        })
        return inOrder.sort((a, b) => a - b)
    }

    straightFlush(hand) {
        return this.isInOrder(hand) && this.isSameSuit(hand)
    }

    fourOfAKind(hand) {
        const values = this.groupValues(hand)
        return values.filter(value => {
            return value === 4
        }).length === 1
    }

    fullHouse(hand) {
        const values = this.groupValues(hand)
        return values.every(value => {
            return value === 2 || value === 3
        })
    }

    flush(hand) {
        return this.isSameSuit(hand)
    }

    straight(hand) {
        return this.isInOrder(hand)
    }

    threeOfAKind(hand) {
        const values = this.groupValues(hand)
        return values.filter(value => {
            return value === 3
        }).length === 1
    }

    twoPair(hand) {
        const values = this.groupValues(hand)
        return values.filter(value => {
            return value === 2
        }).length === 2
    }

    onePair(hand) {
        const values = this.groupValues(hand)
        return values.filter(value => {
            return value === 2
        }).length === 1
    }

    groupValues(hand) {
        hand = hand.replace(/\s/g, '').split('')
        hand = hand.filter((suit, idx) => {
            return idx % 2 === 0
        })
        hand = hand.reduce((acc, cur) => {
            acc[cur] = (acc[cur] || 0) + 1;
            return acc
        }, {})
        return this.getValues(hand)
    }

//Object.values()
    getValues(obj) {
        return Object.keys(obj).map(value => obj[value])
    }

//Flush
    isSameSuit(hand) {
        hand = hand.replace(/\s/g, '').split('')
        hand = hand.filter((suit, idx) => {
            return idx % 2 !== 0
        })
        return hand.every((value) => {
            return value === hand[0]
        })
    }

//Straight
    isInOrder(hand) {
        hand = hand.replace(/\s/g, '').split('')
        const inOrder = []
        hand.forEach((value, idx) => {
            if (idx % 2 === 0) inOrder.push(suitValue[value] || parseInt(value))
        })
        inOrder.sort((a, b) => a - b)
        for (let i = 0; i < inOrder.length - 1; i++) {
            if ((inOrder[i + 1] - inOrder[i]) != 1) return false
        }
        return true
    }
}
Ответить с цитированием
  #2 (permalink)  
Старый 20.07.2021, 06:01
Новичок на форуме
Отправить личное сообщение для Megabyte Посмотреть профиль Найти все сообщения от Megabyte
 
Регистрация: 09.07.2021
Сообщений: 5

Не храни набор карт в виде строки. В конструкторе преобразуй руку в массив объектов - карт [{suit, kind}, ...]. Все методы упростятся.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как асинхронно вызвать метод? PMaster Общие вопросы Javascript 14 17.07.2016 20:25
Кастомный метод для элемента выборки. Casufi jQuery 7 26.09.2013 18:43
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
Добавить свой метод к элементу alekciy Events/DOM/Window 6 16.02.2009 19:29