C# :: Aufgabe #106 :: Lösung #5

10 Lösungen Lösungen öffentlich
#106

Stein, Papier, Schere, Echse, Spock

Anfänger - C# von Energy - 24.09.2015 um 15:22 Uhr
Programmiere das Spiel Stein, Papier, Schere, Echse, Spock, sodass man selbst eine Figur auswählen kann und der Computer eine zufällige Figur auswählt. Ermittele dann, wer diese Partie gewonnen hat.
#5
4 Kommentare
vote_ok
von Chrysalis (70 Punkte) - 03.10.2015 um 10:40 Uhr
Lösung mit Enums und Geprüfter Eingabe in .NET 4.5.2
Quellcode ausblenden C#-Code
using System;
using System.Collections.Generic;

namespace SpockEchse
{
    class Program
    {
        public enum Hand
        {
            Exit = 0,
            Stein = 1,
            Papier = 2,
            Schere = 3,
            Echse = 4,
            Spock = 5
        }
        static void Main(string[] args)
        {
            var WennSchlageIchDict = new Dictionary<Hand, List<Hand>>()
            {
                { Hand.Stein, new List<Hand> {Hand.Echse, Hand.Schere } },
                { Hand.Papier, new List<Hand> {Hand.Stein, Hand.Spock} },
                { Hand.Schere, new List<Hand> {Hand.Echse, Hand.Papier } },
                { Hand.Echse, new List<Hand> {Hand.Spock, Hand.Papier } },
                { Hand.Spock, new List<Hand> {Hand.Stein, Hand.Schere } },
            };
            foreach (Hand loop in Enum.GetValues(typeof(Hand)))
                Console.WriteLine($"{(int)loop} {loop}");

            string inLine;
            while (!string.IsNullOrEmpty(inLine = Console.ReadLine()))
            {
                Hand handSpieler;
                if (inLine.Length > 1) //Text wandeln das genau der 1 Buchstabe im Wort gross ist.
                    inLine = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(inLine.ToLower());

                //Enum Parsen und prüfen ob das Ergebnis gültig ist.
                if (!Enum.TryParse(inLine, out handSpieler) || !Enum.IsDefined(typeof(Hand), handSpieler))
                {
                    Console.WriteLine($"Eingabe '{inLine}' konnte nicht erkannt werden.");
                    continue;
                }
                if (handSpieler == Hand.Exit)
                    break;

                Hand handNpc = (Hand)new Random().Next(1, 6);

                if (handNpc == handSpieler)
                    Console.WriteLine("Unentschieden");
                else if (WennSchlageIchDict[handSpieler].Contains(handNpc))
                    Console.WriteLine($"Du hast gegen {handNpc} gewonnen, weiter so.");
                else
                    Console.WriteLine($"Du hast gegen {handNpc} verloren, beim nächsten mal hast du mehr Glück.");
            }
        }
    }
}

Kommentare:

Mentalist999

Punkte: 680


21 Lösungen
50 Kommentare

#1
27.10.2015 um 18:38 Uhr
Mir gefällt Deine Lösung zwar nicht und mir ist auch nicht ganz klar, wozu Du in diesem Lösungsansatz einen Enum brauchst, aber ich finde Deine Denkansätze sehr gut und interessant. :)

Ich gehe mal stark davon aus, dass Du kein native C#'ler bist, da Deine Konsolenausgaben in C# so nicht funktionieren und die $-Zeichen da auch überhaupt nichts verloren haben. ^^

Ich würde mich aber sehr freuen, wenn Du mir mal eine Nachricht schreibst und Wir uns ein wenig unterhalten können, ich finde wie gesagt Deine Denkansätze ziemlich gut. :)

Schreib mir doch einfach mal in Skype ...
Samuelwill999 heiße ich dort. :)

post_arrow
220 0

Mentalist999

Punkte: 680


21 Lösungen
50 Kommentare

#2
27.10.2015 um 18:52 Uhr
Also schau, in Deiner Konsolenausgabe kannst Du Variablen auf 2 Arten einfügen.

Nr. 1
Quellcode ausblenden C#-Code
string Name = "Martin";

Console.WriteLine("Mein Name ist " + Name);


Nr. 2
Quellcode ausblenden C#-Code
string Name = "Martin";

Console.WriteLine("Mein Name ist {0}", Name);


Das $-Zeichen hat da wie gesagt gar nichts zu suchen und führt einfach zu einem Kompilierfehler.
Deine {VariablenName} versuche werden auch nicht aufgelöst und einfach nur als String verstanden.
D.h. genau so ausgegeben wie Du es dort geschrieben hast.
Der versuchte Cast innerhalb der Ausgabe macht auch keinen Sinn, da automatisch die ToString()-Methode jedes Objekts aufgerufen wird, dass Du in der Konsole ausgeben willst. Es wird also letztendlich immer zum String umgewandelt, andernfalls bist Du nicht in der Lage es auszugeben.
Arithemische Operationen innerhalb der WriteLine()-Methode sind zwar möglich, aber auch nur weil die ToString()-Methode des Ergebnisses der Operation dann aufgerufen wird.

Also z.b. so etwas :

Quellcode ausblenden C#-Code
string Name = "Martin";
int Alter = 25;

Console.WriteLine("Mein Name ist " + Name + " und ich bin " + (Alter + 1) + " Jahre alt.");

// Oder eben so :

Console.WriteLine("Mein Name ist {0} und ich bin {1} Jahre alt.", Name, Alter + 1);


In diesem Sinne ..
Vergiss nicht mir mal zu schreiben! :)

Liebe Grüße
post_arrow
221 0

Chrysalis

Punkte: 70


2 Lösungen
4 Kommentare

#3
28.10.2015 um 22:21 Uhr
Das $ Zeichen hat seit C# 6.0 eine weitere bedeutung, es geht um String Interpolation .
Das ganze wird aber nativ erst ab Visual Studio 2015 unterstützt, deshalb kommt bei dir wohl eine Fehlermeldung. Für VS 2013 gibt es aber ein NuGet packet zum nachrüsten^^


Was die Enums angeht: Damit habe ich Typensicherheit, sprich eine 'Schere' ist immer eine 'Schere' und 'Spock' immer 'Spock'. Das kann insbesondere beim Programmieren helfen, da man dadurch sämtliche verweise der entsprechenden Hand findet.
Bei so einem kleinen Projekt mag dies etwas unsinnig erscheinen, bei grösseren macht das aber sehr viel aus was Lesbarkeit und Wartbarkeit angeht.
Ausserdem nimmt mir das Enum den grossen Teil der Eingabenvalidierung ab, Ich muss nur noch prüfen ob die Konvertierung in das Enum erfolgreich und gültig ist.
post_arrow
222 0

Mentalist999

Punkte: 680


21 Lösungen
50 Kommentare

#4
28.10.2015 um 23:33 Uhr
Ja, bei näherer Überlegung hast Du schon Recht, ein Enum bietet sich auch bei diesem Lösungsansatz an.
Das mit der String Interpolation finde ich ziemlich interessant, muss ich sagen. :)
Das werde ich mir auf jedenfall mal näher anschauen.

Hattest Du nun nichtmehr vor mir zu schreiben, oder wie soll ich das schweigen dazu verstehen? :P

Gruß
post_arrow
223 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben