2016-03-26 5 views
-1

Ich habe das funktioniert, aber ich versuche, einen einfacheren Weg zu finden, dies zu tun.Parameter übergeben durch Referenz Rolling Dice GUI C#

Ich brauche ein Programm, das ein Bild von zwei Würfeln anzeigt, und ich muss eine Klasse haben, und mindestens eine Methode, die Parameter korrekt verwendet, die als Referenz übergeben werden.

Ich habe meine GetRoll-Methode in meiner Klasse mit zwei Parametern als Referenz übergeben, aber die einzige Möglichkeit, die ich funktionierte, ist durch eine lächerliche Menge von if else Aussagen. Es muss einen besseren Weg geben. Irgendwelche Ideen? Hier ist meine Form:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace DiceGame 
{ 
    public partial class Form1 : Form 
    { 
     DiceClass objectRef; 
     public Form1() 
     { 
      InitializeComponent(); 
      objectRef = new DiceClass(); 
     }  
     private void rollEm_Click(object sender, EventArgs e) 
     { 
      specialMessage.Text = ""; 
      objectRef.RollEm(); 
      string str1 = ""; 
      string str2 = ""; 
      objectRef.GetRoll(ref str1, ref str2); 
      die1.Text = str1; 
      die2.Text = str2; 
      if (objectRef.BoxCars()) 
      { 
       specialMessage.Text = "BOX CARS!!"; 
      } 
      else 
      { 
       if (!objectRef.SnakeEyes()) 
        return; 
       specialMessage.Text = "SNAKE EYES!!"; 
      } 
     } 
    } 
} 

