Entwickler-Ecke

Sonstiges (.NET) - Mastermind Konsolenanwendung


hlwgole - Do 19.09.19 11:31
Titel: Mastermind Konsolenanwendung
Moin!

Ich habe vor ca. 1 Monat mit dem Programmieren begonnen & hatte davor noch keinerlei Ahnung.

Ich weiß das ich in dem Code den ich gleich präsentiere deutlich leichtere Wege hätte gehen können.

Aber wir sollen erstmal mit dem Arbeiten was wir in der Schule beigebracht bekommen haben.

[MEIN PROBLEM]

Es hapert bei mir in der Ausgabe, wenn es bei Mastermind darum geht:

Richtige Position & Richtige Farbe = 0
Richtige Farbe & Falsche Position = x

Leider gibt er mir manches doppelt aus und total durcheinander. Habe auch schon echt alles Versucht, aber es wurde nur noch komplizierter.

Vielleicht kann mir ja hier jemand etwas behilflich sein. : )

Meine Eingabe Methode:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
        public static void SpielerEingabe(string[] zufallsFarben)
        {
            Console.Clear();
            Console.WriteLine("Geben Sie 4 Zahlen ein für die jeweiligen Farben:\n");
            Console.WriteLine("1 = Gelb\n2 = Blau\n3 = Rot\n4 = Lila\n5 = Weiß\n6 = Grau\n7 = Grün\n8 = Orange\n");

            int[] eingabeZahlen = new int[4];
            string[] eingabeFarben = new string[4];
            
            for (int counter = 0; counter < 4; counter++)
            {
                string eingabe = Console.ReadLine();

                int zahl = 0;

                if (int.TryParse(eingabe, out zahl))
                {
                    eingabeZahlen[counter] = zahl;   
                }
                switch (eingabeZahlen[counter])
                {
                    case 1:
                        eingabeFarben[counter] = "Gelb";
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine("= Gelb\n");
                        Console.ResetColor();
                        break;
                    case 2:
                        eingabeFarben[counter] = "Blau";
                        Console.ForegroundColor = ConsoleColor.Blue;
                        Console.WriteLine("= Blau\n");
                        Console.ResetColor();
                        break;
                    case 3:
                        eingabeFarben[counter] = "Rot";
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("= Rot\n");
                        Console.ResetColor();
                        break;
                    case 4:
                        eingabeFarben[counter] = "Lila";
                        Console.ForegroundColor = ConsoleColor.DarkMagenta;
                        Console.WriteLine("= Lila\n");
                        Console.ResetColor();
                        break;
                    case 5:
                        eingabeFarben[counter] = "Weiß";
                        Console.ForegroundColor = ConsoleColor.White;
                        Console.WriteLine("= Weiß\n");
                        Console.ResetColor();
                        break;
                    case 6:
                        eingabeFarben[counter] = "Grau";
                        Console.ForegroundColor = ConsoleColor.Gray;
                        Console.WriteLine("= Grau\n");
                        Console.ResetColor();
                        break;
                    case 7:
                        eingabeFarben[counter] = "Grün";
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine("= Grün\n");
                        Console.ResetColor();
                        break;
                    case 8:
                        eingabeFarben[counter] = "Orange";
                        Console.ForegroundColor = ConsoleColor.DarkYellow;
                        Console.WriteLine("= Orange\n");
                        Console.ResetColor();
                        break;
                    default:
                        Console.Write("");
                        Console.WriteLine("Eingabe Parameter inkorrekt!\n");
                        Console.ReadLine();
                        SpielerEingabe(zufallsFarben);
                        break;
                }
            }
            EingabeMitErgebnisVergleichen(zufallsFarben, eingabeFarben);
        }

