当我运行程序时,输出只是连续的并且没有结束。这里的目标是尝试向左或向右移动+,然后打印哪一方赢了以及转了多少圈。
代码现在正在执行,但它只从中间向左和向右移动一个空格,这让我觉得它现在用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");
}
}
答案 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的索引,这是不正确的,因此实际上分别需要0
和ropeLength-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,那么你的代码什么都不做。由于您需要计算步数,因此需要将其中一个更改为if
或rand <= 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) != '+');
问题是你翻转硬币来移动绳子,绳索长度越大,你到达终点的机会就越小。