Laden...

problem mit variable

Erstellt von sepp_a_u vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.926 Views
S
sepp_a_u Themenstarter:in
70 Beiträge seit 2007
vor 16 Jahren
problem mit variable

hi @ all

bin nun kurz davor mein kl. schere - stein - papier - spiel fertig zu stellen. jedoch hab ich noch einen kl. fehler gefunden, den ich irgendwie nicht beheben kann 🙁

using System;

class spiel
{
    static void Main()
    {
        string name; //varibable um den namen des spielers zu erfragen und wiederzugeben
        string eingabe; //variable eingabe, für den wert den der spieler eingibt
        int zufallszahl; //variable für zufallszahl, die fürn den pc integriert wird
        int runden; //Variable für angabe der rundenanzahl
        int sieg_pc = 0;
        int sieg_mensch = 0;

        Console.WriteLine("Herzlich Willkommen zum Schere-Stein-Papier-Duell mit Ihrem PC! \n");
        Console.WriteLine("Wie lautet Ihr Name? ");
        name = Console.ReadLine();
        Console.WriteLine("Viel Spaß beim Spiel {0}! \n", name);
        Console.WriteLine("Um das Spiel zu beginnen drücken Sie bitte eine beliebige Taste");
        Console.ReadLine(); //Um Tastendruck abzuwarten
        Console.WriteLine("Wie viele Runden möchtest du spielen, {0}?", name);
        runden = Console.Read();
        Console.WriteLine("Alles klar...es werden nun also {0} Runden gespielt", runden);
        Console.ReadLine();

        for (int i = 0; i < runden; i++)
        {
            Console.WriteLine("Bitte wähle nun deinen Spielgegenstand {0}: \n Schere = 1 \n Stein = 2 \n Papier = 3", name);
            eingabe = Console.ReadLine();
            zufallszahl = new Random().Next(1, 4);  //Computer wählt zufällig zw. 1 und 3 aus

            switch (zufallszahl)
            {
                case 1: Console.WriteLine("Der Computer hat Schere gewaehlt");
                    if (eingabe == "1")
                    {
                        Console.WriteLine("Schere vs. Schwere...Unentschieden!");
                        sieg_mensch++;
                        sieg_pc++;
                    }
                    else if (eingabe == "2")
                    {
                        Console.WriteLine("Schere vs. Stein...{0} hat gewonnen!", name);
                        sieg_mensch++;
                    }
                    else
                    {
                        Console.WriteLine("Schere vs. Papier...{0} hat verloren!", name);
                        sieg_pc++;
                    }
                    break;

                case 2: Console.WriteLine("Der Computer hat Stein gewaehlt");
                    if (eingabe == "1")
                    {
                        Console.WriteLine("Stein vs. Schwere...{0} hat verloren!", name);
                        sieg_pc++;
                    }
                    else if (eingabe == "2")
                    {
                        Console.WriteLine("Stein vs. Stein...Unentschieden!");
                        sieg_pc++;
                        sieg_mensch++;
                    }
                    else
                    {
                        Console.WriteLine("Stein vs. Papier...{0} hat gewonnen!", name);
                        sieg_mensch++;
                    }
                    break;

                case 3: Console.WriteLine("Der Computer hat Papier gewaehlt");
                    if (eingabe == "1")
                    {
                        Console.WriteLine("Papier vs. Schwere...{0} hat gewonnen!", name);
                        sieg_mensch++;
                    }
                    else if (eingabe == "2")
                    {
                        Console.WriteLine("Papier vs. Stein...{0} hat verloren!", name);
                        sieg_pc++;
                    }
                    else
                    {
                        Console.WriteLine("Papier vs. Papier...Unentschieden!");
                        sieg_pc++;
                        sieg_mensch++;
                    }
                    break;

                default: Console.WriteLine("Ungueltige Auswahl! Waehle bitte 1, 2 oder 3 aus!");
                    break;
            }
        }
        if (sieg_mensch < sieg_pc)
        {
            Console.WriteLine("Schade {0}, du hast leider mit {1} : {2} verloren", name, sieg_pc, sieg_mensch);
        }
        else if (sieg_mensch > sieg_pc)
        {
            Console.WriteLine("Herzlichen Glückwunsch {0}! Du hast das Spiel mit {1} : {2} gewonnen", name, sieg_mensch, sieg_pc);
        }
        else
        {
            Console.WriteLine("Unentschieden. Ihr habt beide {0} Runden gewonnen.", sieg_pc);
        }
        Console.ReadLine();
         
    }
}

