Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
problem mit variable
sepp_a_u
myCSharp.de - Member



Dabei seit:
Beiträge: 71
Herkunft: nähe Freiburg i.Br.

Themenstarter:

problem mit variable

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von sepp_a_u am .
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
sepp_a_u
myCSharp.de - Member



Dabei seit:
Beiträge: 71
Herkunft: nähe Freiburg i.Br.

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von sepp_a_u am .
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von winSharp93 am .
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

Int.Parse("1"); ....
private Nachricht | Beiträge des Benutzers
sepp_a_u
myCSharp.de - Member



Dabei seit:
Beiträge: 71
Herkunft: nähe Freiburg i.Br.

Themenstarter:

beantworten | zitieren | melden

leider kann ich keine lösung finden schade

mfg
private Nachricht | Beiträge des Benutzers
webstarg
myCSharp.de - Member



Dabei seit:
Beiträge: 562
Herkunft: München, Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sepp_a_u
myCSharp.de - Member



Dabei seit:
Beiträge: 71
Herkunft: nähe Freiburg i.Br.

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tscherno
myCSharp.de - Member

Avatar #avatar-2584.gif


Dabei seit:
Beiträge: 637
Herkunft: Nürnberger Land

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sepp_a_u
myCSharp.de - Member



Dabei seit:
Beiträge: 71
Herkunft: nähe Freiburg i.Br.

Themenstarter:

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 6155
Herkunft: Stuttgart

beantworten | zitieren | melden

Hallo sepp_a_u,

bitte lies dir noch einmal die ersten paar Kapitel aus dem openbook durch!
private Nachricht | Beiträge des Benutzers
webstarg
myCSharp.de - Member



Dabei seit:
Beiträge: 562
Herkunft: München, Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sepp_a_u
myCSharp.de - Member



Dabei seit:
Beiträge: 71
Herkunft: nähe Freiburg i.Br.

Themenstarter:

beantworten | zitieren | melden

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!!
private Nachricht | Beiträge des Benutzers