2012-02-23 6 views
0

は、我々はそう、読み出しにポイントなどの読み出しサイコロ

問題イマイチを増やす場合、5つのサイコロを振り、学校のためにいくつかの小さなプログラムを作り、あなたはそれで一種の3を取得するかどうかを確認する必要がありますサイコロ、私はそれを完了するための知識がありますが、私はそれが半分ページを占めるコードの醜い部分ではなく、少し効率的であることを望みます。私は配列内の複製をフィルタリングする方法を見つけましたが、逆の方法はありません。それは5つのダイスでロールします。つまり、5つの数字を持つ配列は、組み込みの関数や3回転じた数値を返すうえで効率的な方法ですか?

誰でも正しい方向に私を押し込むことができます。 :)

+4

コードを投稿できますか? – Taryn

+3

あなたの宿題をあなたに依頼するのではなく、あなたのコードを現状のまま投稿してください。 –

+0

これまであなたが幸せではないことを試したことはありますか?宿題に関する質問については、これまでに試したことを投稿し、それがうまくいかないように説明し、具体的な質問をする必要があります。あなたの現在のコードを投稿し、そのコードの実際の部分について質問してください。 (そして、勉強のために、あなたは '宿題'タグを含めるべきです)。あなたがコードを書いて欲しいとは思わないのは良いことです。ありがとう。 :) –

答えて

1

1つの方法は、の計数値を含む6要素配列を、その面がいくつあるかを格納することです。 5つのダイスをループし、適切な顔の合計数を増やします。

var rolls = new List<Roll>(); 
// run as many rolls as you want. e.g.: 
rolls.Add(new Roll(5)); 
var threeOfAKindRolls = rolls.Where(r => r.HasThreeOfAKind()); 

public class Roll 
{ 
    public Roll(int diceCount) 
    { 
      // Do your random generation here for the number of dice 

     DiceResults = new int[0]; // your results. 
     ResultCounts = new int[6]; // assuming 6 sided die 

     foreach (var diceResult in DiceResults) 
     { 
      ResultCounts[diceResult]++; 
     } 
    } 

    public int[] DiceResults { get; private set; } 

    public int[] ResultCounts { get; private set; } 

    public bool HasThreeOfAKind() 
    { 
     return ResultCounts.Any(count => count >= 3); 
    } 
} 

あなたは結果が結果に他のテストを実行するためにカウント必要がない場合は、このコードが多少短縮することができます。

 public Roll(int diceCount) 
    { 
      // Do your random generation here for the number of dice 
     DiceResults = new int[0]; // your results. 
    } 

    public bool HasThreeOfAKind() 
    { 
     ResultCounts = new int[6]; // assuming 6 sided die 
     foreach (var diceResult in DiceResults) 
     { 
      // Increment and shortcut if the previous value was 2 
      if((ResultCounts[diceResult]++) == 2) return true; 
     } 
     return false; 
    } 
+0

誰もコメントなしでdownvotedですか? – Tyson

+4

私はdownvoterについては話すことができませんが、私たちは通常、宿題の問題に対応して100%作業コードを提供することは悪いフォームと考えています。 – sarnold

+1

ジョークはあなたの上にあります。これは動作するコードではありません!タイソン、六面ダイのカウント配列は0-5のインデックスが付けられ、ロールはおそらく1-6として生成されることに注意してください。結果に1つのエラーがある場合は、範囲外のインデックス例外が先に表示されないようにします。私はまた、長さがゼロの配列を参照していますが、いくつかの共同編集/競合編集が行われているようです。 –

1

大規模な比較をしようとしているように見えるように答えを説明しているとします。それは間違ったアプローチです。

5よりむしろ20サイスであるとふりをしてください。良い答えは大きなケースでも同様に機能します。

2

あなたはLINQで簡単かつ簡潔にそれを行うことができます。

var diceRolls = new[] {1, 3, 3, 3, 4}; 
var winningRolls = diceRolls.GroupBy(die => die).Select(groupedRoll => new {DiceNumber = groupedRoll.Key, Count = groupedRoll.Count()}).Where(x => x.Count >= 3).ToList(); 

これはロール番号(「Key」)とそのロールの出現回数でロールをグループ化することです。次に、3以上のカウントを持つロールを選択します。結果は、勝利ロールを含むListになります。

1

私は、次のようなものを使用します。あなたは10巻を持っていた場合は、それらの6が同じ値、その値であれば、これは、ロールの任意の数だけでなく、5で動作します

public int? WinningRoll(IEnumerable<int> rolls) 
{ 
    int threshold = rolls.Count()/2; 

    var topRollGroup = rolls.GroupBy(r => r) 
     .SingleOrDefault(rg => rg.Count() > threshold); 

    if (topRollGroup != null) 
     return topRollGroup.Key; 

    return null; 
} 

ので、返されます。勝利のロールがない場合、nullが返されます。

関連する問題