3

私はシュートとはしごのゲームに取り組んでいる学生です。ゲームボードに配置するシュートとはしごの数を決定する方法を使用しています。パラメータを使用してメインでそれぞれ 10 を指定していますが、全体的に 6 から 11 の範囲で配置され続けています。

互いに干渉する 2 つの方法で何かが起こっていますか?

または、for ループをランダムに配置するように設定する方法に問題がありますか?

私はこのサイトを初めて使用します。さらに説明が必要な場合はお知らせください。プログラム全体をここに掲載したくありませんでした。ありがとう。

//main
                  ChutesAndLadders cl = new ChutesAndLadders();
                  cl.setBoard(new String[100]);
                  cl.makeChutes(10);
                  cl.makeLadders(10);

//methods
            public String [] board;
            private int chutes, ladders;
            public int position;
            public Random rand = new Random();


        //set board
                    public void setBoard(String [] n){
                        board = n;
                        for(int i = 0; i < board.length; i++)
                            board[i] = "   ";
                    }
        //set and place chutes
                    public void makeChutes(int n){
                        chutes = n;
                        for(int i = 0; i <= chutes; i++)                    
                            board[rand.nextInt(board.length)] = "C" + chutes;

                    }
        //set and place ladders
                    public void makeLadders(int n){
                        ladders = n;
                            int lcell = 0; 
                        for(int i = 0; i <= ladders; i++)
                                 board[rand.nextInt(board.length)] = "L" + ladders;
4

3 に答える 3

6

まず、あなたは次のように書いています。

for(int i = 0; i <= chutes; i++)                    
    board[rand.nextInt(board.length)] = "C" + chutes;

ループ内の割り当てステートメントは chutes+1 回実行されます。(あなたの場合は 11 回です。) [i < chutes代わりに使用してください。] これはラダー コードでも同じです。これは、コードの実行が完了すると、最大 11 個のシュートまたははしごが必要になる理由を説明しています。

第二に、同じスペースにシュートやはしごが複数回割り当てられるのを防ぐように注意していません。 rand.nextInt(board.length)は、実行されるたびに一意の値を生成することが保証されていません (そうでなければ、実際にはランダムではありません)。これが、コードの実行が完了したときに 11 個ものシュートとはしごが表示されない理由を説明しています。

これを明確にするために、そこに定数値を入れます。

for(int i = 0; i < chutes; i++)                    
    board[11] = "C" + chutes;

はしごコードがはしごでそれを上書きしない限り、最終的に 1 つのシュート (スペース 11) になることに注意してください。

それが役立つことを願っています。

幸運を!

于 2013-01-29T20:42:15.660 に答える
2

一見したところ、エントリが重複しているように見えます。ランダムな配置を生成し、そこにシュートやはしごが既にあるかどうかを確認しないため、オーバーラップが発生する可能性があります。

ランダムな位置を生成し、配置する前にそこに何かがあるかどうかを確認するのはかなり簡単です。衝突が見つかった場合は、別のランダムを生成し、配置できるまで繰り返します。

また、余談ですが、for ループと if ステートメントを中かっこなしで使用しないようにすることをお勧めします。ブロックに 2 番目の like を追加するのは非常に簡単で、なぜブロックの一部として実行されないのか疑問に思います。

于 2013-01-29T20:35:09.770 に答える
1

forループには包括的な上限チェックがあり、0 .. 1011個のエントリが生成されます。

マイクが言ったように、結果の数が少ないのは衝突によるものです。ボードに必要な要素を入力してボードをセットアップし、ボードをシャッフルして最終結果を取得することで、衝突を防ぐことができます。

public void setupBoard(String [] n, int nrLadders, int nrChutes){
    board = n;
    int index = 0;

    while (index < board.length && 0 < nrLadders--) {
        board[index++] = "L" + nrLadders;
    }

    while (index < board.length && 0 < nrChutes--) {
        board[index++] = "C" + nrChutes;
    }

    while (index < board.length) {
        board[index++] = "   ";
    }

    board = Collections.shuffle(Arrays.asList(board)).toArray(new String[board.length]);
}

これは、多数のラダーカード、多数のシュートカード、多数の空のスポットカードを含むカードのデッキを作成し、そのデッキをシャッフルしてゲームボードを取得するようなものです。

于 2013-01-29T20:57:19.307 に答える