コードが想定よりもはるかに多く実行されるのはなぜですか?

ゼットランド

私は現在ポーカーオッズジェネレーターに取り組んでいますが、1つを除いて、ほぼ完了しています。プログラムは、本来よりもはるかに頻繁に実行されます。これはcompare()関数からのものであることがわかっています。Qメイン関数playPoker()が実行された回数を追跡するために変数を追加すると、コメントアウトするまで膨大な数が生成されます。コメントアウトすると、正確な数Iが返されます。期待します。

私がこれでどこが間違っているのか、誰かが指摘できますか?1つの関数がQ、本来よりもはるかに多くインクリメントれることにつながる理由がわかりません。文字通り、最後に実行したときの数は(100ではなく32,487)でした。以下にコードを示します(ポーカーのハンドチェック機能はそれほど重要ではないため、機能はありません)。なんで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ループです。

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;
}
An0nC0d3r

var変数の宣言を使用して、関連する関数内でスコープを管理してみてください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

「for」ループがループの本体よりも1回多く実行されるのはなぜですか?

分類Dev

コードのこの部分が他の部分よりも先に実行されるのはなぜですか?

分類Dev

このコードでCPUがGPUよりも高速に実行されるのはなぜですか?

分類Dev

下にスクロールすると、numberOfRowInSectionの再実行値よりも多くのセルが表示されるのはなぜですか?

分類Dev

DEBUGトラップが予想よりも多く実行されるのはなぜですか?

分類Dev

関数でPythonコードがより速く実行されるのはなぜですか?

分類Dev

関数でPythonコードがより速く実行されるのはなぜですか?

分類Dev

同じコマンドを発行すると、pts / gnome-terminalよりもttyでより多くの出力が作成されるのはなぜですか?

分類Dev

collections.Counterがソースコードを直接実行するよりも高速に実行されるのはなぜですか

分類Dev

Openshiftがローカルで実行されている同じDockerコンテナーよりもはるかに多くのコンテナーメモリ使用量を報告するのはなぜですか?

分類Dev

EclipseのPyDevPythonコンソールよりもEclipseコンソールの方がコードが高速に実行されるのはなぜですか?

分類Dev

バイトコードがネイティブコードよりも高速に実行される可能性があるのはなぜですか

分類Dev

clearTimeout後もSetTimeoutコードが実行されるのはなぜですか

分類Dev

コマンドラインから実行したときに実行可能jarがEclipseから実行した同じプロジェクトよりもはるかに多くのRAMを使用するのはなぜですか?

分類Dev

setImmediate()がシーケンシャルコードよりも高速に実行されるのはなぜですか?

分類Dev

test1()がtest2()よりもはるかに高速に実行されるのはなぜですか?

分類Dev

私のコードが数学よりも1つ多く出力するのはなぜですか?

分類Dev

あるコンピューターでc ++コードが別のコンピューターよりも大幅に長く実行されるのはなぜですか?

分類Dev

実行中または一時停止よりも多くのジョブが「開始」されているのはなぜですか?

分類Dev

次のコードが正常にコンパイルおよび実行されるのはなぜですか?

分類Dev

CPUよりも多くの同時スレッドを実行できるのはなぜですか?

分類Dev

最初のループが常に2番目のループよりも速く実行されるのはなぜですか?

分類Dev

ADOレコードセットが基になるAccessクエリよりも多くのレコードを返すのはなぜですか

分類Dev

ロックされているコードの実行は、ロックされていないコードよりも時間がかかるはずです

分類Dev

このコードが他のすべてのオプションよりもわずかに多くabcとdを生成するのはなぜですか?

分類Dev

この操作がGPUよりもCPUで高速に実行されるのはなぜですか?

分類Dev

JavaScriptなぜ一部のコードが残りのコードよりも先に実行されるのですか?

分類Dev

malloc()が要求よりも多くのメモリを割り当てるのはなぜですか?Mac OS Xでmallocがこれを実行できないようにするにはどうすればよいですか?

分類Dev

ここでJavaがCよりも高速に実行されるのはなぜですか?

Related 関連記事

  1. 1

    「for」ループがループの本体よりも1回多く実行されるのはなぜですか?

  2. 2

    コードのこの部分が他の部分よりも先に実行されるのはなぜですか?

  3. 3

    このコードでCPUがGPUよりも高速に実行されるのはなぜですか?

  4. 4

    下にスクロールすると、numberOfRowInSectionの再実行値よりも多くのセルが表示されるのはなぜですか?

  5. 5

    DEBUGトラップが予想よりも多く実行されるのはなぜですか?

  6. 6

    関数でPythonコードがより速く実行されるのはなぜですか?

  7. 7

    関数でPythonコードがより速く実行されるのはなぜですか?

  8. 8

    同じコマンドを発行すると、pts / gnome-terminalよりもttyでより多くの出力が作成されるのはなぜですか?

  9. 9

    collections.Counterがソースコードを直接実行するよりも高速に実行されるのはなぜですか

  10. 10

    Openshiftがローカルで実行されている同じDockerコンテナーよりもはるかに多くのコンテナーメモリ使用量を報告するのはなぜですか?

  11. 11

    EclipseのPyDevPythonコンソールよりもEclipseコンソールの方がコードが高速に実行されるのはなぜですか?

  12. 12

    バイトコードがネイティブコードよりも高速に実行される可能性があるのはなぜですか

  13. 13

    clearTimeout後もSetTimeoutコードが実行されるのはなぜですか

  14. 14

    コマンドラインから実行したときに実行可能jarがEclipseから実行した同じプロジェクトよりもはるかに多くのRAMを使用するのはなぜですか?

  15. 15

    setImmediate()がシーケンシャルコードよりも高速に実行されるのはなぜですか?

  16. 16

    test1()がtest2()よりもはるかに高速に実行されるのはなぜですか?

  17. 17

    私のコードが数学よりも1つ多く出力するのはなぜですか?

  18. 18

    あるコンピューターでc ++コードが別のコンピューターよりも大幅に長く実行されるのはなぜですか?

  19. 19

    実行中または一時停止よりも多くのジョブが「開始」されているのはなぜですか?

  20. 20

    次のコードが正常にコンパイルおよび実行されるのはなぜですか?

  21. 21

    CPUよりも多くの同時スレッドを実行できるのはなぜですか?

  22. 22

    最初のループが常に2番目のループよりも速く実行されるのはなぜですか?

  23. 23

    ADOレコードセットが基になるAccessクエリよりも多くのレコードを返すのはなぜですか

  24. 24

    ロックされているコードの実行は、ロックされていないコードよりも時間がかかるはずです

  25. 25

    このコードが他のすべてのオプションよりもわずかに多くabcとdを生成するのはなぜですか?

  26. 26

    この操作がGPUよりもCPUで高速に実行されるのはなぜですか?

  27. 27

    JavaScriptなぜ一部のコードが残りのコードよりも先に実行されるのですか?

  28. 28

    malloc()が要求よりも多くのメモリを割り当てるのはなぜですか?Mac OS Xでmallocがこれを実行できないようにするにはどうすればよいですか?

  29. 29

    ここでJavaがCよりも高速に実行されるのはなぜですか?

ホットタグ

アーカイブ