Autor Beitrag
Firefox977
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 30.11.15 17:43 
Hallo,

ich habe eine wichtige Frage. Ich schreibe in ein paar Tagen eine Klausur in Informatik und mein Lehrer hat gesagt das "Mastermind" zu programmieren die perfekte Vorbereitung wäre. Jedoch weiß ich nicht genau wie das geht. Ich soll mithilfe eines zwei-dimensionalen Arrays dieses Spiel programmieren. Eine einfache Konsolenanwendung in C# reicht aus.

Es sollen 4 Spalten und 10 Reihen geben. Die zueratenen Zahlen sollen per Zufall bestimmt werden. Ich verlange keine Lösung, aber dafür ein wenig Hilfestellung da ich alleine nicht weiter komme und die Klausur sonst verhaue :/

Hier ist der Anfang den ich bisher geschafft habe:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
namespace Mastermind
{
    class Program
    {
        static void Main(string[] args)
        {

            int[] zahlen = new int[4,4];
            Random zufall = new Random();

            for (int i = 0; i < zahlen; i++)

                zahlen[i] = random.Next;       
        }
    }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 30.11.15 17:58 
Wir helfen gern. Am anfang mit ein paar Rückfragen die dich hoffentlich in die richtige Richtung schubsen.

Zitat:
ausblenden C#-Quelltext
1:
int[] zahlen = new int[4,4];					


Du hast 4 Farben und mit denen sollst du maximal 10 mal vergleichen können. Wofür brauchst du ein 4*4 Array? (Nebenbei du definierst zahlen 1-dimensional und weist dem ein 2-dimensionales Array zu das mag der Compiler eher nicht).

Zitat:
ausblenden C#-Quelltext
1:
2:
for (int i = 0; i < zahlen; i++)
   zahlen[i] = random.Next;


Zahlen ist ja vermutlich dein Spielfeld. Warum willst du da Zahlen/Farben zufällig reinschreiben? Solltest du dir nicht woanders diese zufälligen 4 Farben merken um nacher damit zu vergleichen wenn ein Spieler was in deine zahlen Spielfeld eingetragen hat (was er strategisch machen sollte und eher nicht zufällig)?

Für diesen Beitrag haben gedankt: Firefox977
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 30.11.15 18:14 
Ursprünglich sollten wir 4 Spalten zufällig bestimmen. Nur statt Farben mit zahlen. Danach hat man 10 versuche diese Zahlen zu erraten, ich dachte das es mit 4 mal raten einfacher ist zu programmieren.(deswegen der 4*4 Array). Und wie definiert man den Zahlen 2 dimensional? Das ist wahrscheinlich der Punkt der mir unklar ist..




Und die Zahlen sollen zufällig bestimmt werden, die der Spieler dann erraten muss. Und das die zufälligen zahlen sich der Computer merken soll fehlt noch
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 30.11.15 18:22 
Zitat:
Und wie definiert man den Zahlen 2 dimensional? Das ist wahrscheinlich der Punkt der mir unklar ist..

Guckst du Doku ;)
Wenn ein 2-d Array in der Aufgabe benutzt werden soll dann solltet ihr über sowas aber doch schonmal im Unterricht sinniert haben :gruebel:

Für diesen Beitrag haben gedankt: Firefox977
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 30.11.15 18:42 
Hmm im Grunde haben wir da auch nicht drüber geredet. Mein Lehrer meinte das wir das mit einem 2 dimensionalen Array versuchen sollen.. Mir ist nur leider die ganze Sache sehr unklar, weswegen ich nicht genau weis ich anfangen soll das Programme zu schreiben 😏
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 30.11.15 19:12 
Wenn du keinen Überblick über das ganze Problem hast dann bricht das ganze Ding in kleinere einzeln lösbare Probleme auf und löse diese.