Und hier ist meine Klasse:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace DiceGame 
{ 
    class DiceClass 
    { 
     private static string nL = Environment.NewLine; 
     string one = nL + " l "; 
     string two = "l" + nL + nL + " l"; 
     string three = "l l" + nL + nL + "l l"; 
     string four = "l l" + nL + nL + "l l"; 
     string five = "l l" + nL + " l " + nL + "l l"; 
     string six = "l l" + nL + "l l" + nL + "l l"; 
     private const int BOX = 6; 
     private int firstDie; 
     private int secondDie; 
     Random randomNums = new Random(); 
     public DiceClass() 
     { 
      firstDie = 0; 
      secondDie = 0; 
     } 

     public void RollEm() 
     { 
      firstDie = randomNums.Next(1, 7); 
      secondDie = randomNums.Next(1, 7); 
     } 
     public bool BoxCars() 
     { 
      return firstDie == 6 && secondDie == 6; 
     } 

     public bool SnakeEyes() 
     { 
      return firstDie == 1 && secondDie == 1; 
     } 
     // is there an easier way to have this method work without all these if else statements?? 
     public void GetRoll(ref string first, ref string second) 
     { 
      if (firstDie == 1 && secondDie == 1) 
      { 
       first = one; 
       second = one; 
      } 
      else if (firstDie == 1 && secondDie == 2) 
      { 
       first = one; 
       second = two; 
      } 
      else if (firstDie == 1 && secondDie == 3) 
      { 
       first = one; 
       second = three; 
      } 
      else if (firstDie == 1 && secondDie == 4) 
      { 
       first = one; 
       second = four; 
      } 
      else if (firstDie == 1 && secondDie == 5) 
      { 
       first = one; 
       second = five; 
      } 
      else if (firstDie == 1 && secondDie == 6) 
      { 
       first = one; 
       second = six; 
      } 
      else if (firstDie == 2 && secondDie == 1) 
      { 
       first = two; 
       second = one; 
      } 
      else if (firstDie == 2 && secondDie == 2) 
      { 
       first = two; 
       second = two; 
      } 
      else if (firstDie == 2 && secondDie == 3) 
      { 
       first = two; 
       second = three; 
      } 
      else if (firstDie == 2 && secondDie == 4) 
      { 
       first = two; 
       second = four; 
      } 
      else if (firstDie == 2 && secondDie == 5) 
      { 
       first = two; 
       second = five; 
      } 
      else if (firstDie == 2 && secondDie == 6) 
      { 
       first = two; 
       second = six; 
      } 
      else if (firstDie == 3 && secondDie == 1) 
      { 
       first = three; 
       second = one; 
      } 
      else if (firstDie == 3 && secondDie == 2) 
      { 
       first = three; 
       second = two; 
      } 
      else if (firstDie == 3 && secondDie == 3) 
      { 
       first = three; 
       second = three; 
      } 
      else if (firstDie == 3 && secondDie == 4) 
      { 
       first = three; 
       second = four; 
      } 
      else if (firstDie == 3 && secondDie == 5) 
      { 
       first = three; 
       second = five; 
      } 
      else if (firstDie == 3 && secondDie == 6) 
      { 
       first = three; 
       second = six; 
      } 
      else if (firstDie == 4 && secondDie == 1) 
      { 
       first = four; 
       second = one; 
      } 
      else if (firstDie == 4 && secondDie == 2) 
      { 
       first = four; 
       second = two; 
      } 
      else if (firstDie == 4 && secondDie == 3) 
      { 
       first = four; 
       second = three; 
      } 
      else if (firstDie == 4 && secondDie == 4) 
      { 
       first = four; 
       second = four; 
      } 
      else if (firstDie == 4 && secondDie == 5) 
      { 
       first = four; 
       second = five; 
      } 
      else if (firstDie == 4 && secondDie == 6) 
      { 
       first = four; 
       second = six; 
      } 
      else if (firstDie == 5 && secondDie == 1) 
      { 
       first = five; 
       second = one; 
      } 
      else if (firstDie == 5 && secondDie == 2) 
      { 
       first = five; 
       second = two; 
      } 
      else if (firstDie == 5 && secondDie == 3) 
      { 
       first = five; 
       second = three; 
      } 
      else if (firstDie == 5 && secondDie == 4) 
      { 
       first = five; 
       second = four; 
      } 
      else if (firstDie == 5 && secondDie == 5) 
      { 
       first = five; 
       second = five; 
      } 
      else if (firstDie == 5 && secondDie == 6) 
      { 
       first = five; 
       second = six; 
      } 
      else if (firstDie == 6 && secondDie == 1) 
      { 
       first = six; 
       second = one; 
      } 
      else if (firstDie == 6 && secondDie == 2) 
      { 
       first = six; 
       second = two; 
      } 
      else if (firstDie == 6 && secondDie == 3) 
      { 
       first = six; 
       second = three; 
      } 
      else if (firstDie == 6 && secondDie == 4) 
      { 
       first = six; 
       second = four; 
      } 
      else if (firstDie == 6 && secondDie == 5) 
      { 
       first = six; 
       second = five; 
      } 
      else 
      { 
       first = six; 
       second = six; 
      } 
     } 
    } 
} 
+0

Speichern Sie Ihre Formdarstellung in einem String-Array und verwenden Sie den Wert der Rolle als Index im Array – Steve

Antwort

0

ein Wörterbuch verwenden Sie Ihre Mapping einmal definieren:

Dictionary<int, string> dieRapping = new Dictionary<int, string>() { 
    { 1, nL + " l " }, 
    { 2, "l" + nL + nL + " l" }, 
    { 3, "l l" + nL + nL + "l l" }, 
    { 4, "l l" + nL + nL + "l l" }, 
    { 5, "l l" + nL + " l " + nL + "l l" }, 
    { 6, "l l" + nL + "l l" + nL + "l l" } 
}; 

Jetzt können Sie ganze Zahlen in Strings umwandeln, in konstante Zeit durch nur dieRapping[someInteger]. So Ihre ganze GetRoll Methode wird dies:

public void GetRoll(ref string first, ref string second) 
{ 
    first = dieRapping[firstDie]; 
    second = dieRapping[secondDie]; 
} 

