2015-04-07 51 views
2

我需要編寫一個在比賽中用作馬的數組。每當用戶按下enter,馬將「運行」,或者陣列會向它們添加隨機數並更新它們的位置。控制檯在每次按下按鈕後都會打印其位置。比賽結束後我需要給第一名第二名和第三名匹配馬匹(馬匹達到15匹時)。我無法弄清楚如何做到這一點。從數組中拉出多個元素並專門給它們加上標籤

現在我正在通過數組進行搜索,如果數組的元素大於或等於15,我將它設置爲打印第一個地方的馬。我該如何做到這一點,以便打印第二和第三位作爲下一個最高位置(例如1st = 15,2nd = 13,3rd = 12)?

此外,看起來我的程序不會停止。如何在達到15或更高時停止它?謝謝!

import java.util.*; 
public class HorseRace2{ 
    public static void main(String[ ] arg){ 
    Scanner reader = new Scanner(System.in); 
    int range = 3; 
    int win = 15; 
    final int SIZE = 3; 
    Random ran = new Random(); 
    boolean winner = false; 
    int[ ] arrRan = new int[SIZE]; 


    System.out.print("Off to the races! Press enter to make the horses run."); 

    String readString = reader.nextLine(); 
    while(readString!=null){ 
     System.out.print(readString); 
     if(readString.equals("")){ 
     for(int i = 0; i<arrRan.length; i++){ 
      arrRan[i] = arrRan[i] + (ran.nextInt(3) + 1); 
      System.out.println("Horse " + (i+1) + ":" + arrRan[i]); 
     } 

     }//end if 

     if(reader.hasNextLine()){ 
     readString = reader.nextLine(); 
     System.out.println("Please press enter to make the horses run."); 
     } 
     for(int i = 0; i<arrRan.length; i++){ 
     if(arrRan[i]>=win){ 
      System.out.println("1st place: Horse " + (i+1)); 
     } 
     } 
    }//end while 


    }//close main 
}//close class 

回答

0

由於沒有違反條件readString != null,所以沒有停止。

爲了打印非第一位的馬,對數組進行排序並根據需要分配位置。

要停止,請嘗試用while(nobodyHasWon)替換while(readString != null)。製作一個布爾型boolean nobodyHasWon = true,並在馬匹獲勝時將其設置爲false(即在System.out.println("1st place: Horse " + (i+1));之後)。

或者,你可以這樣做:

// assumptions made: there is only one winner at 15, the rest are below 15, there are no ties, and the first ranked horse has been found 
int second, third, secondValue, thirdValue; 
secondValue = 0; thirdValue = 0; 
for(int i = 0; i < arrRan.length; i++) { 
    if(i != <indexOfFirstPlaceHorse>) 
    { 
    if(arrRan[ i ] > secondValue) { 
     second = i; 
     secondValue = arrRan[ i ]; 
    } 
    } 
} 
for(int i = 0; i < arrRan.length; i++) { 
    if(i != <indexOfFirstPlaceHorse> && i != second) { 
     if(arrRan[ i ] > thirdValue) { 
      third = i; 
      thirdValue = arrRan[ i ]; 
     } 
    } 
} 
+0

排數組後我怎麼得到它打印第一三匹馬? –

+0

由於您已經對陣列進行了排序,因此您現在可以對馬匹的進展進行排名。請記住,由於指數已被切換,所以馬匹的標籤將會混亂。 –

+0

我編輯了我的答案以提供一個粗略的解決方案。 –

0

試試這個我更新的代碼。

SEE DEMO

Scanner reader = new Scanner(System.in); 
    int range = 3; 
    int win = 15; 
    final int SIZE = 3; 
    Random ran = new Random(); 
    boolean winner = false; 
    int[ ] arrRan = new int[SIZE]; 


    System.out.print("Off to the races! Press enter to make the horses run."); 

    String readString = reader.nextLine(); 
    while(readString!=null){ 
     if(!winner){ 
      System.out.print(readString); 
      if(readString.equals("")){ 
      for(int i = 0; i<arrRan.length; i++){ 
       arrRan[i] = arrRan[i] + (ran.nextInt(3) + 1); 
       System.out.println("Horse " + (i+1) + ":" + arrRan[i]); 
      } 

      }//end if 

      for(int j = 0; j<arrRan.length; j++){ 
      if(arrRan[j]>=win){ 
       winner =true; 
       } 
      } 


      if(reader.hasNextLine()){ 
      readString = reader.nextLine(); 
      System.out.println("Please press enter to make the horses run."); 
      } 
     }else{ 
      int[] arrClone = new int[arrRan.length]; 
      for(int i=0;i<arrRan.length;i++){ 
       arrClone[i] = arrRan[i]; 
      } 

      arrRan = sortArray(arrRan); 
      int[] arrRank = new int[arrRan.length]; 
      int prevNum = arrRan.length; 

      for(int i=0;i<arrRan.length;i++){ 
       boolean flag = true; 
       for(int j=0;j<arrRan.length;j++){ 
        if(arrRan[i]==arrClone[j]){ 
         if(j!=prevNum && flag){ 
           prevNum = j; 
           arrRank[i] = j+1; 
           flag=false; 
         }          
        }         
       } 

      } 
      System.out.println("1st place: Horse " + (arrRank[0])); 
      System.out.println("2nd place: Horse " + (arrRank[1])); 
      System.out.println("3rd place: Horse " + (arrRank[2])); 
      break; 
     } 
    }//end while 

    } 
    public static int[] sortArray (int[] inArray) 
{ 

    //Construct the array we're using here 
    int[] newArray = inArray; 

    for(int x = 0; x < newArray.length; x++) //a.length = # of indices in the array 
    { 

     for(int y = 0; y < newArray.length; y++) 
     { 
      if(newArray[x] > newArray [y]) { 
       int tempValue = newArray[y]; 
       newArray[y] = newArray[x]; 
       newArray[x] = tempValue; 
      } 
     } 

    } 

    return newArray; 
} 
+0

嘿,這正是我所期待的。有一件事,控制檯打印第一名:馬15.我遇到的問題是它會打印馬的位置(15),而不是馬號(第一名:馬X)。 –

+0

明白了。試試那個。 – Discern

相關問題