2016-04-03 11 views
1

私は水平コースに沿って亀と兎を競うオブジェクト指向プログラミングを使ってプロジェクトをやっています。私はアプレットとスイングを使用して他のバージョンを見てきましたが、私はまだそれらに導入されていないので、私はよりシンプルなグラフィックスで滞在することを好むでしょう。Hare Tortoise Race視覚的表示

各動物には、その時間のx%の動きがあります(後で詳しく説明します)。 BigHip() - 右に9つの正方形を移動する、SmallHop() - 右に1つ、RightSizeをBigSlip() - 左に12個、SmallSlip()に四角いままにする、FallAsleep() - 全く活動していない。今では、 "最も左の"位置は1ですので、もし6番の広場であれば大きなスリップは1に戻ってしまいます。(-6ではない)

亀にとっては、 :FastPlod() - 3つの正方形、SlowPlod() - 1つの正方形、Slip() - 6つの四角形、スリップに同じルールを適用したもの。

これまでのプログラムは、Hareクラス、Tortoiseクラス、および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; 
        } 
       } 
      } 
     } 

ロジック自体が動作します。レースが構築される方法は、トラックに50のスペースがあることです(トラック自体はグラフィカルに構築されていませんが、これは私が抱える問題です)。各動物の動きは、switch構成を使用してランダムに実行されます。たとえば、時間の30%、タートルはSlowPlod()になります。

スリップが非常に多いために実行するにはしばらく時間がかかりますが、最終的に私は勝者(通常はカメ)を得ます。したがって、ロジック自体は機能します。

しかし、今これは私が表示されるだけ出力されます:これは、数百人のすべてがなく、もちろんです

AND THEY'RE OFF!! TORTOISE WINS!!

「OUCH !!」 2つの動物が同じ位置を共有するときに起こる。だから私は50のスペースのトラックに2つの動物の位置を表示できるようにしたい。私はそれぞれのスペースとして '_'を使用することを考えましたが、私はカメやウサギの動きをどのようにコードするかはわかりません。

例えば、可能な出力は次のようになります:

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

OUCH!!

私はちょうどそのようなトラックとコードTの動きを構築するかどうかはわかりませんし、 the

私は何か助けていただきありがとうございます。

+0

大文字と小文字の区別が間違っている場合は申し訳ありません。 Javaにはまだまだ新しいものです。 – LightFlicker

答えて

1

これは、決定/繰り返し構造のprint文を使用して行うことができます。可能な位置をループすることができます。動物がその位置にある場合は、適切な文字を印刷します。そうでない場合はアンダースコアを印刷します。

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() 

上記のコードはTortoiseの進捗状況を表示します。兎の場合は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

あなたがあなたのswitchbreak;年代を逃したようです。

 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という名前のインターフェイスを作成し、Playerから継承されるクラスHareTortoiseを変更する必要があります。

public abstract class Player { 
    protected int position; 

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

    public int getPosition(){ 
     return position; 
    } 
} 
変更 Hare

Tortoiseswitch

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

毎回ループを壊してしまえば、プログラムは役に立たなくなりますよね?なぜなら動物の1つが50に達するまでそれを実行し続ける必要があるからです。私がそれを毎回壊すと、動物1つにつき1つの動きしかありません。 – LightFlicker

+0

breakはswitch文のためのものです。あなたが壊れていなければ、あなたが望むものの下のあなたのコード内のケースのすべてのステートメントも実行されます。だから、今、兎は眠りに落ちており、あなたが望むものではない他の多くの行動とともに、すべての動き(ケース10)で滑っています。 – BradzTech

+0

実際に 'switch'の中の' break'キーワードはループを壊さない。それは 'switch'から壊れます。別の 'case'ラベルの前に' break'キーワードを使用する必要があります。そうでなければ、他の 'case'ラベルの下のコードも実行されます。もちろん、あなたがそれを意図していない場合に限ります。 –

関連する問題