2012-03-02 7 views
2

私は宿題をしていて、いくつかの論理に固執しています(私はその用語を正しく使ったと思いますか?)。私は1から12までの12のボタンと、ダイスの2枚の写真と、ロールボタンを表示するアプリケーションを書いています。"If"ステートメントの代替語

プレイヤーはサイコロ(2、6面ダイス)とどんな番号(S)、彼は彼が12個の数字の一部を「カバー」するために使用することができ、取得をロールバックします。たとえば、彼はサイコロを振り、3と5を得たとしましょう。彼は3と5をカバーするか、2つの数字の合計を選ぶことになります - 8(私は数学ウィズだと言いましたか? )。

ゲームの目的は、ロールの最小量を使用して、すべての数字をカバーするものです。

私がいる問題は、私はあることを信じている、とされ、if文:

if (die1 == 3 && die2 == 5) { 
    player can cover 3 and 5, or 8, but not both 
} 

は今、私はこれがうまくいくと思うが、私はこのすべてを書いた場合には、36のif文だろう(与えるかゼロを取る)。簡単な方法がありますか?

+0

あなたのコードを投稿すると、それを簡素化しようとします – dantuch

+1

仕様デザインパターンhttps://en.wikipedia.org/wiki/Specification_patternをチェックしてください。私はそれがあなたの問題であなたを助けることができると思う。 – Songo

+0

合計が8の場合のみカバーできますか? – tom

答えて

5

私はプレーヤーがdie1die2またはdie1 + die2を選択できると思うので、ユーザーが有効な値を選択したかどうかを確認するには、1つだけ必要です。

if (cover == die1 or cover == die2 or cover == (die1 + die2)) { 
    //valid.. 
} 
2

必要な場合は必要ありません。プレーヤーはカバーすることができますdie1die2またはdie1+die2

+0

ここでdownvoteを理解していない...という考えは、 "マジックナンバー"をコード化する必要はありません。 –

+0

変数を使用してください... –

+0

これは彼の「宿題」でどのように役立ちますか?これはちょうど質問を繰り返すことです。 – tom

2

これはスイッチケースIMOを使用する良い例です。 それはそれぞれ6つのケースを持つ2つのスイッチになります。

+1

例を挙げてください。 –

1

プレーヤーが何かをカバーしようとするまでチェックしないでください。入力を検証するだけで、すべてを簡略化してif文にすることができます。

あなたはすべての可能性を知る必要性を行う場合は(多分プレイヤーに可能な動きを示すために)、そして...あなたはまだすべてのこれらのif文は必要ありません。ダイスロールに合ったボタンを強調表示し、入力としてのみ受け入れます。それらの値を取得する方法として、値(たとえば「1」)を使用して配列またはマップ内にそれらのインデックスを付ける必要があります。

0

私はおそらくそうのように、2つの新しいオブジェクトを作成し、ルックアップテーブルでそれらを使用します。ユーザーの後

HashMap<TossResult, Coverage> lookup = new HashMap<>(); 
for (int i = 0, i < SIDES_ON_DIE; i++){ 
    for (int j = 0, j < SIDES_ON_DIE; j++){ 
     TossResult tempResult = new TossResult(i,j); 
     Coverage tempCoverage = new Coverage(tempResult); 
     lookup.put(tempResult, tempCoverage); 
    } 
} 

class TossResult{ 
    int firstDie; 
    int secondDie; 
} 

Class Coverage{ 
    TossResult tossResult; 

    int getThirdNumber(){ 
     return tossResult.firstDie + tossResult.secondDie; 
    } 
} 

は、次に、アプリケーション起動時に、あなたのマップを移入しますあなたはまた、12個のint型またはboolsの配列を作成することができサイコロを振り、新しいtossResultを作成し、lookup.get(tossResult)

0

を行います。 12個の要素すべてを初期化する(たとえば、0またはfalse)。次に、それぞれの役割について、好きなことをすることができます:

if (false == myArray[die1Value] && false == myArray[die2Value]) { 
    myArray[die1Value] = true; 
    myArray[die2Value] = true; 
} else if (false == myArray[die1Value + die2Value]) { 
    myArray[die1Value + die2Value] 
} else if (false == myArray[die1Value] || false == myArray[die2Value]) { 
    if (false == myArray[die1Value]) { 
     myArray[die1Value] = true; 
    } 
    if (false == myArray[die2Value]) { 
     myArray[die2Value] = true; 
    } 
} else { 
    // all 12 covered 
} 

確かにこのコードをもう少しリファクタリングすることができます。 「ゲームの目標は、最小のロールを使用してすべての数字をカバーすることです。本当に、実行可能ではありません。あなたができる最善のは、あなたが常に持っている2個のダイスを知っている1と2、または3最初:-)

1

、例えば、あなたが1と2のロールにカバーしなければならない、かどうかを知るために確率を使用することです3つのカバーオプション。おそらくコードの他の部分では、対象となるオプションを数値と比較するつもりです。何かのように

int[] covered = { die1, die2, die1+die2 }; 
// ... other stuff 
if (comparisonValue > 6) { 
    // maybe do special stuff since this uses both dice 
    if (comparisonValue == covered[2]) { 
    // covered/coverable behavior 
    } else { 
    // not 
    } 
} else { 
    // maybe do special stuff since this only uses one die 
    if (comparisonValue == covered[0] || comparisonValue == covered[1]) { 
    // covered/coverable behavior 
    } else { 
    // not 
    } 
} 

あなたが最初に何をカバーし、次にそれを使いますか?あなたはかなり壊れやすいです

for (int c : covered) { 
    // do stuff with c because it's covered 
} 

ALA、またカバー番号のものを行うために、アレイの上にforeachことができますが、柔軟性の答え(例えば、Collectionに成果を投棄する)行き過ぎ6面体のため方法があり、整数面ダイス、そして実際には柔軟な答え(例えば、ダイスの可変数、結果に面の特殊な組み合わせを収容する)は、この特定の問題のための核兵器のようなものです。あなたの特定の問題について

EDIT、私は、プレイヤーが新しい結果に基づいて、以前のロールで覆われている1-12のどの変更することができた場合は、よく、あなたは可能性が

// start new turn, disable all buttons 
// get rolls 
int[] coverable = { die1, die2, die1+die2 }; 
for (int covered : coverable) { 
    // enabled covered button 
} 

ような何かをしたいですどのくらいの助けをしたいのかに応じて、楽しい時間を過ごしてください。