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 的索引,这是不正确的,您实际上需要0ropeLength-1。(我确实注意到您在 do-while 循环下正确地做到了)。

3) do-while 循环的问题是,如果您更正错误 1 ​​和 2,您肯定会将 + 向左和向右移动,但是您永远无法将它移动到位置0(一直向左) 或使用您当前的逻辑定位ropeLength-1(一直向右)。可以做这样的事情,你也可以为另一个 if 做类似的事情。

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)您初始化flag = " ";但您只想要flag = "";(一个空字符串),因为标志只包含-'s 和 a +

5)while (flag.charAt(0) != '+' || flag.charAt(ropeLength - 1) != '+');不正确。这应该是&&因为您的原始陈述总是正确的,并且循环永远不会结束。+只有在开头和结尾都有一个不可能的情况下,您的原始陈述才会是错误的。

6)不是真正的问题,但if (rand > 0.5)你可以使用 if-else 而不是 two if。如果 rand 正好等于 0.5,你的代码什么也不做。由于您必须计算步骤,因此您需要将其中一个更改为rand <= 0.5rand >= 0.5仅使用 if-else。

一旦你解决了这些问题。你已准备好出发。很努力!

于 2013-03-16T04:27:10.460 回答
2

您需要注意标志的位置。目前,您只将标志放在中心左侧或右侧的一个位置。您可能希望将标志打印方法拉入辅助方法中,以简化可读性并更清楚地了解您需要跟踪的内容。

一旦你用调用这个方法替换了你的三个打印方法,你应该更清楚你需要跟踪什么并作为参数传递,以使一切正常。

这样的事情应该让你开始:

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();
}

注意:使用 aStringBuilder而不是一堆print()调用可能是个好主意,但我将把它作为练习留给读者。

于 2013-03-16T04:17:35.887 回答
1

您需要更改最后一行,从:

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

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

使用||意味着只有一个条件必须为真,并且由于您使用的是 while 循环,因此您是说如果第一个位置不等于+或最后一个位置不等于,+那么您希望循环继续.


于 2013-03-16T04:12:38.120 回答
1

你永远不会在每次迭代开始时重置你的标志

正如 knoight 所说,你需要 && 运算符

你需要类似的东西:

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

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

看起来你的旗帜会随着我上面提出的修复随机跳动。也许您只想在每次迭代中将标志向左或向右移动一个位置?

你可以这样做:

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 回答