2014-10-10 30 views
1

我的目標是通過一個循環運行不同的方法,每次通過循環

each_score = ones(dice_values); 
total_score += each_score; 
end_scores += String.valueOf(each_score) + " "; 

其次

each_score = twos(dice_values); 
total_score += each_score; 
end_scores += String.valueOf(each_score) + " "; 

唯一的區別是在方法運行此代碼以減少代碼第一行。我不知道通過類似於for循環的方式來做這樣的事情,而不是複製代碼13次的粘貼。 (如果可能的話,我也希望能找到比開關盒更高效的東西)

private static int ones(int[] dice_values) { 
    int ones = 0; 
    for(int i = 0; i < 5; i++) 
     if(dice_values[i] == 1) 
      ones++;  
    return ones; 
} 

private static int fours(int[] dice_values) { 
    int fours = 0; 
    for(int i = 0; i < 5; i++) 
     if(dice_values[i] == 4) 
      fours++;   
    return (fours * 4); 
} 


private static int five_of_kind(int[] dice_values) { 
    int five_kind = 0; 
    int[] five_of = new int[5]; 
    for(int i = 0; i < 5; i++) 
     five_of[dice_values[i] - 1]++; 

    if(Arrays.asList(five_of).contains(5)) 
     five_kind = 50; 
    return five_kind; 
} 

這是一個方法的例子。我正在解決一個叫Yahtzee的簡單問題。給定一組5個骰子的13卷,找到所有卷的總得分和每種類型得分的總數(例如,點數是「一個:多少個」或「一種五個」)。

+0

是什麼的人(的目的),三三兩兩()等方法?如果它們提供類似的目的,你可以創建一個通用的功能與參數1,2,等 – user2910265 2014-10-10 03:07:54

+1

我可以結合的方法,第6這樣做,但也有其他人(一種4,短直,長直,滿屋子等),我不能 – 2014-10-10 03:33:32

回答

1

你可以使用反射對於這種情況,

string[] methodNames = new string{}["ones","twos",....]; 
for(string method : methodNames) 
{ 
    Method method = this.getClass().getMethod(dice_values.getClass()); 
    each_score = method.Invoke(this,dice_values); 
    total_score += each_score; 
    end_scores += String.valueOf(each_score) + " "; 
} 
+0

啊,我真的很喜歡這個解決方案,但不幸的是我從一個班級構建這一切....但這足夠耐人尋味,我想我會轉換它,所以我的方法不是靜態的。 – 2014-10-10 03:40:30

+0

更新:類<捕獲#1的類型的方法getMethod(字符串,類...):使用此方法我得到的getMethod錯誤?擴展ScoreGenerator>不適用於參數(Class )...................但是,在getMethod中添加一個名稱匹配的例子擺脫錯誤....將繼續工作 – 2014-10-10 03:45:15

0
for(int i = 1; i <= 13; i++) { 
    switch(i) { 
     case 1: 
      each_score = ones(dice_values); 
     break; 

     case 2: 
      each_score = twos(dice_values); 
     break; 

     ... 

    } 
    total_score += each_score; 
    end_scores += String.valueOf(each_score) + " "; 
} 
1

除非我失去了一些東西(並且沒有switch),你可以建立的int得分數組,並迭代的scores數組。這就是說,

int [] scores = new int[] { 
     ones(dice_values), twos(dice_values), threes(dice_values), 
     fours(dice_values), fives(dice_values), sixes(dice_values), 
     sevens(dice_values), eights(dice_values), nines(dice_values), 
     tens(dice_values), elevens(dice_values), twelves(dice_values), 
     thirteens(dice_values) 
}; 
for (int each_score : scores) { 
    total_score += each_score; 
    end_scores += String.valueOf(each_score) + " "; 
}