a.) irgendwo mußt du dir die ausgewürfelte Vorlage mit den 4 Farben merken (.z.b. in einem normalen 1-D Array)
b.) du mußt den Spieler irgendwie 4 Farben eingeben lassen
c.) du mußt die eingegeben Farben irgendwo ablegen (z.B. im erwähnten 2-D Array)
d.) du mußt die Vorlage aus a.) mit der aktuellen eingegeben Zeile vergleichen
e.) du mußt dem Spieler das Ergebnis aus d.) anzeigen
f.) du entscheiden ob der Spieler gewonnnen hat (gratulieren), weiter spielen darf (auf nach b.) oder dem Spieler bescheid sagen das sein 10. Versuche aufgebraucht sind (bedauern)



a.) hast du schon fast mit dem gezeigten Code.

Für diesen Beitrag haben gedankt: Firefox977
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 01.12.15 08:10 
Vielen Dank für diesen guten Tipp! Ich habe mich nochmal an die Aufgabe herangewagt und bin ein Stück weiter gekommen. Ich bin mir mit dem "for" nur sehr unsicher und wie dem "random". So ganz verstanden habe ich das nicht..
ausblenden volle Höhe 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:
int[] zahlen = new int[4]; 
Random zufall = new Random(); 
string Eingabe; 
int Zahl0; 
int Zahl1; 
int Zahl2; 
int Zahl3; 
int weiss=0//wie viele Positionen richtig sind 
int schwarz = 0//wie viele Farben richtig sind 
int Versuche; //Anzahl der Versuche 

for (int i = 0; i < zahlen; i++) 

zahlen[i] = random.Next; 
Console.ReadLine(); 

do 

Console.WriteLine("Bitte geben Sie 4 Zahlen ein"); 
Eingabe = Console.ReadLine(); 
Zahl0 = Convert.ToInt32(Eingabe); 

Eingabe = Console.ReadLine(); 
Zahl1 = Convert.ToInt32(Eingabe); 

Eingabe = Console.ReadLine(); 
Zahl2 = Convert.ToInt32(Eingabe); 

Eingabe = Console.ReadLine(); 
Zahl3 = Convert.ToInt32(Eingabe); 

if (Zahl0 == zahlen[0])weiss++; 
else if (Zahl0 == zahlen[1] || Zahl0 == zahlen[2] || Zahl0 == zahlen[3])schwarz++; 

if (Zahl1 == zahlen[1])weiss++; 
else if (Zahl1 == zahlen[0] || Zahl1 == zahlen[2] || Zahl1 == zahlen[3])schwarz++; 

if (Zahl2 == zahlen[2])weiss++; 
else if (Zahl2 == zahlen[0] || Zahl2 == zahlen[1] || Zahl2 == zahlen[3])schwarz++; 

if (Zahl3 == zahlen[3])weiss++; 
else if (Zahl3 == zahlen[0] || Zahl3 == zahlen[1] || Zahl3 == zahlen[2])schwarz++; 

Console.WriteLine("Sie haben {0} Positionen richtig und {1} Zahlen richtig",weiss, schwarz); 

