2017-02-21 34 views
3

我不確定最佳行動方案是從哪裏來的。對於每個玩家,我創建了一個既擁有公共牌又擁有自己牌的陣列,我只需要做的就是評估結果。如何評估德州撲克的手與Javascript?

我當然可以蠻力檢查每七張牌組合,但a)這不會很優雅快捷,b)我不知道如何處理領帶,因爲那樣你就不得不看看剩下的高牌。

這裏是小提琴,我使用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(); 
+0

有人會投票的任何特定原因?我認爲這是一個巨大的問題。這裏簡短的回答是,它需要很多代碼。大約10年前我在Actionscript中做了這個,而且非常困難。沒有什麼是非常複雜的,我們只是沒有意識到涉及到多少個概念(例如,識別直線,識別同花,知道哪個手排在更高等等) –

+0

這是一個了不起的問題,但涉及的代碼量這個算法可能超出了SO的範圍。 – Korgrue

回答

2

我的建議是實施一系列的功能,每個功能知道如何測試一個特定的條件。 (是的,會有一些看似冗餘的代碼,不,不要擔心,直到完成爲止。)

例如:has_royal_flush(player)

然後,您可以將檢測邏輯從得分邏輯。不管你想要什麼,你的評分邏輯都可以被構建。但請注意,這些規則可能會有所不同。在開始之前,您需要記下正在使用的確切的規則。

作爲檢測的一部分,您可能需要跟蹤「最佳組合卡」和「最高非組合卡」,這樣如果兩個玩家擁有相同的「基本」牌,打破平局的例程可以使用這些字段。

例如:

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 

在這個例子中,兩個玩傢俱有相同的 「鹼」 - 一對。所以打破平局,你可能會首先問:「一對是什麼?」在這個例子中,從病理上來說,兩名球員都有一對4。所以你繼續問:「好吧,既然組合的結合,什麼是最高的牌?」這個關係打破了。有可能在這個級別上有一個關係,在這種情況下,你必須執行另一個規則。

由於對常見行爲的期望,您可能會將不同的評分評估器視爲某些基類的對象。

+0

另外,請參見[這個問題](http://stackoverflow.com/questions/42380183/algorithm-to-give-a-value-to-a-5-card-poker-hand)最近問。也許你們可以一起工作...... –