为什么我的代码执行的次数远远超过预期?

时间:2015-10-24 11:19:28

标签: javascript

我目前正在开发扑克赔率发生器,除了一件事,它已经完成了很多工作。该计划的运行频率远高于应有的程度。我知道这来自compare()函数,因为当我添加一个变量Q来跟踪主函数playPoker()运行的次数时,它产生了一个巨大的数字直到我发表评论 - 此时它会返回我期望的确切数字。

你们任何人都可以指出我出错的地方吗?我不明白为什么一个函数应该导致Q增加得比应有的多得多。从字面上看,我最后一次运行它的数字是(32,487而不是100)。我提供下面的代码(没有扑克手工检查功能,因为它们并不重要)。为什么playPoker()会运行这么多次?!

var Q = 0;

function playPoker(tableSize) {

//Create the players, the deck and the card table which stores the 5 cards the players have in common
var players = createPlayers(tableSize);
var deck = createDeck();
var cardTable = new CardTable();

//Deal each player two cards
for (i = 0; i < 2; i++) {
    for (j = 0; j < players.length; j++) {
        deal(deck, players[j]);
    }
}

//Put five cards down on the table
for (k = 0; k < 5; k++) {
    deal(deck, cardTable);
}

//Check for various winning hands here for each player
for (m = 0; m < players.length; m++) {

    //Merge the player's two cards with the five cards on the table
    var subjectCards = (players[m].cards).concat(cardTable.cards);

    //Make an array of the values of each of the seven cards, which will be used to determine 4 of a kind, 3 of a kind and pairs
    var valuesInOrder = getValuesInOrder(subjectCards);

    //Create a dummy array, so that valuesInOrder remains unchanged
    var straightValues = valuesInOrder.slice();

    //Remove any duplicate card, meaning that the array contains only unique values (i.e. 2, 4, 5, 7, K ... NOT 2, 2, 2, 8, K, K, A)
    var straightValues = straightenUp(straightValues);

    //Calculate how many pairs are in the hand
    var numPairs = howManyPairs(valuesInOrder, straightValues, players[m]);

    //Find out whether the 5 table cards contain three cards of the same suit. If not, then a flush is impossible.
    var flushPotential = threeSameSuit(cardTable.cards);

    //Find out which hand each player has (i.e. straight, 3OAK, pair)
    checkPokerHand(subjectCards, straightValues, valuesInOrder, flushPotential, numPairs, players[m])
}

var rankedPlayers = compare(players);

//return players;

Q++;
return Q;

}

这是for-loop设置它。

for (z = 0; z < 100; z++;) {
    playPoker(4);
}

这是compare()函数:

function compare(players) {

var remPlayers = players.slice();

var rankings = [];
var potentialWinners = [];

//Collect all the players' rankings in an array
for (i = 0; i < remPlayers.length; i++) {
    rankings.push(remPlayers[i].rank);
}

//Find the highest ranking
var highestRank = getHighestValue(rankings);

//Move any players with the highest ranking to an array for potential winners
for (j = 0; j < remPlayers.length; j++) {
    if (remPlayers[j].rank == highestRank) {
        potentialWinners.push(remPlayers[j]);
        remPlayers.splice(j, 1);
        j--;
    }
}

//With all potential winners gone, mark all other players with an L for losing.
for (k = 0; k < remPlayers.length; k++) {
    remPlayers[k].result = 'L'
}

var foundWinner = false;

if (potentialWinners.length < 2) {
    potentialWinners[0].result = 'W';
    foundWinner = true;
}

//Check there is more than one potential winner. If not, the only guy in the array has won.
if (!foundWinner) {

    //Loop through all players first cards and find the highest value, then delete any who don't have that, marking them with 'L'.
    //If there is no single remnant, do the same for second cards, then third, then fourth, etc.
    for (p = 0; p < 5; p++) {
        var subRankings = [];
        for (q = 0; q < potentialWinners.length; q++) {
            subRankings.push(potentialWinners[q].bestHand[p]);
        }
        var highestSubRanking = getHighestValue(subRankings);
        //Mark 'L' and remove any player who does not meet the highest subranking
        for (m = 0; m < potentialWinners.length; m++) {
            if (potentialWinners[m].bestHand[p] < highestSubRanking) {
                potentialWinners[m].result = 'L';
                potentialWinners.splice(m, 1);
            }
            if (potentialWinners.length < 2) {
                potentialWinners[0].result = 'W';
                //Set this flag to true to break the loop because a winner has been found
                foundWinner = true;
                break;
            }
        }

        //Break the loop if we have found a winner
        if (foundWinner) {
            break;
        }

        //If we still haven't found a winner by the end of the 5th loop, all remaining players draw
        if (p == 4) {
            for (z = 0; z < potentialWinners.length; z++) {
                potentialWinners[z].result = 'D';
            }
        }
        if (foundWinner) {
            break;
        }
    }
}
return players;
}

1 个答案:

答案 0 :(得分:2)

尝试对变量使用var声明来管理其相关功能的范围吗?