if (weiss == 4

Console.WriteLine("\nGratuliere, Sie haben gewonnen"); 

else Versuche++; 

if ( Versuche == 10

Console.WriteLine("Sie haben verloren"); 



while (weiss != 4



}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 01.12.15 11:14 
Zitat:
Ich bin mir mit dem "for" nur sehr unsicher.

Zitat:
ausblenden C#-Quelltext
1:
2:
3:
4:
Random zufall = new Random();
...
for (int i = 0; i < zahlen; i++)
    zahlen[i] = random.Next;


- Deine Variable der Klasse Random heißt zufall nicht random.
- Next ist eine Funktion der Klasse also gehören da () hin.
- Der Vergleich i < zahlen macht wenig sinn. Was soll bei einem Vergleich Zahl < Array rauskommen?
Du willst alle Stellen im Array durchgehen also interessiert dich die Länge des Array damit du die Stellen 0,1,2,3 für i durchgehen kannst. Du solltest also mit zahlen.Length (die 4 ist) vergleichen udn solange die for Schleife ausführen wie i kleiner zahlen.Length ist.

Für diesen Beitrag haben gedankt: Firefox977
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Di 01.12.15 12:37 
Danke für die zeitige Antwort, ich habe das Programm überarbeitet und jetzt funktioniert es schon mal!! Trotzdem ist mir ein Logik Fehler aufgefallen.. Falls man im 1. Rate Versuch 2 Richtige Zahlen errät, dann speichert er "schwarz = 2". Wenn man dann im 2. Rate Versuch ALLE Zahlen falsch rät, so zeigt er einem trotzdem schwarz = 2 (also das man angeblich 2 Richtige Zahlen erraten hätte). Ich habe dem Programm ja auch gesagt das er jedes mal nur hoch zählen soll, falls der Spieler eine richtige Zahl eingibt. Wie kann ich dieses Problem jedoch verhindern?`Bzw kann ich nach jedem Versuch die Variabelen "schwarz" und "weiss" einfach auf 0 setzen? Das wäre wahrscheinlich die einfachste Alternative, die ich auch überhaupt umsetzen kann..
ausblenden volle Höhe 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:
            int[] zahlen = new int[4];
            Random zufall = new Random(20);
            string Eingabe;
            int Zahl0;
            int Zahl1;
            int Zahl2;
            int Zahl3;
            int weiss=0//wie viele Positionen richtig sind
            int schwarz = 0//wie viele Zahlen richtig sind
            int Versuche = 0//Anzahl der Versuche
            bool bWeiter = true;


            for (int i = 0; i < 4; i++)

                zahlen[i] = zufall.Next(5);
            Console.ReadLine();

            do
            {
                Console.WriteLine("Bitte geben Sie 4 Zahlen ein");
                Eingabe = Console.ReadLine();
                Zahl0 = Convert.ToInt32(Eingabe);

                Eingabe = Console.ReadLine();
                Zahl1 = Convert.ToInt32(Eingabe);

                Eingabe = Console.ReadLine();
                Zahl2 = Convert.ToInt32(Eingabe);

                Eingabe = Console.ReadLine();
                Zahl3 = Convert.ToInt32(Eingabe);

                if (Zahl0 == zahlen[0]) weiss++;
                else if (Zahl0 == zahlen[1] || Zahl0 == zahlen[2] || Zahl0 == zahlen[3]) schwarz++;

                if (Zahl1 == zahlen[1]) weiss++;
                else if (Zahl1 == zahlen[0] || Zahl1 == zahlen[2] || Zahl1 == zahlen[3]) schwarz++;

                if (Zahl2 == zahlen[2]) weiss++;
                else if (Zahl2 == zahlen[0] || Zahl2 == zahlen[1] || Zahl2 == zahlen[3]) schwarz++;

                if (Zahl3 == zahlen[3]) weiss++;
                else if (Zahl3 == zahlen[0] || Zahl3 == zahlen[1] || Zahl3 == zahlen[2]) schwarz++;

                Console.WriteLine("Sie haben {0} Positionen richtig und {1} Zahlen richtig", weiss, schwarz);

                if (weiss == 4)
                {
                    Console.WriteLine("\nGratuliere, Sie haben gewonnen");
                }
                else
                {
                    Versuche++;
                    bWeiter = true;
                }

                if (Versuche == 2)
                {
                    Console.WriteLine("Sie haben verloren");
                    bWeiter = false;
                    
                }
            }
            while (weiss != 4);


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 01.12.15 13:28 
Du wiederholst das Raten ja mittels der do... while Schleife. Am Anfang der Schleife sollten die schwarz,weiss Variablen also auf 0 stehen. Also entweder das initialisieren der beiden Variablen nicht vor der Schleife, so wie jetzt, machen sondern die beiden Zeilen in die Schleife ziehen oder es so wie jetzt lassen und die beiden Variablen am Anfang der do ...while Schleife auf jeweils 0 setzen.
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 02.12.15 17:06 
Vielen Dank für die guten Ratschläge, ich habe es erfolgreich geschafft das Spiel zu programmieren!!

Ich habe dennoch eine weitere Frage.. Wenn ich z.B. Tic Tac Toe programmieren möchte, dann wäre das ja mithilfe eines zweidimensionalen Arrays möglich. Der Befehl ist "int[,] Feld = new int [3,3]". Meine Frage ist aber wie ich das in das Programm ein bringen soll. Also falls Player 1 in das mittlere Feld setzt dann wäre das ja "Zug1 = Feld [1,1]". Aber wie bringe ich das richtig ein?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mi 02.12.15 21:30 
Ganz kann ich deinem Problem nicht folgen :gruebel:
Zitat:
Also falls Player 1 in das mittlere Feld setzt dann wäre das ja "Zug1 = Feld [1,1]

Wenn du den Zug von Spieler 1 ins Spielfeld eintragen willst dann hast du da was verdreht es wäre eher
ausblenden C#-Quelltext
1:
Feld[1,1] = 1/* wenn der Wert 1 für Spieler 1 steht */					
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 03.12.15 17:08 
Mein Problem ist, das ich nicht weiß wie man ein zweidimensionalen Array zufällig bestimmt. Also wenn der Computer in ein Feld setzen soll, wie ich das genau schreibe.

und wenn ich Tic Tac Toe in der Konsole spielen möchte, dann soll die Zahl 9 das obere rechte Feld sein usw. Muss ich dann einfach schreiben "Feld [2,0] = 9"? Also sodass man Tic Tac Toe mit dem NumberPad spielen kann. Und wie gebe ich ein falls der erste Spieler sein Kreuzchen bei 9 (oberes rechtes Feld) macht, das der Computer dieses Feld nicht mehr nehmen kann..?
Firefox977 Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Do 03.12.15 17:18 
Um meine Frage ein bisschen zu präzisieren.. Wie sage ich das der Computer nicht alle Zahlen zufällig bestimmen soll, sondern immer nur eine, danach setzt der Spieler, dann wieder eine zufällig bestimmen, der Spieler setzt wieder usw.?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 03.12.15 17:24 
Wie das Array auf das Spielfeld mappt ist dir frei überlassen da kann man sich mehrere Varianten denken. Muß ja nicht mal 2-d sein ginge auch wieder mit nur 1er Dimension.
Am üblichsten wäre die erste Array Dimension als die Zeile zu betrachten und die 2.te als Spalte Also etwa
ausblenden Quelltext
1:
2:
3:
[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]
[2,0] [2,1] [2,2]


Zitat:
und wenn ich Tic Tac Toe in der Konsole spielen möchte, dann soll die Zahl 9 das obere rechte Feld sein usw. Muss ich dann einfach schreiben "Feld [2,0] = 9"


Das obere rechte Feld wäre für micht [0,2] nicht [2,0]. Aber wie gesagt das genaue Mapping ist dir frei überlassen du mußt es beim reinschreiben und wieder lesen nur gleich verwenden ;)
Und die 9 schreibst du dann nicht in das Feld über die 9 ermittelst du die Array Koordinaten als [2,0] oder [0,2] und schreibst da einen MArker rein der für Spieler1 oder Spieler 2 steht.
In jeder Zelle stehen als maximal 3 verschiedene Werte z.b 0 für unbelegt, 1 für Spieler1, und 2 für Spieler 2. Bei deinem obigen Beispiel mit dem drücken von 9 müßtest du also prüfen ob das entsprechende Feld noch feei ist und dann 1 oder 2 rein schrieben je nachdem welchem der 2 Spieler du den Zug zuordnen willst.

Zitat:
Um meine Frage ein bisschen zu präzisieren.. Wie sage ich das der Computer nicht alle Zahlen zufällig bestimmen soll, sondern immer nur eine, danach setzt der Spieler, dann wieder eine zufällig bestimmen, der Spieler setzt wieder usw.?


Wenn du einen Spieler durch den Computer simulieren willst, also ein computergesteuerten gegner möchtest solltest du das sagen.