Java 涉及角色位置的do while循环有问题
当我运行程序时,输出只是连续的,没有结束。这里的目标是尝试将+一直移到左侧或右侧,然后打印哪一方获胜以及转了多少圈 代码现在正在执行,但它只从中间向左和向右移动了一个空间,这让我觉得现在是for循环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
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