1

次のようなメソッドのアルゴリズムを疑似コーディングするにはどうすればよいですか。

  • サイコロを転がす - 4 面、6 面、8 面、10 面、または 12 面

  • このタイプのサイコロは 10 個までロールできます

  • サイコロの半分以上が 1 の場合、バストしたというメッセージを出力してプログラムを終了します。

  • いずれかのサイコロが振ったサイコロの種類と同じである場合、グループから最も高い値を取ります。同様に、振ったサイコロのタイプの値に等しいサイコロを再ロールします。

    ^^^^IE - 六面体のサイコロを 3 つ持っていて、それらを転がして 4、2、6 が出たとしましょう。6 の値が最も高いので、6 の値を取ります。次に、6 だったサイコロを振り直します。6 が出た場合は、その 6 を前の 6 に追加し、再ロールします。そうでない場合は、最高のサイコロを前の値に追加します。

4

2 に答える 2

6

あなたの質問は、あなたがこれを難しいと感じている理由を示していると思います。1 か所で多くのことを解決しようとすると、圧倒されてしまいます。それを行うための単一のメソッドを作成する必要はありません。いくつか作成したくなるでしょう。問題を構成要素に分解することから始めます。

注: 答えを解析しやすくするために、オブジェクト指向の方法でこれに取り組んでいるわけではありません。より詳細に設計を検討することをお勧めします。

要件 1: 4 面、6 面、8 面、10 面、12 面のいずれかのタイプのサイコロを振る

わかりました-次のような方法が必要です。

int ロール (int 側);

基本的に、Roll は 1 から辺 (両端を含む) の間のランダムな値を返します。

要件 2: このタイプのダイスを 10 個までロールできる

これはおそらく for ループです。

要件 3: サイコロの半分以上が 1 の場合、バストしてプログラムを終了するというメッセージを出力します。

この要件は、Roll への各呼び出しの結果をコレクション (List または int[] (整数の配列) など) に格納することを意味します。

次に、そのコレクションを繰り返し処理し、「1」であるロールの数を数えていると述べています。カウントがロールの総数の半分を超える場合は、プログラムを終了します。カウントは簡単で (for ループまたは foreach がおそらく最善の策です)、作成されたロールの数がわかります (コレクション内のアイテムの数と、ロールが作成されたときに for ループにカウンターがあったため)。 . だから分割して比較します。

要件 4: サイコロのいずれかがロールされたサイコロの種類と等しい場合、グループから最も高い値を取ります。同様に、振ったサイコロのタイプの値に等しいサイコロを再ロールします。

繰り返しますが、結果セットを繰り返し処理し、操作リクエストを実行する必要があります。このルールを前のルールと組み合わせてソリューションを「最適化」しようとはしません。ソリューションを複雑にするだけで、実際のメリットはありません。

于 2011-01-12T14:12:01.923 に答える
0

アルゴリズムは次のことを行う必要があります。

  1. サイコロを転がす
  2. 結果をチェックして、半分が 1 かどうかを確認します
  3. 高い数字を確認し、場合によっては再ロールする
  4. ロールされたサイコロから受け入れられた数字と現在の合計を追跡します

実際にあなたのためにそれを行うこと以上のことはありません。

于 2011-01-12T14:09:39.167 に答える