2017-01-08 16 views
-2

I Teilen eines Wortes durch die Verwendung am Anzeige:C# Verknüpfung Hinweis mit einem zufälligen Wort aus Wörterbuch

public string GetPartialWord(string word) 
    { 
     if (string.IsNullOrEmpty(word)) 
     { 
      return string.Empty; 
     } 
     char[] partialWord = word.ToCharArray(); 
     int numberOfCharsToHide = word.Length/2; 
     Random randomNumberGenerator = new Random(); 
     HashSet<int> maskedIndices = new HashSet<int>(); 
     for (int i = 0; i < numberOfCharsToHide; i++) 
     { 
      int rIndex = randomNumberGenerator.Next(0, word.Length); 
      while (!maskedIndices.Add(rIndex)) 
      { 
       rIndex = randomNumberGenerator.Next(0, word.Length); 
      } 
      partialWord[rIndex] = '_'; 
     } 
     return new string(partialWord); 
    } 

Deshalb: das Wortspiel würde wie folgt aussehen: _a_e

Ich denke mich zur Herstellung einer Zugabe Tipp-Taste, um ein anderes Zeichen anzuzeigen. Irgendwelche Ideen zum weiteren Vorgehen?

G_m_ -> Hinweis -> G_me

+0

Kannst du deine Frage klarer stellen? – Vladimir

+0

@Vladimir, ich entschuldige mich für die Frage so vage. Alles, was ich tun möchte, ist eine Hinweisschaltfläche hinzuzufügen, um meinem Teilwort einen weiteren Buchstaben hinzuzufügen. –

Antwort

1

können Sie so etwas wie folgt verwenden:

public string GetWordAfterHint(string wordToProcess, string originalWord) 
{ 
    List<int> emptyIndexes = new List<int>(); 
    for (int a = 0; a < wordToProcess.Length; a++) 
    { 
     if (wordToProcess[a] == '_') 
     { 
      emptyIndexes.Add(a); 
     } 
    } 

    // in case if word doesn't have empty positions 
    if (emptyIndexes.Count == 0) 
    { 
     return wordToProcess; 
    } 

    Random random = new Random(); 
    var indexForLetter = random.Next(emptyIndexes.Count); 

    // create stringBuilder from string, because string is immutable and you can't change separate symbol 
    StringBuilder sb = new StringBuilder(wordToProcess); 

    // insert symbol from originalWord in empty previously generated position 
    sb[emptyIndexes[indexForLetter]] = originalWord[emptyIndexes[indexForLetter]]; // 

    //convert stringBuilder to string and return 
    return sb.ToString(); 
} 

Methode liefert Wort nach Hinweis - wenn als wordToProcess passieren Sie "_a_e" und als originalWord"game" dann kehrt Methode ga_e oder _ame.

+0

@CodingYoshi Ich habe deine Methode versucht und es hat funktioniert. Nochmals vielen Dank für Ihre Anregungen und Einblicke. Ich probiere die Methode der Roma aus, allerdings ohne Erfolg. Ich denke, ich schreibe etwas falsch von meiner Seite. Danke Roma, ich werde das umsetzen, wenn es funktioniert, da es relativ kürzer ist! –

+0

Könnten Sie bitte die folgenden Zeilen bitte @Roma erklären? 'StringBuilder sb = neuer StringBuilder (wordToProcess); sb [emptyIndexes [indexForLetter]] = originalWord [leereIndexe [indexForLetter]]; ' –

+1

@UnknownR, siehe bearbeitete Antwort, fügte ich kurze Kommentare hinzu. –

1

Speichern Sie die Indizes der in einem Array oder in einer Liste angezeigten Zeichen. Wenn die Hinweisschaltfläche gedrückt wird, berechnen Sie einen zufälligen Index. Vergleichen Sie diesen Index mit den Indizes der Buchstaben, die bereits angezeigt werden, und berechnen Sie bei Bedarf einen neuen Zufallsindex.

1

ein objektorientierter Ansatz:

Von Ihrer GePartialWord Methode, eine Instanz dieser Klasse zurückgeben anstelle einer einfachen Zeichenfolge:

public class GameWord 
{ 
    public string OriginalWord { get; set; } 
    public string GuessWord { get; set; } 

    public string Hint() 
    { 
     int index = this.GuessWord.IndexOf('_'); 
     if (index != -1) 
     { 
      var builder = new StringBuilder(this.GuessWord); 
      builder[index] = this.OriginalWord[index]; 

      this.GuessWord = builder.ToString(); 

      return this.GuessWord; // if needed 
     } 

     // No more hints, the world has no underscores 
     return this.GuessWord; 
    } 
} 

So in Ihrer Methode Du diese stattdessen tun:

public GameWord GetPartialWord(string word) 
{ 
    // The rest of your code 

    // Change this line return new string(partialWord); 
    // to this 
    return new GameWord{ OriginalWord = word, GuessWord = new string(partialWord)}; 
} 

Und in Ihrem Formular, erstellen Sie ein privates Feld wie folgt:

private GameWord currentGameWord; 

Wenn Sie das Zufallswort haben, rufen Sie Ihre GetPartialWord Methode und speichern Sie das zurück Wort in currentGameWord:

this.currentGameWord = GetPartialWord(someWord); 

Und weil das Verfahren nun ein Objekt zurückgibt, binden Sie Ihre Textbox wie folgt aus:

this.textBox1.Text = this.currentGameWord.GuessWord; 

Und im Click-Handler Ihrer Schaltfläche tun Sie dies (Ihr Handler wird einen anderen Namen haben):

private void HintButton_Click(object sender, EventArgs e) 
{ 
    this.textBox1.Text = this.currentGameWord.Hint(); 
} 
Verwandte Themen