1

プログラムを実行すると、出力は継続的で終了しません。ここでの目標は、+ を左または右にずらしてみて、どちらが勝ったか、何ターンかかったかを出力することです。

コードは現在実行されていますが、中央から左右に 1 スペースしか移動していないため、for ループが使用されていると思われます。

package test;

import java.util.Scanner;
import java.lang.Math;

public class Test {

    public static int MAX_LENGTH = 21;
    public static int MIN_LENGTH = 5;

    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        System.out.print("Enter the length of the rope: ");
        int ropeLength = keyboard.nextInt();
        while (ropeLength < MIN_LENGTH || ropeLength > MAX_LENGTH || ropeLength % 2 != 1) {
            System.out.println("Thats not a valid length (odd number between 5 and 21)");
            System.out.print("Enter the length of the rope: ");
            ropeLength = keyboard.nextInt();
        }
        char a;
        String flag = " ";
        for (int i = 0; i < ropeLength / 2; i += 1) {
            flag += "-";
        }
        flag += "+";

        for (int i = 0; i < ropeLength / 2; i += 1) {
            flag += "-";
        }
        System.out.println("");


        do {
            flag = "";
            double rand = Math.random();
            int i;
            if (rand > 0.5) {

                for (i = 0; i < (ropeLength / 2) - 1; i++) {
                    flag += "-";
                    }

                flag += "+";

                for (i = 0; i < (ropeLength / 2) + 1; i++) {
                    flag += "-";
                }
                System.out.println( flag );
            }
            if (rand < 0.5) {

                for (i = 0; i < (ropeLength / 2) + 1; i++) {
                    flag += "-";
                    }

                flag += "+";

                for (i = 0; i < (ropeLength / 2) - 1; i++) {
                    flag += "-";
                   }
                   System.out.println( flag );
                } 

        } while (flag.charAt(1) != '+' || flag.charAt(ropeLength) != '+');

        if (flag.charAt(0) == '+') {
            System.out.println("\nLeft side wins!");
        }
        else {
            System.out.println("\nRight side wins!");
        }    
        System.out.println("It took steps");
    }
}
4

5 に答える 5

2

コードのロジックには複数の問題があります。

1)do-whileループでは、常にフラグに追加し続けます。これは、反復ごとにフラグが大きくなるだけで、実際に+そこにあるフラグが移動しないことを意味します。'nextState'という一時変数を使用して次の状態を生成し、最後にそれに等しいフラグを設定できます。

コード:

String nextState = "";
if (rand > 0.5) {
    for (i = 0; i < (ropeLength / 2) - 1; i++) {
        nextState += "-";
    }
    nextState += "+";
    for (i = 0; i < (ropeLength / 2) + 1; i++) {
        nextState += "-";
    }
    flag = nextState;
    System.out.println(flag);
}  

2)とを確認flag.charAt(1)=='+'していflag.charAt(ropeLength)=='+'ます。配列には0ベースのインデックスがあるため、これは正しくありません。実際には0、とがropeLength-1それぞれ必要です。(do-whileループの下で正しく実行したことに注意してください)。

03)do-whileループの問題は、エラー1と2を修正すると、+が確実に左と右に移動することですが、位置(左端まで)に移動することはできません。)またはropeLength-1現在のロジックで(完全に正しい)位置付けます。このようなことを行うことができ、他の場合も同様に行うことができます。

if (rand > 0.5) {
  i = 0;
  while (i + 1 < flag.length() && flag.charAt(i + 1) != '+') {
    nextState += "-";
    i++;
  }
  nextState += "+";
  i++;
  while (i < flag.length()) {
    nextState += "-";
    i++;
  }
  flag = nextState;
}

4)初期化しますが、フラグには'sと。のみが含まれるため、(空の文字列)flag = " ";が必要です。flag = "";-+

5)while (flag.charAt(0) != '+' || flag.charAt(ropeLength - 1) != '+');正しくありません。元のステートメントは常に&&真であり、ループは決して終了しないためです。+最初と最後に不可能ながある場合にのみ、元のステートメントは誤りになります。

6)実際には問題ではありませんが、if (rand > 0.5)2つの'の代わりにif-elseを使用することもできますif。randが正確に0.5に等しい場合、コードは何もしません。ステップを数える必要があるため、そのうちの1つを変更するrand <= 0.5rand >= 0.5、if-elseを使用する必要があります。

これらの問題を修正したら。準備できた。大変な努力を!

于 2013-03-16T04:27:10.460 に答える
2

旗の位置に注意が必要です。現在、フラグを中央の左または右に 1 つだけ配置します。フラグ印刷メソッドをヘルパー メソッドにプルして、読みやすくし、何を追跡する必要があるかを明確にすることができます。

3 つの印刷メソッドをこのメソッドの呼び出しに置き換えると、すべてを機能させるために何を追跡してパラメーターとして渡す必要があるかが明確になります。

このようなものから始める必要があります:

public static void printFlag(int ropeLength, int flagPosition) {
    for (int i = 0; i < flagPosition; i += 1) {
        System.out.print("-");
    }
    System.out.print("+");

    for (int i = flagPosition + 1; i < ropeLength; i += 1) {
        System.out.print("-");
    }
    System.out.println();
}

注:StringBuilder一連の呼び出しの代わりに aを使用することprint()はおそらく良い考えですが、それは読者の演習として残しておきます。

于 2013-03-16T04:17:35.887 に答える
1

最後の行を次のように変更する必要があります。

while (flag.charAt(1) != '+' || flag.charAt(ropeLength) != '+');

while (flag.charAt(0) != '+' && flag.charAt(ropeLength) != '+');

Using||は、これらの条件の 1 つだけが真である必要があることを意味し、while ループを使用しているため、最初の位置が等しくない場合、+または最後の位置が等しくない場合+、ループを続行する必要があると言っています。 .


于 2013-03-16T04:12:38.120 に答える
1

各反復の開始時にフラグをリセットすることはありません

knoightが言うように、 && 演算子が必要です

次のようなものが必要です:

do {
flag = "";
... your existing code

 } while ( (flag.charAt(1) != '+') && (flag.charAt(ropeLength) != '+') );

上記で提案した修正により、フラグがランダムに飛び回るようです。おそらく、反復ごとにフラグを左または右に 1 つずつ移動したいだけでしょうか?

あなたはこのようにすることができます:

int flagpos = (ropeLength / 2)+1;
do {
    flag = "";
    double rand = Math.random();
    int i;
    if (rand > 0.5) {
        flagpos++;
    else
        flagpos--;
    for (i = 0; i < flagpos - 1; i++) 
        flag += "-";
    flag += "+";
    for (i = flagpos + 1; i < ropeLength ; i++) 
        flag += "-";

        System.out.println( flag );
    } while (flag.charAt(1) != '+' || flag.charAt(ropeLength) != '+');
于 2013-03-16T04:12:45.803 に答える
0

前に述べたように、以下は機能します。

    do {
       flag = "";
       //do stuff
    } while (flag.charAt(1) != '+' && flag.charAt(ropeLength-1) != '+');

問題は、コインを投げてロープを動かすことです。ロープの長さが長いほど、最後に到達する可能性が低くなります。

于 2013-03-16T04:35:18.260 に答える