我的do-while循环涉及角色位置有问题

时间:2013-03-16 04:03:44

标签: java loops while-loop do-while

当我运行程序时,输出只是连续的并且没有结束。这里的目标是尝试向左或向右移动+,然后打印哪一方赢了以及转了多少圈。

代码现在正在执行,但它只从中间向左和向右移动一个空格,这让我觉得它现在用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");
    }
}

5 个答案:

答案 0 :(得分: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();
}

注意:使用StringBuilder代替一堆print()来电可能是一个好主意,但我会将其作为练习留给读者。

答案 1 :(得分: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,你肯定会将+向左和向右移动,但是你永远不能将它移动到位置{{使用当前逻辑1}}(一直向左)或位置0(一直向右)。这样的事情可以做到,你也可以为其他人做同样的事情。

ropeLength-1

4)您初始化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; } ,但您只想flag = " ";(空字符串),因为标记只包含flag = "";-

5)+不正确。它应该是while (flag.charAt(0) != '+' || flag.charAt(ropeLength - 1) != '+');,因为你的原始陈述总是正确的,循环永远不会结束。如果在开始时有一个&&,那么你的原始陈述只会是假的,而这是不可能的。

6)不是真正的问题,但使用+你可以使用if-else代替两个if (rand > 0.5)。如果rand完全等于0.5,那么你的代码什么都不做。由于您需要计算步数,因此需要将其中一个更改为ifrand <= 0.5,或者只使用if-else。

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

答案 2 :(得分:1)

您需要更改最后一行:

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

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

使用||意味着只有其中一个条件必须为真,并且因为你正在使用while循环,所以你说如果第一个位置不等于+或者最后一个位置不等于+,那么你希望循环继续。


答案 3 :(得分:1)

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

你需要和&amp;&amp;作为知识的运营商说

你需要这样的东西:

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) != '+');

答案 4 :(得分:0)

如前所述,以下内容将有效。

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

问题是你翻转硬币来移动绳子,绳索长度越大,你到达终点的机会就越小。