2016-04-03 78 views
1

我正在做一个项目使用面向对象的编程,我沿着一个水平球场比赛乌龟和野兔。我见过其他版本使用小程序和swing,但我还没有被介绍给那些,所以我宁愿留在更简单的图形。野兔乌龟种族视觉显示

每只动物都有一组动作发生在百分之x的时间(稍后我会详细说明)。对于野兔,有五种方法:BigHop() - 向右移动9个方块,SmallHop() - 向右移动1个方块,BigSlip() - 向左移动12个方块,SmallSlip() - 剩下2个方块和FallAsleep() - 根本没有活动。现在,“最左边”的位置是1,所以如果兔子在第6平方米,大滑动仍然只会回到1.(不是-6)

对于乌龟,有三种方法:FastPlod() - 右边3个方格,SlowPlod() - 右边1个方格,以及Slip() - 同样的规则适用于单据,剩下6个方格。

到目前为止,该计划包含野兔类,龟类和Race类。

这里是野兔类:

public class Hare { 
     private int position; 

     public void setPosition(int s){ 
      position = s; 
     } 

     public int getPosition(){ 
      return position; 
     } 

     public void BigHop(){ 
      position += 9; 
     } 

     public void SmallHop(){ 
      position += 1; 
     } 

     public void BigSlip(){ 
      if (position > 12){ 
       position -= 12; 
      } 
      else{ 
       position = 1; 
      } 
     } 

     public void SmallSlip(){ 
      if (position > 2){ 
       position -= 2; 
      } 
      else{ 
       position = 1; 
      } 
     } 

     public void FallAsleep(){ 
      position = position; 
     } 
    } 

乌龟类:

public class Tortoise { 
    private int position; 

    public void setPosition(int s){ 
     position = s; 
    } 

    public int getPosition(){ 
     return position; 
    } 

    public void FastPlod(){ 
     position += 3; 
    } 

    public void SlowPlod(){ 
     position += 1; 
    } 


    public void Slip(){ 
     if (position > 6){ 
      position -= 6; 
     } 
     else{ 
      position = 1; 
     } 
    } 
} 

比赛类实际上执行了比赛。

public class Race { 
    public static void main(String[] args){ 
     Hare myHare = new Hare(); 
     Tortoise myTortoise = new Tortoise(); 

     myHare.setPosition(1); 
     myTortoise.setPosition(1); 

     System.out.println("AND THEY'RE OFF!!"); 

     while (myHare.getPosition() > 0){ 
      int n = (int)(Math.random()*10); 
      switch (n){ 
       case 1: 
        myHare.BigHop(); 
        myTortoise.FastPlod(); 
       case 2: 
        myHare.BigHop(); 
        myTortoise.FastPlod(); 
       case 3: 
        myHare.SmallHop(); 
        myTortoise.FastPlod(); 
       case 4: 
        myHare.SmallHop(); 
        myTortoise.FastPlod(); 
       case 5: 
        myHare.SmallHop(); 
        myTortoise.FastPlod(); 
       case 6: 
        myHare.BigSlip(); 
        myTortoise.SlowPlod(); 
       case 7: 
        myHare.SmallSlip(); 
        myTortoise.SlowPlod(); 
       case 8: 
        myHare.SmallSlip(); 
        myTortoise.SlowPlod(); 
       case 9: 
        myHare.FallAsleep(); 
        myTortoise.Slip(); 
       case 10: 
        myHare.FallAsleep(); 
        myTortoise.Slip(); 
      } 
      if (myHare.getPosition() == myTortoise.getPosition()){ 
       System.out.println("OUCH!!"); 
      } 
      if (myHare.getPosition() == 50 | myTortoise.getPosition() == 50){ 
       if (myHare.getPosition() == 50){ 
        System.out.println("HARE WINS!!"); 
        break; 
       } 
       else{ 
        if (myHare.getPosition() == myTortoise.getPosition()){ 
         System.out.println("IT'S A TIE!!"); 
         break; 
        } 
        else{ 
         System.out.println("TORTOISE WINS!!"); 
         break; 
        } 
       } 
      } 
     } 

该逻辑本身的作品。比赛的方式是在赛道上有五十个空间(赛道本身没有图形化,这是我遇到的麻烦)。每个动物的动作都是使用switch构造随机执行的。例如,30%的时间,乌龟会SlowPlod()。

仅仅因为有这么多的滑倒,我们需要一段时间才能跑步,但最终我会得到一个胜利者(通常是乌龟)。所以,逻辑本身起作用。

但是,现在这是我显示只能输出:

AND THEY'RE OFF!! TORTOISE WINS!!

这是当然的,没有所有的数百个“哎哟!”当这两只动物分享相同的位置时发生。所以我希望能够在50个空间的轨道上显示两个动物的位置。我曾想过在每个空间都使用'_',但我不确定如何编码乌龟或野兔的运动。

例如,一个可能的输出会是这样的:

_ _ _ _ _ _ _ _ T _ _ _ _ _ _ _ _ _ _ _ H _ _ _

OUCH!!

我只是不知道如何构建一个这样的跟踪和码T的移动和H.

我会很感激任何帮助。

+0

对不起,如果我的大写弄乱了突出显示。对Java仍然陌生。 – LightFlicker

回答

1

您可以在决策/重复结构中使用打印语句来执行此操作。您可以遍历每个可能的位置,如果动物处于该位置,则打印相应的字母,否则打印下划线。

for (int i = 1; i <= maxPos; i++) { 
    if (i == myTortoise.getPosition()) 
     System.out.print("T") 
    else 
     System.out.print("_") 
    System.out.print(" ") 
} 
System.out.println() 

上面的代码会打印龟的进度;替代野兔的myHare"H"。将此代码插入while循环的顶部或底部,以便在每次移动后打印进度。

+0

谢谢!这看起来不错。如果我在底部插入它,我将不得不在顶部插入一个初始迭代? – LightFlicker

+0

是的。一个更好的解决方案是将它放在一个函数'private static void printProgress'中,并在循环之前和循环结束时调用它。 – BradzTech

+0

听起来不错。谢谢 – LightFlicker

1

如果您不想使用Swing或某种图形界面,您唯一可以做的就是一遍又一遍地打印位置。但是这当然会给你的控制台带来麻烦。

假设你不介意您的控制台得到垃圾邮件,你可以做这样的事情:

public static void main(String[] args){ 
    printPositions(3, 3, 10); 
} 

public static void printPositions(int hare, int tortoise, int totalTrackLenght){ 
    //print the position of hare 
    for(int i = 1; i < hare; i++){//print leading empty spaces 
     System.out.print("_ "); 
    } 
    System.out.print("H ");//print hare 
    for(int i = hare; i < totalTrackLenght; i++){//print trailing empty spaces 
     System.out.print("_ "); 
    } 
    //print the postion of tortoise in a similar way 
    System.out.println();//remember to start on a new line 
    for(int i = 1; i < tortoise; i++){//print leading empty spaces 
     System.out.print("_ "); 
    } 
    System.out.print("T ");//print tortoise 
    for(int i = tortoise; i < totalTrackLenght; i++){//print trailing empty spaces 
     System.out.print("_ "); 
    } 
    System.out.println();//finish the line 
    if(hare == tortoise){//Are they in the same spot? 
     System.out.println("OUCH!"); 
    } 
} 

这种方法可以从每一帧的“主循环”被调用。

我希望这有助于:)

+0

谢谢!我会尝试这个,看看会发生什么。 – LightFlicker

+0

不客气,祝你好运:) – Roan

