Problem zufälligen string aus array wählen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem zufälligen string aus array wählen

    Wir programmieren derzeit c#. Nun habe ich mir selber die Aufgabe gestellt, sozusagen ein wortraten zu erstellen. Ich dachte mir zuerst, dass ich die wörterliste in ein textfile schreibe, welches ich dann mit hilfe von streamreader einbinde und dann dort einfach ein zufälliges wort auswähle, in ein array speichere und ihm dann nach irgendwie 5tem falschraten des worts einen der buchstaben als hilfestellung geben könnte. Mit diesem Versuch bin ich dann gnadenlos gescheitert. Das Problem war, dass ich es nicht hinbekam ein zufälliges wort(string) aus dem textfile herauszulesen und dann in ein array zu speichern.
    Mein 2er versuch war es, direkt ein "stringarray" zu erstellen und dort die wörter hinzuschreiben. Hier bin ich wieder am selben gescheitert. Ich habe es nicht geschafft eines der wörter auszuwählen und in ein neues array zu speichern.

    so sah versuch 2 dann aus:

    Random r = new Random();
    string woerter = new[]{ "schweiz", "deutschland", "italien", "frankreich", "oestereich", "spanien", "portugal", "russland", "schweden", "norwegen", "finnland", "kroatien", "serbien", "slovenien" } [r.next(woerter.Lenght)];

    kann mir jemand weiterhelfen? Bei fragen stehe ich gerne noch zu verfügung
  • Zeile 1 initialisiert das Stringarray woerter mit den Ländernamen. woerter[i] wählt aus dem Array den i-ten Eintrag aus, wobei der Index bei 0 beginnt. r.Next(min, max) liefert eine Zufallszahl zwischen min und max. Also speichert die zweite Zeile in dem String wort einen Eintrag aus dem Array woerter, wobei der Index zufällig aus dem Bereich 0 und Länge des Array (=Anzahl Einträge) bestimmt wird.

    Thomas
  • [syntax="csharp"]using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;

    namespace ConsoleApplication1
    {

    class Program
    {
    Random r = new Random();
    string[] woerter = new string[] { "schweiz", "deutschland", "italien", "frankreich", "oestereich", "spanien", "portugal", "russland", "schweden", "norwegen", "finnland", "kroatien", "serbien", "slovenien" };
    string wort = woerter[r.next(0, woerter.Length)];
    }

    public void schritt1()
    {
    Console.WriteLine("--------------------\n---------0----------\n--------------------\n--------------------\n--------------------\n--------------------");
    }

    public void schritt2()
    {
    Console.WriteLine("--------------------\n---------0----------\n---------|----------\n--------------------\n--------------------\n--------------------");
    }

    public void schritt3()
    {
    Console.WriteLine("--------------------\n---------0----------\n-------==|----------\n--------------------\n--------------------\n--------------------");
    }

    public void schritt4()
    {
    Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n--------------------\n--------------------\n--------------------");
    }

    public void schritt5()
    {
    Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n---------|----------\n--------------------\n--------------------");
    }

    public void schritt6()
    {
    Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n---------|----------\n--------I'----------\n--------------------");
    }

    public void schritt7()
    {
    Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n---------|----------\n--------I'I---------\n--------------------");
    Console.WriteLine("\n \n");
    Console.WriteLine("Du hast verloren, das wort waere", loesung, "gewesen"); \\das loesung wär dann ein array; hier wäre dann das ausgewählt wort enthalten
    } \\die überprüfung, sowie der hauptteil des programm käme ja dann ins main


    static void Main(string[] args)
    {
    ...
    }
    }

    Das ganze ist eine C# console application. Ich weiss das ich das alles ein bisschen kompliziert mache aber es ist mehr eine Übung als ein nutzungsprogramm. Das programm wird zum schluss eine art hangman. Die schritte 1-7 sind die einzellnen chancen die man hat; fals man das wort nicht erratet, kommt der nächste schritt. Nur weiss ich nicht, wie ich es bewerkstelligen könnte, die einzellnen buchstaben zu überprüfen. Also wenn der user ein e eingibt, dass dann überprüft wird, ob im wort ein e vorkommt. Für das müsste ich doch vom string woerter jedes wort in ein einzellnes array speichern und dann im array, welches zufällig ausgewählt wurde die überprüfung tätigen... anschliessend müsste ich über eine if schleife oder mit switch case testen, bei welchem schritt der user derzeit ist. Und fals die überprüfung herausstellt, dass er richtig hat, bleibt er beim gleichen schritt. Fals er jedoch falsch geraten hat, wird der nächste schritt durchgeführt. Wie das programm aufgebaut ist weiss ich aber ich kriegt die einzellnen funktionen nicht hin...
    hab ich noch irgendwas vergessen? wenn ihr noch fragen zum quellcode habt, könnt ihr die gerne stellen. Bitte um hilfestellungen nicht um lösungen. Will schliesslich etwas lernen.
  • wenn ich es in ein array speichere, kann ich dananch die einzelnen buchstaben auf korrektheit überprüfen. Wobei ich nicht weiss, wie ich dies machen kann. Die einzige Idee die mir zur überprüfung gekommen ist, wäre mit compare die antwort des users und das durch zufall ausgewählte wort zu vergleichen aber wenn ich dies mache, wird es um einiges schwieriger für den user, da er keinerlei hinweise auf die lösung hat. Bei der anderen variante kann er sich ja immer buchstabe für buchstabe vorarbeiten.
    danke für deine schnellen antworten
  • SJay96 schrieb:

    wenn ich es in ein array speichere, kann ich dananch die einzelnen buchstaben auf korrektheit überprüfen

    Das geht auch bei einem String.

    Quellcode

    1. string wort = "Hallo";
    2. Console.WriteLine(wort[1]); // gibt das a aus;

    Prinzipiell solltest du dir ein Buch oder OnlineTutorial suchen. Dein Code ergibt so keinen Sinn - nicht unbedingt der Inhalt, aber da wo du ihn hingeschrieben hast. Hier mal ein Beispiel, wie es aussehen sollte:

    Quellcode

    1. using ...
    2. namespace ConsoleApplication1
    3. {
    4. class Programm
    5. {
    6. public void runTest()
    7. {
    8. Console.WriteLine("Hallo Welt");
    9. }
    10. public static void Main(string[] args)
    11. {
    12. Programm p = new Programm();
    13. p.runTest();
    14. }
    15. }
    16. }
    Alles anzeigen

    In der Klasse Main erzeugst du eine Instanz deiner Klasse Programm und rufst die Methode runTest() auf. Ob du die Logik deines Programmes in die Main-Methode oder in eine extra Methode schreibst, ist Geschmackssache und erstmal egal. Innerhalb der Klasse definierst du auch deine schritt-Methoden und nicht außerhalb wie in deinem Code. Aufrufen kannst du sie dann mit dem Punkt-Operator wie runTest() in meinem Beispiel. Wenn du für jeden Schritt eine eigene Methode schreiben willst, ist das erstmal auch kein Problem. Verbessern kann man später immer noch. Und du solltest dir überlegen, was in jedem Schritt passieren soll.

    Thomas

    C# openbook
  • Danke Thomas dass du so viel geduld mit mir hast. Ich habe reichlich weiter probiert aber irgend etwas läuft einfach immer nicht. Dein Vorschlag wird mich nicht weiter bringen, denn ich muss buchstabe für buchstabe überprüfen und dann immer eine ausgabe erhalten. Fals korrekt soll es den buchstaben ausgeben, fals nicht soll es einen punkt ausgeben. So sieht es derzeit aus(ich weiss ich sollte mehr mit klassen und funktionen arbeiten, damit es übersichtlicher wird):

    Quellcode

    1. string[] wort = new string[4]; //wörter
    2. wort[0] = "Schweiz";
    3. wort[1] = "England";
    4. wort[2] = "Spanien";
    5. wort[3] = 2010.ToString();
    6. Random _r = new Random(); //zufall definieren
    7. int a = _r.Next(0, 3);
    8. Console.WriteLine(wort[a]); //nur zum testen der überprüfung
    9. string Auswahl = wort[a]; //ausgewähltes wort in string speichern
    10. Console.ReadLine();
    11. Console.WriteLine("Schaffst du es mein ausgedachtes wort zu eraten, bevor das maennlein ganz am Galgen haengt?");
    12. Console.WriteLine("Gib einfach einen Buchstaben nach dem andern ein. Fals er vorhanden ist, wird er auftauchen, ansonsten wird das maennlein aufgebaut.");
    13. int l = wort.Length; //stringlänge als variable definieren
    14. string falsch = new string('.', 1); //ausgabe fals buchstabe nicht vorhanden ist als variable
    15. int i;
    16. int j;
    17. for (i = 0; i <= 7; i++)
    18. {
    19. string b = Console.ReadLine(); //Eingabe des users
    20. for (j = 0; j <= l; j++)
    21. {
    22. string loesung = Auswahl.Substring(j, j); //positionsauswahl des buchstaben der überprüft werden soll
    23. //string antwort = b.Substring(j, j); <- lass ich vorerst mal weg, macht nur probleme
    24. if (b == loesung) //überprüfung
    25. Console.WriteLine(loesung);
    26. else
    27. Console.WriteLine(falsch);
    28. }
    29. }
    30. Console.WriteLine("");
    31. Console.ReadLine();
    Alles anzeigen

    jedoch ist die ausgabe nicht wie erwartet... bei zufallswort schweiz, wenn ich da c eingebe kommt die ausgabe:
    .
    c
    .
    .
    wenn ich allerdings s eingebe kommt:
    .
    .
    .
    .
    sollte da nicht was kommen wie:
    s
    .
    .
    .
    .
    .
    danke schonmal
  • Bisher hatte ich keine fehlermeldungen, doch jetzt hab ich durch einen freund gesehen, dass das programm beim teil
    for(j,...) ein fehler erscheint, das es diesen schritt nicht machen kann. (Ich hab immer auf einer virtuellen maschine programmiert, er hat es dann lokal ausprobiert, daher vlt die nichterkennung des fehlers)
    Die ausgabe erscheint jedoch die selbe:
    .
    c
    .
    .
    Obwohl es den schritt ja nicht durchläuft... Komm da irgendwie nicht mehr ganz mit was ich da falsch gemacht hab.
  • SJay96 schrieb:

    ich weiss ich sollte mehr mit klassen und funktionen arbeiten, damit es übersichtlicher wird

    Das ist erstmal Wurst. Wenn es funktioniert, kannst du anfangen, OO zu betreiben.

    Quellcode

    1. wort[3] = 2010.ToString();

    :) Was spricht denn gegen wort[3] = "2012"?

    Quellcode

    1. Random _r = new Random(); //zufall definieren

    Nur als Hinweis: versuche deine Variablen nach einem einheitlichen Schema zu benennen. Mit/ohne Unterstrich, mit/ohne Präfix für Typ (strWort für String, arrWoerter für Array).

    Quellcode

    1. int l = wort.Length; //stringlänge als variable definieren

    Das ist nicht die Stringlänge deines ausgewählten Wortes, sondern die Anzahl deiner Wörter im Array. Du meinst wahrscheinlich Auswahl.length

    Quellcode

    1. int i;
    2. for (i = 0; i <= 7; i++)

    Mach da mal ein for (int i = 0; i <= 7; i++) draus. Bei der zweiten Schleife auch. Was bedeutet die 7 an der Stelle? Ist das die Anzahl der Versuche? Noch ein Hinweis: Vermeide Magic Numbers - Zahlen deren Bedeutung nicht klar ist. Besser eine entsprechende Konstante mit aussagekräftigem Namen nehmen.

    Quellcode

    1. string loesung = Auswahl.Substring(j, j); //positionsauswahl des buchstaben der überprüft werden soll

    Hier kann auch Auswahl[j] stehen.

    Quellcode

    1. Console.WriteLine(loesung);

    WriteLine gibt immer auch einen Zeilenumbruch aus, Console.Write wäre besser.

    Thomas
  • ok da sind ein paar sachen die einsichtig sind und ein paar neue. Danke
    ich probiers morgen mal aus und meld mich dann wieder. Und zu deiner
    Frage wegen der 7; ja aber da kommen dann die funktionsschritte der
    versuche ins spiel. Hab sie bereits gemacht. Das 2010.Tostring ist nur
    ein kleiner test ob dies auch gehen würde, für je nach dem die
    erweiterungen. Ich hab so das gefühl, dass die ausgabe noch nicht ganz
    stimmen wird aber mal sehen. Liebe grüsse
  • Kann mir jemand sagen warum hier die Fehlermeldung kommt, dass es die Länge überschreittet, obwohl ich in der for schleife angegeben habe, dass es nur so lange laufen soll wie j kleiner= der Wortlänge ist?

    Quellcode

    1. int l = Auswahl1.Length;
    2. Console.WriteLine("Die Wortlänge beträgt:", l,"Zeichen");
    3. string falsch = new string('.', 1);
    4. int i;
    5. int j;
    6. for (i = 0; i <= 7; i++)
    7. {
    8. char b = Convert.ToChar(Console.Read());
    9. for (j = 0; j <= l; j++)
    10. {
    11. char loesung = Auswahl1[j];
    12. //string antwort = b.Substring(i, i);
    13. if (b == loesung)
    14. Console.Write(loesung);
    15. else
    16. Console.Write(falsch);
    17. }
    18. }
    Alles anzeigen


    Ganzer Code:

    Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.IO;
    6. namespace ConsoleApplication1
    7. {
    8. class Program
    9. {
    10. public void schritt1()
    11. {
    12. Console.WriteLine("--------------------\n---------0----------\n--------------------\n--------------------\n--------------------\n--------------------");
    13. }
    14. public void schritt2()
    15. {
    16. Console.WriteLine("--------------------\n---------0----------\n---------|----------\n--------------------\n--------------------\n--------------------");
    17. }
    18. public void schritt3()
    19. {
    20. Console.WriteLine("--------------------\n---------0----------\n-------==|----------\n--------------------\n--------------------\n--------------------");
    21. }
    22. public void schritt4()
    23. {
    24. Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n--------------------\n--------------------\n--------------------");
    25. }
    26. public void schritt5()
    27. {
    28. Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n---------|----------\n--------------------\n--------------------");
    29. }
    30. public void schritt6()
    31. {
    32. Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n---------|----------\n--------I'----------\n--------------------");
    33. }
    34. public void schritt7()
    35. {
    36. Console.WriteLine("--------------------\n---------0----------\n-------==|==--------\n---------|----------\n--------I'I---------\n--------------------");
    37. Console.WriteLine("\n \n");
    38. }
    39. static void Main(string[] args)
    40. {
    41. int zahl;
    42. Console.WriteLine("Hallo, ich bin ein Programm! Versuch mich doch mal aus.");
    43. a:
    44. Console.WriteLine("Könntest du mir bitte mal eine Zahl eintippen zwischen 1000 und 15000.");
    45. zahl = int.Parse(Console.ReadLine());
    46. if (zahl > 1000 && zahl < 15000)
    47. Console.WriteLine("Okay die Zahl ist im erlaubten wertebereich.");
    48. else
    49. {
    50. Console.WriteLine("Es tut mir leid aber deine Zahl ist nicht im erlaubten Wertebereich. Bitte wähle eine andere");
    51. goto a;
    52. }
    53. Console.Clear();
    54. Console.WriteLine("Nun machen wir ein kleines Spiel daraus.");
    55. Console.WriteLine("Ueberleg dir mal ein paar Geburtsdaten deiner Verwandten. Danach drückst du ENTER");
    56. Console.ReadLine();
    57. Console.WriteLine("Diese Zahlen tippst du nun bitte mal gerade ein und drückst wieder ENTER.");
    58. Console.WriteLine("Danke. \n Nun überlegst du dir ein paar Tiere, die du kennst und magst.");
    59. Console.ReadLine();
    60. Console.WriteLine("Schreib sie auf!");
    61. Console.ReadLine();
    62. Console.WriteLine("Okey danke. Dann kommen wir zum hauptteil des Programms.");
    63. string[] wort = new string[4];
    64. wort[0] = "Schweiz";
    65. wort[1] = "England";
    66. wort[2] = "Spanien";
    67. wort[3] = 2012.ToString();
    68. Random r = new Random();
    69. int a = r.Next(0, 3);
    70. Console.WriteLine(wort[a]);
    71. string Auswahl = wort[a];
    72. char[] Auswahl1 = Auswahl.ToCharArray();
    73. Console.ReadLine();
    74. Console.WriteLine("Schaffst du es mein ausgedachtes wort zu eraten, bevor das maennlein ganz am Galgen haengt?");
    75. Console.WriteLine("Gib einfach einen Buchstaben nach dem andern ein. Fals er vorhanden ist, wird er auftauchen, ansonsten wird das maennlein aufgebaut.");
    76. int l = Auswahl1.Length;
    77. Console.WriteLine("Die Wortlänge beträgt:", l,"Zeichen");
    78. string falsch = new string('.', 1);
    79. int i;
    80. int j;
    81. for (i = 0; i <= 7; i++)
    82. {
    83. char b = Convert.ToChar(Console.Read());
    84. for (j = 0; j <= l; j++)
    85. {
    86. char loesung = Auswahl1[j];
    87. //string antwort = b.Substring(i, i);
    88. if (b == loesung)
    89. Console.Write(loesung);
    90. else
    91. Console.Write(falsch);
    92. }
    93. }
    94. Console.WriteLine("");
    95. Console.ReadLine();
    96. }
    97. }
    98. }
    Alles anzeigen