das problem:

wenn ich das spiel nun starte, ist alles ok. aber wenn es dann zur rundenanzahl abfrage kommt, dann "spinnt" es irgendwie. wenn ich "1" eingebe gibt er dann aus, dass 49 runden gespielt werden. und wenn ich "0" eingeben werden 48 runden gespielt. warum denn das? versteh nicht war er das macht 🙁 könnte natürlich oben dann noch bei der rundenanzahl -48 machen aber das ist ja nicht der sinn der sache oder? muss doch auch anders gehen

mfg

J
193 Beiträge seit 2007
vor 16 Jahren

Ich vermute mal, dass irgendwie die Zahl umgewandelt wird.

Vergleich mal die Werte in einer ASCII-Tabelle (http://en.wikipedia.org/wiki/ASCII). Dort wirst du feststellen, dass 0 den Wert 48 hat und 1 den Wert 49.

edit: Benutz für die Runden bei der Ausgabe den Befehl runden.ToString(). Vielleicht wird es damit behoben.

Jack

S
sepp_a_u Themenstarter:in
70 Beiträge seit 2007
vor 16 Jahren

danke für die antwort. aber irgendwie geht es mit dem auch nicht. oder ich weiß nicht recht wie ich es einbauen soll.

aber soviele möglichkeiten gibts gar nicht und daher denke ich, dass ich es nicht falsch machen werden. auf jeden fall gehts nicht 🙁
weiß jmd wie der code aussehen müsste bei der rundenanzahlabfrage und wenn ja warum genauso?

mfg

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo sepp_a_u,

schaue dir einmal diese Zeile an:


runden = Console.Read();

und dazu die :rtfm: zu Console.Read() an. Dem Beispiel solltest du die Lösung für dein Problem entnehmen können.

Genau in dieser Zeile passiert das, was Jack_AI angesprochen hat.

//EDIT: Die Doku empfiehlt außerdem, lieber die ReadKey oder ReadLine - Methode zu verwenden.

849 Beiträge seit 2006
vor 16 Jahren

Int.Parse("1"); ....

S
sepp_a_u Themenstarter:in
70 Beiträge seit 2007
vor 16 Jahren

leider kann ich keine lösung finden 🙁 schade

mfg

W
558 Beiträge seit 2006
vor 16 Jahren

Das ASCII-Problem tritt nicht auf, wenn du einen String (anstatt eines Char) in eine Zahl konvertierst. Füge vor der Zu-Int-Konvertierung also noch .ToString() ein und es müsste klappen (wenn ich das Problem richtig verstanden habe).

mfg
webstarg

S
sepp_a_u Themenstarter:in
70 Beiträge seit 2007
vor 16 Jahren

nee es klappt auch nicht. habe das jetzt so gemacht aber es funktioniert immernoch nicht:


static void Main()
    {
        string name; //varibable um den namen des spielers zu erfragen und wiederzugeben
        string eingabe; //variable eingabe, für den wert den der spieler eingibt
        int zufallszahl; //variable für zufallszahl, die fürn den pc integriert wird
        int runden = 0; //Variable für angabe der rundenanzahl
        int sieg_pc = 0;
        int sieg_mensch = 0;
        string menue;

        Console.WriteLine("Herzlich Willkommen zum Schere-Stein-Papier-Duell mit Ihrem PC! \n");
        Console.WriteLine("Wie lautet Ihr Name? ");
        name = Console.ReadLine();
        Console.WriteLine("Viel Spaß beim Spiel {0}! \n", name);
        Console.WriteLine("Um das Spiel zu beginnen drücken Sie bitte eine beliebige Taste");
        Console.ReadLine(); //Um Tastendruck abzuwarten
        Console.WriteLine("Wie viele Runden möchtest du spielen, {0}?", name);
        runden.ToString();
        runden = Console.Read();
        Console.WriteLine("Alles klar...es werden nun also {0} Runden gespielt", runden);
        Console.ReadLine();
               
        for (int i = 0; i < runden; i++)
        {
            Console.WriteLine("Bitte wähle nun deinen Spielgegenstand {0}: \n Schere = 1 \n Stein = 2 \n Papier = 3", name);
            eingabe = Console.ReadLine();
            zufallszahl = new Random().Next(1, 4);  //Computer wählt zufällig zw. 1 und 3 aus

ich dreh jetzt leider bald durch..will mein erstes kl. projekt jtezt endlich fertig stellen 🙂

mfg

630 Beiträge seit 2007
vor 16 Jahren

Console.Read() bzw. Console.ReadLine() geben char bzw. strings zurück. Die Variable "runden" ist aber ein int!

To understand recursion you must first understand recursion

http://www.ilja-neumann.com
C# Gruppe bei last.fm

S
sepp_a_u Themenstarter:in
70 Beiträge seit 2007
vor 16 Jahren

Original von tscherno
Console.Read() bzw. Console.ReadLine() geben char bzw. strings zurück. Die Variable "runden" ist aber ein int!

aber wenn ich runden als char definiere, dann kommt immer eine fehlermeldung:

Fehler 1 Der Typ "int" kann nicht implizit in "char" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.) D:\CSharp\schere-stein-papier\schere-stein-papier\CodeFile1.cs 24 18 schere-stein-papier

diese fehlermeldung zeigt er bei stelle an, wo die rundenanzahl eingelesen werden soll.

mfg

5.742 Beiträge seit 2007
vor 16 Jahren

Hallo sepp_a_u,

bitte lies dir noch einmal die ersten paar Kapitel aus dem openbook durch!

W
558 Beiträge seit 2006
vor 16 Jahren

Hallo sepp_a_u,

wie dir von anderen bereits mitgeteilt wurde, empfehle auch ich dir, Console.ReadLine() anstatt Console.Read() für das Einlesen der Rundenanzahl zu verwenden. Was, wenn der User 10 Runden (oder jede andere Zahl, die mehr als 1 Stelle hat) spielen möchte?

Oh, jetzt verstehe ich erst das Problem. 8o

Nimm das ToString() raus; dort wo du es hingegeben hast ist es total sinnlos. Es wandelt 0 (ist der enthaltene Wert der Variable runden) zu "0" um, verwendet den Rückgabewert aber nicht.

Die Zeile runde = Console.Read(); ersetzt du mit Convert.ToInt32(Console.ReadLine());
(Oder mit der Methode Int32.Parse oder TryParse oder was auch immer).

Unterschied: Console.Read() speichert den Index des eingegebenen Zeichen in deine int-Variable. Und 1 ist anscheinend auf Index 49.
Mit Convert.ToInt32(...:
Das wird von innen nach außen abgearbeitet: Zuerst wird die Zeile, die der Benutzer geschrieben hat, eingelesen, dann wird sie zum Typ Int umgewandelt und dann in die Variable gespeichert.

(btw: Console.Read() liest ein Zeichen ein, Console.ReadLine() eine ganze Zeile (bzw. bis der User Enter drückt))

Auch Grundlagen...

grüße
webstarg

S
sepp_a_u Themenstarter:in
70 Beiträge seit 2007
vor 16 Jahren

danke @ webstarg

jetzt geht es endlich 🙂 ich hab es zwar immernoch nicht richtig verstanden warum es jetzt geht und davor nicht...denn jtezt ist es ja immernoch ein int oder nicht? hmm...danke auf jeden fall 🙂

mfg

P.S.: Spiel fertig!!