2

看来你在switch错过了break;的。

 switch (n) { 
      case 1: 
       myHare.BigHop(); 
       myTortoise.FastPlod(); 
       break; 
      case 2: 
       myHare.BigHop(); 
       myTortoise.FastPlod(); 
       break; 
      ... 
      } 

您将需要在Race类中编写另一种方法。

private static void printTrack(Player player, char symbol) { 
    int position = player.getPosition(); 
    for (int i = 0; i < position; i++) 
     System.out.print('_'); 

    System.out.print(symbol); 

    for (int i = position + 1; i < 50; i++) 
     System.out.print('_'); 

    System.out.println(); 
} 

但在这之前,你需要做一个(抽象)类或命名Player接口,并修改HareTortoisePlayer继承的类。

public abstract class Player { 
    protected int position; 

    public void setPosition(int s){ 
     position = s; 
    } 

    public int getPosition(){ 
     return position; 
    } 
} 

修改HareTortoiseswitch

public class Hare extends Player { 
    /* 
    private int position; 

    public void setPosition(int s){ 
     position = s; 
    } 

    public int getPosition(){ 
     return position; 
    } 
    */ 
    // The rest should be the same 
    // Do the same with the class "Tortoise" 
    ... 
} 

右键,就可以调用该方法。

 switch (n) { 
      ... 
     } 
     printTrack(myHare, 'H'); 
     printTrack(myTortoise, 'T'); 
     ... 

而且在您的代码中有一个|运算符。您需要将其替换为||

看看是否有效。

+0

如果我每次都打断循环,那么程序就变得没用了,对吧?因为我需要继续运行,直到其中一只动物达到50只。如果每次都打破它,那么每只动物只有一次动作。 – LightFlicker

+0

中断是针对switch语句的。如果你没有中断,那么你的代码中的每个语句都会被执行。所以,现在,野兔正在睡着,乌龟一举一动(案例10),以及其他一些行为,这不是你想要的。 – BradzTech

+0

其实'switch'中的'break'关键字不会打破循环。它脱离了'switch'。您需要在另一个'case'标签之前使用'break'关键字,否则其他'case'标签下的代码也会被运行。当然,只有你不打算这样做。 –