2013-03-16 22 views
1

当我运行程序时,输出只是连续的,并没有结束。这里的目标是尝试将所有的方式向左或向右移动,然后打印赢得哪方以及转多少回合。我的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"); 
    } 
} 
+2

连续输出是什么样的? – 2013-03-16 04:09:05

+0

---- + --------- + -------- + ----等 – tawnpawt 2013-03-16 04:11:58

回答

1

您需要更改的最后一行,从向左或向右移动一个空间:

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

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

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


+0

是啊,试过,没有运气同样的东西 – tawnpawt 2013-03-16 04:14:27

+0

线程“main”java.lang中的异常。的StringIndexOutOfBoundsException:字符串索引超出范围:9 \t在java.lang.String.charAt(String.java:695) \t在test.Test.main(Test.java:67) Java结果:1 – tawnpawt 2013-03-16 04:18:04

+0

67是而陈述 – tawnpawt 2013-03-16 04:18:22

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

确定工作,但现在+只是来回连续左右移动1个空间。谢谢 – tawnpawt 2013-03-16 04:16:20

+0

我错过了国旗部分,谢谢指出, – knoight 2013-03-16 04:17:03

+0

它漂流到正确的每一次? – Tucker 2013-03-16 04:17:40

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()电话可能是一个不错的主意,但我会离开,作为一个练习留给读者。

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 (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 = "";(空字符串)作为标志只包含-的和+

5)while (flag.charAt(0) != '+' || flag.charAt(ropeLength - 1) != '+');不正确。它的意思是&&,因为你原来的陈述将永远是真实的,循环将永远不会结束。你的原始陈述只有在开始时有+而且最后不可能的时候才会是假的。

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

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

+0

这就是关闭,但即时得到一个错误在while循环再次 – tawnpawt 2013-03-16 04:39:52

+0

我需要纳入卡梅伦的东西到这个答案。我做了= 5的长度,我没有注意到你也错误地移动了'+'。我正在修复它。 – Sanchit 2013-03-16 04:40:48

+0

线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1 – tawnpawt 2013-03-16 04:41:14

0

如前所述,以下将工作。

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

问题是你翻动一枚硬币来移动绳索,而绳索的长度越大,你的机会就越小。