2016-04-03 84 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'標籤下的代碼也會被運行。當然,只有你不打算這樣做。 –