und das ist die Vergleichsmethode:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
        public static void EingabeMitErgebnisVergleichen(string[] zufallsfarben, string[] eingabefarben)
        {
            for (int counter = 0; counter < 4; counter++)
            {
                if (eingabefarben[counter] == zufallsfarben[0])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Richtige Position = " + eingabefarben[0]);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("O\n");
                    Console.ResetColor();
                }
                else if (eingabefarben[counter] == zufallsfarben[1] || eingabefarben[counter] == zufallsfarben[2] || eingabefarben[counter] == zufallsfarben[3])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Falsche Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                    Console.WriteLine("X\n");
                    Console.ResetColor();
                }
                if (eingabefarben[counter] == zufallsfarben[1])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Richtige Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("O\n");
                    Console.ResetColor();
                }
                else if (eingabefarben[counter] == zufallsfarben[0] || eingabefarben[counter] == zufallsfarben[2] || eingabefarben[counter] == zufallsfarben[3])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Falsche Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                    Console.WriteLine("X\n");
                    Console.ResetColor();
                }
                if (eingabefarben[counter] == zufallsfarben[2])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Richtige Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("O\n");
                    Console.ResetColor();

                }
                else if (eingabefarben[counter] == zufallsfarben[0] || eingabefarben[counter] == zufallsfarben[1] || eingabefarben[counter] == zufallsfarben[3])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Falsche Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                    Console.WriteLine("X\n");
                    Console.ResetColor();
                }
                if (eingabefarben[counter] == zufallsfarben[3])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Richtige Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("O\n");
                    Console.ResetColor();
                }
                else if (eingabefarben[counter] == zufallsfarben[0] || eingabefarben[counter] == zufallsfarben[1] || eingabefarben[counter] == zufallsfarben[2])
                {
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Richtige Farbe | Falsche Position = " + eingabefarben[counter]);
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                    Console.WriteLine("X\n");
                    Console.ResetColor();
                }
                else
                {
                    Console.Write("");
                    Console.WriteLine("___________________________");
                    Console.WriteLine("Leider kein Treffefer gelandet.\n");
                }
            }
        }


Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Moderiert von user profile iconTh69: Topic aus WinForms verschoben am Do 19.09.2019 um 12:55


Th69 - Do 19.09.19 12:47

Hallo und :welcome:

du müßtest doch bisher 16 (anstatt nur 4) Kreuze bzw. Kreise angezeigt bekommen?!
Überlege dir bei deiner Vergleichsmethode noch mal die if-Abfragen in Verbindung mit dem Zähler counter der Schleife.
Oder anders gefragt: Warum hast du 4 mal ein if-else-Konstrukt dort?


hlwgole - Do 19.09.19 13:34

Hallo Th69,

ich hab dort 4 mal ein if-else, weil ich eigentlich dachte, wenn der Rote Pin kein Treffer hat das er dann somit die anderen Position vergleicht die halt die richtige farbe haben, aber eine andere Position. Aber ich habe mir schon gedacht das dort irgendwas falsch ist in diesem Konstrukt.


Th69 - Do 19.09.19 14:04

Wie wäre es mit

C#-Quelltext
1:
if (eingabefarben[counter] == zufallsfarben[counter])                    
?
Und die restlichen if-else-Konstrukte dann löschen.
Den else-Teil überlasse ich dir dann als Restaufgabe. ;-)


hlwgole - Do 19.09.19 14:50

Okay cool danke!

Eine weitere Frage hätte ich noch.. mir fehlt noch die versuchsanzahl auf 3 zu bestimmen, und eigentlich müsste ich es ja in die Spielereingabe einbauen, aber egal wie ich es wende und drehe es funktioniert ebenfalls nicht. :s


Th69 - Fr 20.09.19 10:03

Du meinst die Anzahl der maximalen Versuche auf 3 zu begrenzen (ich kenne es mit mehr, laut Mastermind (Spiel) [https://de.wikipedia.org/wiki/Mastermind_(Spiel)] sind es original sogar 12).
Dann würde ich eine zusätzliche Methode schreiben, welche dann intern SpielerEingabe aufruft - dazu solltest du dann noch ermitteln (z.B. bool als Rückgabewert, ob der Spieler korrekt alle 4 Farben erraten hat).