0

だから私は誰かがデッキからカードを引くプログラムを書いています。そこで、ランダムに作成されたカードが 4 枚以上引かれているかどうかをループしてチェックし、ある場合はカードを変更する while ループを作成しました。

ここに私のコードがあります:

String card = (int)Math.ceil(Math.random() * 13) + " ";
String[] used2 = used.split(" ");
//used is a String like "12 3 7 8 4 ... # etc" such that it is all the previously drawn cards.
boolean checking = true;
boolean isIn = false;
int in = 0;
int check = 0;
while(checking){
    for(int q = 0; q < used2.length; q++){
        check += 1;
        if(card.equals(used2[q] + " ")){
            in += 1;
            if(in == 4){
                System.out.println(check); //debugging line
                check += 1;
                card = (int)Math.ceil(Math.random() * 13) + " ";
                card_val = (int)Math.ceil(Math.random() * 13);
                isIn = true;
                in = 0;
                break;
            }
        }
    }
    if(isIn){
        //will execute if there is 4 of the cards already drawn so the while loop continues with a different card
        checking = true;
    }
    else{
        //breaks out of while loop because the card can be drawn
        checking = false;
    }
}
used += card;

これで実行されますが、for ループ内に配置して 40 回実行するように設定すると、約 2/3 回で無限ループが作成されます。

if(in == 4)ステートメントが真であることが判明した場合にのみ、無限ループが作成されることを発見しました。

どうしてこれなの?昨夜からデバッグを行っていますが、これを理解できません。

4

2 に答える 2

6

に設定isInするとtrue、 に戻すことはできませんfalse。そのifため、一番下のステートメントは に設定checkingされたままtrueになり、無限ループが発生します。

ループの最初に設定isInします。falsewhile

while(checking){
    isIn = false;  // Add this line.
    for(int q = 0; q < used2.length; q++){
于 2013-09-23T20:23:44.953 に答える
0

単純なタスクのための複雑なアルゴリズムのようです。

単純な減算を使用するように実装を変更してみませんか? 最初に 52 個すべての値を割り当てList、次にデッキからカードを「引く」ときにリストから削除します。

次にMath.random() * list.size()、適切な範囲のインデックスを取得するために使用できますか?

于 2013-09-23T20:27:51.550 に答える