我如何评估Texas Hold'用Javascript进行操作?

时间:2017-02-21 23:32:00

标签: javascript

我不确定这里最好的行动方案是什么。对于每个玩家,我创建了一个包含社区卡片和自己的卡片的阵列,我还有一件事就是评估结果。

我当然可以通过强力检查每七张牌组合,但a)不会非常优雅和快速,而b)我不知道如何处理领带,从那时起你&# 39; d必须查看其余的高牌。

这是小提琴,为了测试目的,我已经将document.write()用于所有内容:

https://jsfiddle.net/bjp11yjb/1/

如果有人能指出我正确的方向,而不会让我太过困惑,我会非常感激!

var suits = ['Clubs', 'Spades', 'Hearts', 'Diamonds'];
var ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace'];
var combinations = ['Royal Flush', 'Straight Flush', 'Four of a Kind', 'Full House', 'Flush', 'Straight', 'Three of a Kind', 'Two Pair', 'One Pair'];
var deck = [];
var players = [new Player(), new Player()];
var table = [];

function Player()  {
    this.hand = [];
    this.result;
}

function Card(suit, rank)   {
    this.suit = suit;
    this.rank = rank;
    this.name = rank + ' of ' + suit;
}


function initDeck() {
    deck = [];

    for(var i = 0; i < 4; i++)   {
        for(var j = 0; j < 13; j++)   {
            deck.push(new Card(suits[i], ranks[j]));
        }
    }

}

function drawCard() {
    var randNumber = Math.floor(Math.random() * deck.length);
    var drawnCard = deck[randNumber];
    deck.splice(randNumber, 1);

    return drawnCard;
}


function dealCards()    {
    for(var i = 0; i < 2; i++)   {
        for(var j = 0; j < players.length; j++)   {
            var drawnCard = drawCard();
            players[j].hand.push(drawnCard);
        }
    }
}

function flop() {
    for(var i = 0; i < 3; i++)   {
        var drawnCard = drawCard();
        table.push(drawnCard);
    }
}

function turn()    {
    var drawnCard = drawCard();
    table.push(drawnCard);
}

function river()    {
    var drawnCard = drawCard();
    table.push(drawnCard);
}

function showDown() {
    for(var i = 0; i < players.length; i++)   {        

        evaluate(i);
        document.write("<br>");   

    }

}

function evaluate(player)  {
    var totalHand = players[player].hand.concat(table);

    for(var i = 0; i < totalHand.length; i++)   {

    }

}


initDeck();
dealCards();
document.write("Player 1: " + players[0].hand[0].name + ' and ' + players[0].hand[1].name + '<br>');
document.write("Player 2: " + players[1].hand[0].name + ' and ' + players[1].hand[1].name + '<br><br>');
flop();
document.write("Flop: " + table[0].name + ', ' + table[1].name + ' and ' + table[2].name + '<br>');
turn();
document.write("Turn: " + table[0].name + ', ' + table[1].name + ', ' + table[2].name + ' and ' + table[3].name + '<br>');
river();
document.write("River: " + table[0].name + ', ' + table[1].name + ', ' + table[2].name + ', ' + table[3].name + ' and ' + table[4].name + '<br>');
showDown();

1 个答案:

答案 0 :(得分:2)

我的建议是实现一系列功能,每个功能都知道如何测试一个特定的条件。 (是的,会有一些看似多余的代码。不,在你完成之前不要担心。)

例如:has_royal_flush(player)

然后,您可以将检测逻辑与评分逻辑分开。您可以根据需要构建评分逻辑。但请注意,规则可能会有所不同。您需要在开始之前记下您正在使用的完全规则。

您可能需要跟踪&#34;最佳组合卡&#34;和&#34;最高的非组合卡&#34;作为你的检测的一部分,如果两个玩家都拥有相同的&#34; base&#34;那么打破平局的例程可以使用这些字段。手。

例如:

Common:  4 7 8
Player 1: Q 4
Player 2: 10 4

Player 1: Pair
Player 2: Pair
Player 1's best combo card (e.g., "pair of whats"): 4
Player 2's best combo card: 4
Player 1's best non-combo card (i.e., "high card"): Q
Player 2's best non-combo card: 10

在这个例子中,两个玩家都拥有相同的&#34; base&#34; - 一对。因此,为了打破平局,你可能首先要问,&#34;一对什么?&#34;在这个例子中,在病理上,两个玩家都有一对4。所以你继续问,&#34;好吧,既然组合被捆绑了,那么最高的卡是什么?&#34;并打破了这条领带。在这个级别可能存在平局,在这种情况下,您必须实施另一个规则。

由于对常见行为的这种期望,您可能会将不同的评分评估者视为某些基类的对象。