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

Java 涉及角色位置的do while循环有问题,java,loops,while-loop,do-while,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

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

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

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

而flag.charAt1!='+'||flag.charAtropeLength!='+'

而flag.charAt0!='+'&&flag.charAtropeLength!='+'

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


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

而flag.charAt1!='+'||flag.charAtropeLength!='+'

而flag.charAt0!='+'&&flag.charAtropeLength!='+'

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


在每次迭代开始时都不会重置标志

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

在每次迭代开始时都不会重置标志

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

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

一旦用对该方法的调用替换了三个打印方法,就应该更清楚地知道需要跟踪哪些内容并将其作为参数传递,以便使所有内容正常工作

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

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而不是一堆打印调用可能是个好主意,但我将把它作为练习留给读者。

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

一旦用对该方法的调用替换了三个打印方法,就应该更清楚地知道需要跟踪哪些内容并将其作为参数传递,以便使所有内容正常工作

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

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而不是一堆打印调用可能是个好主意,但我将把它作为练习留给读者。

代码中的逻辑存在多个问题

1在do-while循环中,您始终只是不断地附加到标志。这意味着,对于每一次迭代,你的标志只是变得更大,它实际上并没有移动你在那里拥有的+。您可以使用一个名为“nextState”的临时变量来生成下一个状态,然后在末尾将flag设置为等于该状态

代码:

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);
}  
4初始化标志=;但你只需要flag=;作为标志的空字符串仅包含-、和+

5 while flag.charAt0!='+'||flag.charatropelelength-1!='+';这是不正确的。它应该是&&因为您的原始语句将始终为真,循环将永远不会结束。只有在开头和结尾都有一个不可能的+时,你最初的陈述才会是错误的

6这不是一个真正的问题,但是如果你的if rand>0.5,你可以使用if-else而不是两个if。如果rand正好等于0.5,则代码不会执行任何操作。由于必须计算步骤,因此需要将其中一个步骤更改为rand=0.5,或者只使用if-else


一旦你解决了这些问题。你可以走了。非常努力

代码中的逻辑存在多个问题

1在do-while循环中,您始终只是不断地附加到标志。这意味着,对于每一次迭代,你的标志只是变得更大,它实际上并没有移动你在那里拥有的+。您可以使用一个名为“nextState”的临时变量来生成下一个状态,然后在末尾将flag设置为等于该状态

代码:

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);
}  
4初始化标志=;但你只需要flag=;作为标志的空字符串仅包含-,以及+

5 while flag.charAt0!='+'||flag.charatropelelength-1!='+';这是不正确的。它应该是&&因为您的原始语句将始终为真,循环将永远不会结束。只有在开头和结尾都有一个不可能的+时,你最初的陈述才会是错误的

6这不是一个真正的问题,但是如果你的if rand>0.5,你可以使用if-else而不是两个if。如果rand正好等于0.5,则代码不会执行任何操作。由于必须计算步骤,因此需要将其中一个步骤更改为rand=0.5,或者只使用if-else


一旦你解决了这些问题。你可以走了。非常努力

如前所述,以下各项将起作用

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

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

如前所述,下面的方法可以奏效

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


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

连续输出是什么样子?---+----+---+----等等连续输出是什么样子的?---+----+----等等,但是现在+只是不断地向左右移动1个空间。谢谢你——+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--hm没有像我想的那样。所有这些都是相互叠加的,虽然这是好的。现在唯一的问题是它不再向左或向右移动,只是停留在那些2上。我不认为这个循环实际上是将它们向右或向左移动。重复将“+”设置在中点的左侧或右侧,但每次都是相同的位置。您需要跟踪“+”的最后一个位置所在的位置,然后根据该位置将其向左/向右移动。既然您已经跟踪了flagpos,那么在flagpos!=1和&flagpos!=ropeLength并使用构造的标志仅用于输出。虽然不是真的错,但我相信第一个for在语义上会更好,因为i=1;i