Beachten Sie, dass auch ohne Zuordnung, können Sie sich eine Menge gespeichert haben könnte, wenn Sie first und second unabhängig behandelt. Da sie auf einem anderen nicht abhängig sind, können Sie einfach first Griff zuerst, und dann second tun:

if (firstDie == 1) 
    first = one; 
else if (firstDie == 2) 
    first = two; 
else … 

if (secondDie == 1) 
    second = one; 
else if (secondDie == 2) 
    second = two; 
else … 

Oder, da die Logik das gleiche für first und second ist, könnten Sie eine andere Methode eingeführt haben:

public string GetSingleRoll(int value) 
{ 
    if (value == 1) 
     return one; 
    else if (value == 2) 
     return two; 
    else … 
} 

Und dann könnte man rufen Sie einfach diese Methode zweimal in GetRoll:

first = GetSingleRoll(firstDie); 
second = GetSingleRoll(secondDie); 

Aber das sind nur einige Möglichkeiten, Wiederholungen zu reduzieren. In Ihrem Fall ist die Verwendung eines Mappings wahrscheinlich die beste Lösung.

+0

Dank Poke! Ich kann nicht glauben, dass ich nicht Ihre Empfehlung zu ersten und zweiten unabhängig zu behandeln. Sie haben meine Frage beantwortet! –

0

// Gibt es einen einfacheren Weg, diese Methode ohne all diese anderen Anweisungen zu verwenden?

Ja:

class DiceClass 
{ 
    private static string nL = Environment.NewLine; 
    List<string> vals = new List<string> 
    { 
     nL + " l ", 
     "l" + nL + nL + " l", 
     "l l" + nL + nL + "l l", 
     "l l" + nL + nL + "l l", 
     "l l" + nL + " l " + nL + "l l", 
     "l l" + nL + "l l" + nL + "l l" 
    }; 
    private const int BOX = 6; 
    private int firstDie; 
    private int secondDie; 
    Random randomNums = new Random(); 
    public DiceClass() 
    { 
     firstDie = 0; 
     secondDie = 0; 
    } 

    public void RollEm() 
    { 
     firstDie = randomNums.Next(1, 7); 
     secondDie = randomNums.Next(1, 7); 
    } 
    public bool BoxCars() 
    { 
     return firstDie == 6 && secondDie == 6; 
    } 

    public bool SnakeEyes() 
    { 
     return firstDie == 1 && secondDie == 1; 
    } 

    public void GetRoll(ref string first, ref string second) 
    { 
     //str1 = GenerateString(numOne); 
     //str2 = GenerateString(numTwo); 

     first = vals[firstDie < 1 ? vals.Count - 1 : firstDie - 1]; 
     second = vals[secondDie < 1 ? vals.Count - 1 : secondDie - 1]; 
    } 
} 

Der obige Code tatsächlich speichert Ihre Werte in einer Liste List<string> vals, und dann zu first und second Parameter GetRoll ihre entsprechenden Werte zuweisen.

Weitere Informationen zu dieser Syntax firstDie < 1 ? vals.Count - 1 : firstDie - 1: ?: Operator (C# Reference)

+0

Danke Jungs! Ich dachte eigentlich schon an ein Array. Ich hätte das wahrscheinlich die ursprüngliche Frage erwähnt, aber ich habe tatsächlich versucht, ein Array zu vermeiden. Der Grund ist, dass dies ein Projekt für meine College-Klasse ist und uns Arrays noch nicht beigebracht wurden. Also versuche ich im Rahmen dessen, was wir in dieser Klasse gelernt haben, einen Weg zu finden. Aber mit einem Wörterbuch ist ziemlich cool! Ich habe das vorher nicht gesehen, aber es ist auch außerhalb des Bereichs dessen, was uns beigebracht wurde. Irgendwelche anderen Ideen? Oder sucht mein Lehrer eigentlich nach 36 if else Statements? –

Verwandte Themen