我目前正在开展一个项目,主要是为了学习并更加熟悉这门语言。我决定使用Windows Forms创建一个Mastermind游戏,但我目前卡住了。问题在于如何在每轮结束后让程序检查猜测。
为了更详细地解释 - 假设你知道Mastermind的规则,在每次玩家猜出他认为可能是正确的颜色顺序的地方之后,他会知道他的针数有多少在正确的地方是正确的颜色,正确的颜色,但在错误的地方。这就是我想要做的事情。
到目前为止,我是如何在一个未经尝试的摘要版本中获得的:
List<int> listRightAnswers = new List<int>(); //Same as bellow, but includes the right answers, previously picked randomly by the computer. (from index 0 to 3, always a value between 1 and 6)
List<int> listPlayerChoice = new List<int>(); //This list includes the player choises in form of integers. Index 0 would be which colour the player have put on place number 1.
int sum = 0; //
int RR = 0; //Number of right colours on right place
int RW = 0; //Number of right colour on wrong place
List<int> listCheck = new List<int>(); //This list is supposed to check if the place have already been checked.
int nrPlaces = 4; //Number of places (pins)
int nrColours = 6; //Number of colours (how many different colours a pin can take. 1 = Red, 2 = Blue etc.)
for(int i = 0; i < nrPlaces; i++)
{
listCheck.Insert(i,0);
//Sets all indexes between 0 and 3 to 0 so that it can compare if the place is taken or not in a later command.
}
for(int i = 0; i < nrPlaces; i++)
{
if(listRightAnswers[i] == listPlayerChoice[i])
{
RR += 1;
ListCheck.Insert(i, 1); //Sets index i to 1 - will be used later
}
}
if(RR == nrPlaces)
{
//USER WIN - Program end here
}
else
{
for(int i = 0; i < nrPlaces; i++)
{
for(int j = 0; j < nrPlaces; j++)
{
if(listCheck[j] == 0) // Is supposed to check if the pin have already been marked as RR and should then not count the pin once more.
{
if(listPlayerChoice[i] == listRightAnswers[j])
{
RW += 1;
listCheck.Insert(i, 1);
}
}
}
}
这是我所拥有的最后面的东西,但是有一个巨大的错误,也可能是som minior。总而言之,该方法不能按预期工作,我不知道如何解决它。
使用: - RR将是正确位置的正确颜色数量。 - 如果没有多次出现颜色,则根据我测试的方法,该方法将按预期工作
不工作: - 如果答案或播放器选择中有两种相同颜色,则RW无法获得预期值。
希望我解释得足够好,我不太擅长这个。
答案 0 :(得分:0)
我很抱歉这是德语,但你会明白的。
namespace Mastermind_2._0
{
class Program
{
static void Main(string[] args)
{
string A;//Navigation im Hauptmenü.
string B;//Navigation in der Anleitung.
string C;//Navigation im Spiel Menü.
string D;//Navigation am Ende des Spieles vs. Freund bei Sieg.
string E;//Navigation am Ende des Spieles vs. Freund bei Verlust.
string F;//Navigation am Ende des Spieles vs. Computer bei Verlust.
string G;//Navigation am Ende des Spieles vs. Computer bei Sieg.
string Eingabe_Spieler1;//Freund vs. Freund string Eingabe.
string Tipp;//Eingabe des Tippes von Spieler #2.
int length;//Länge der Eingabe des Spieler #1.
int Versuch = 0;//Anzahl der Versuche von Spieler #2, Default = 1, weil Spieler #2 auch beim ersten mal richtig liegen könnte.
int Versuch_C= 1;
int i;//Enumerator für den for- Loop.
int b;//-"-
int correct = 0;//Zahl für die Anzahl an Richtigen. Bei correct = 8 -> Gewonnen.
int correct_C= 0;// -"-
char[] Möglichkeiten = { 'R', 'B', 'P', 'V', 'G', 'O' };//Array für die möglichen Farbkombinationen.
//Hauptmenü.
Menü:
Console.WriteLine("\n----------------------------Willkommen zu Mastermind----------------------------");
Console.WriteLine("\n [A]nleitung ");
Console.WriteLine(" [S]pielen ");
Console.WriteLine(" [B]eenden ");
Console.WriteLine("--------------------------------------------------------------------------------");
//Die Variable A in einen string konvertieren.
try
{
A = Convert.ToString(Console.ReadKey(true).KeyChar);
}
catch (System.ApplicationException e)
{
Console.WriteLine(e.Message);
goto Menü;
}
catch (System.OverflowException e)
{
Console.WriteLine(e.Message);
goto Menü;
}
catch (System.FormatException e)
{
Console.WriteLine(e.Message);
goto Menü;
}
//Die Methode .toUpper() anwenden. hallo wird zu HALLO.
A = A.ToUpper();
//switch -case statement anwenden als Kontrollstruktur (default).
switch (A)
{
case "A":
//Anleitung besteht aus einer Zeile wegen der Übersicht.
Console.WriteLine("\n------------------------------------Anleitung-----------------------------------");
Console.WriteLine("\nWillkommen zu Mastermind. In diesem Spiel geht es darum deinen Freund oder\nden Computer zu besiegen. Dein Freund oder der Computer generiert einen\nFarbcode, der aus den Farben [R]ot [B]lau [P]ink [V]iolett [G]elb [O]range\nbestehen kann. Man hat 7 Versuche um den Farbcode zu erraten. Wenn man es\nnicht schafft gewinnt der Gegenspieler. Bei einem Versuch wird eine Farbe\nan der richtigen Stelle durch 'schwarz' gekennzeichnet. Bei einer richtigen\nFarbe, die jedoch an der falschen Stelle liegt kommt 'weiß'. Bei einer fal-\nschen Farbe kommt das Stichwort 'nichts'. Viel Spaß beim Spielen!");
//Zurück navigieren.
Console.WriteLine("\n--------------------------------------------------------------------------------");
Console.WriteLine("[Z]urück");
Console.WriteLine("[S]pielen");
Console.WriteLine("[B]eenden");
B = Convert.ToString(Console.ReadKey(true).KeyChar);
B = B.ToUpper();
//Wenn B Z ist gehe zurück zu dem Menü.
if (B == "Z") {
goto Menü;
}
//Wenn B S ist gehe zu dem Abschnitt Spiel.
if (B == "S") {
goto Spiel;
}
//Wenn B, B ist beende das Programm.
if (B == "B")
{
Console.WriteLine("Bye...");
for (i = 1; i < 40; i++)
{
Console.SetWindowSize(i, i);
System.Threading.Thread.Sleep(50);
}
Environment.Exit(0);
}
//Kontrollstruktur.
if(B != "Z" || B != "S" || B != "B"){
Console.WriteLine("Ich verstehe das nicht...");
goto Menü;
}
break;
case "S":
goto Spiel;
case "B":
Console.WriteLine("Bye...");
Environment.Exit(0);
break;
default:
Console.WriteLine("Ich verstehe das nicht...");
goto Menü;
}
//Spiel Menü mit einem case- statement.
Spiel:
Versuch = 1;
Console.WriteLine("\n------------------------------------Spiel Menü----------------------------------");
Console.WriteLine("\n-- Gegen wen möchten sie spielen? --");
Console.WriteLine("\n-- vs. [C]omputer --");
Console.WriteLine("\n-- vs. [F]reund --");
Console.WriteLine("\n-- Zurück zum [H]auptmenü --");
Console.WriteLine("\n-- Zurück zum [S]pielmenü --");
Console.WriteLine("\n-- [B]eenden --");
Console.WriteLine("\n--------------------------------------------------------------------------------");
//Die Variable C in einen string konvertieren.
C = Convert.ToString(Console.ReadKey(true).KeyChar);
//Die Methode .toUpper() anwenden. hallo wird zu HALLO.
C = C.ToUpper();
//switch -case statement anwenden als Kontrollstruktur (default).
switch (C)
{
//Gegen einen Computer spielen.
case "C":
//Arrays erstellen
string Tipp_C ="Default";
char[] Farben_array = { 'R', 'B', 'P', 'V', 'G', 'O' };
//leerer Array, der gefüllt wird
char[] Computer_array = { ' ', ' ', ' ', ' ' };
//Farbkombination erstellen
Random rnd = new Random();
int n = 0;
do
{
//Eine zufällige Nummer von 0 bis 5.
int rand = rnd.Next(0, 5);
//Die Position n (n erhöht sich um 1) ist gleich dem Objekt an Position "rand"
Computer_array[n] = Farben_array[rand];
n += 1;
}
//Tue das solange n kleiner als 4 ist.
while (n < 4);
//Menü
Console.WriteLine("\nDer Code vom Computer wurde generiert...");
do
{
//Zurück zum Menü
Console.WriteLine("\nSpieler 2: {0}. Versuch.", Versuch_C);
Console.WriteLine("\nEs gibt die Farben 'R', 'B', 'P', 'V', 'G'und 'O'");
try
{
Tipp_C = Convert.ToString(Console.ReadLine());
bool contains = Tipp_C.Contains("1234567890");
if (contains == false) {
throw new System.ApplicationException("Der Tipp darf keine Zahlen beinhalten!");
}
}
catch (ApplicationException e)
{
Console.WriteLine(e.Message);
}
//Tipp_C .Contains in Farben_array
char[] Tipp_C_array = Tipp_C.ToCharArray();
correct_C = 0;
for (b = 0; b < 4; b++)
{
if (Tipp_C_array[b] == Computer_array[b])
{
correct_C += 2;
Console.WriteLine("Black");
}
bool contains = Computer_array.Contains<char>(Tipp_C_array[b]);
if (contains == true && Tipp_C_array[b] != Computer_array[b])
{
correct_C += 1;
Console.WriteLine("White");
}
if (contains != true && Tipp_C_array[b] != Computer_array[b])
{
Console.WriteLine("None");
correct_C += 0;
}
}
b = 0;
Versuch_C += 1;
if (correct_C == 8)
{
Console.WriteLine("\n-- Herzlichen Glückwunsch du hast es beim {0}. Versuch geschafft. --", Versuch_C);
Console.WriteLine("\n-- Zurück zum [H]auptmenü --");
Console.WriteLine("\n-- Zurück zum [S]piel Menü --");
Console.WriteLine("\n-- [B]eenden --");
Console.WriteLine("\n--------------------------------------------------------------------------------");
Versuch_C = 1;
G = Convert.ToString(Console.ReadKey(true).KeyChar);
//Die Methode .toUpper() anwenden. hallo wird zu HALLO.
G = G.ToUpper();
//switch -case statement anwenden als Kontrollstruktur (default).
if (G == "S")
{
goto Spiel;
}
if (G == "H")
{
goto Menü;
}
if (G == "B")
{
Environment.Exit(0);
}
if (G != "S" || G != "B" || G != "H")
{
Console.WriteLine("Ich verstehe nicht...");
goto Spiel;
}
}
}
while (Versuch_C != 8);
Versuch_C = 1;
Console.WriteLine("\n-- Du hast es leider nicht geschafft... --", Versuch_C);
Console.WriteLine("\n-- Zurück zum [H]auptmenü --");
Console.WriteLine("\n-- Zurück zum [S]piel Menü --");
Console.WriteLine("\n-- [B]eenden --");
Console.WriteLine("\n--------------------------------------------------------------------------------");
F = Convert.ToString(Console.ReadKey(true).KeyChar);
//Die Methode .toUpper() anwenden. hallo wird zu HALLO.
F = F.ToUpper();
//switch -case statement anwenden als Kontrollstruktur (default).
if (F == "S")
{
goto Spiel;
}
if (F == "H")
{
goto Menü;
}
if (F == "B")
{
Environment.Exit(0);
}
if (F != "S" || F != "B" || F != "H")
{
Console.WriteLine("Ich verstehe nicht...");
goto Spiel;
} break;
//Gegen einen Freund spielen.
case "F":
Console.WriteLine("\n\n\n\n\n\n\n-----------------Spieler 1: Bitte wähle deine Farbcombination.------------------");
Console.WriteLine("\n-- Diese kann aus [R]ot [B]lau [P]ink [V]iolett [G]elb oder [O]range bestehen --");
Console.WriteLine("\n-- Beispiel: BRVG --");
Console.WriteLine("\n-- Dies würde Blau, Rot, Violett, Gelb bedeuten. --");
Console.WriteLine("\n--------------------------------------------------------------------------------");
Console.WriteLine("\nFarbcombination:");
Eingabe_Spieler1 = Convert.ToString(Console.ReadLine());
length = Eingabe_Spieler1.Length;
//Kontrollstruktur. Hier die 2. hinzufügen
if (length != 4) {
goto case "F";
}
Console.Clear();
//do -while loop für das Vergleichen der arrays
do
{
Console.WriteLine("Spieler 2: {0}. Versuch.", Versuch);
Console.WriteLine("\nEs gibt die Farben 'R', 'B', 'P', 'V', 'G'und 'O'");
Tipp = Convert.ToString(Console.ReadLine());
//Tipp oder Eingabe Spieler #2 werden in einen char Array aufgebrochen
char[] Tipp_Array = Tipp.ToCharArray();
//Eingabe von Spieler #1 wird aufgebrochen in einen char Array
char[] Eingabe_Spieler1_Array = Eingabe_Spieler1.ToCharArray();
correct = 0; //Den integer correct auf 0 zurücksetzen
//Integer i um einen erhöhen. 0, 1, 2, 3. Jedes mal wird die Position gewechselt. Die Arrays werden verglichen in den folgenden Zeilen.
for (i = 0; i < 4; i++)
{
//Bei der richtigen Position und richtigen Farbe wird zu der Variabel correct 2 hinzugefügt.
if (Tipp_Array[i] == Eingabe_Spieler1_Array[i])
{
correct += 2;
Console.WriteLine("Schwarz");
}
//Boolean der entscheidet ob es einen weißen Stift gibt. Wenn contains richtig ist aber es die falsche Position hat gibt es einen weißen Stift.
bool contains = Eingabe_Spieler1_Array.Contains<char>(Tipp_Array[i]);
if (contains == true && Tipp_Array[i] != Eingabe_Spieler1_Array[i])
{
//Correct erhöht sich um 1.
correct += 1;
Console.WriteLine("Weiß");
}
//Wenn es die falsche Position ist und die Farbe nicht vorhanden ist gibt es keinen Stift.
if (contains != true && Tipp_Array[i] != Eingabe_Spieler1_Array[i])
{
Console.WriteLine("Nichts");
//Correct wir um 0 erhöht.
correct += 0;
}
}
i = 0;
Versuch += 1;
//Wenn correct 8 ist, d.h. dass 4 mal schwarz kam wird die Schleife beendet mit break; und man hat gewonnen
if (correct == 8)
{
Versuch -= 1;
Console.WriteLine("\n-- Herzlichen Glückwunsch du hast es beim {0}. Versuch geschafft. --", Versuch);
Console.WriteLine("\n-- Zurück zum [H]auptmenü --");
Console.WriteLine("\n-- Zurück zum [S]piel Menü --");
Console.WriteLine("\n-- [B]eenden --");
Console.WriteLine("\n--------------------------------------------------------------------------------");
D = Convert.ToString(Console.ReadKey(true).KeyChar);
//Die Methode .toUpper() anwenden. hallo wird zu HALLO.
D = D.ToUpper();
//switch -case statement anwenden als Kontrollstruktur (default).
if (D == "S")
{
goto Spiel;
}
if (D == "H")
{
goto Menü;
}
if (D == "B")
{
Environment.Exit(0);
}
if (D != "S" || D != "B" || D != "H")
{
Console.WriteLine("Ich verstehe nicht...");
goto Spiel;
} break;
}
}
//Solange Versuch nicht 8 ist wird diese Schleife wiederholt und wiederholt.
while (Versuch != 8);
Versuch = 1;
Console.WriteLine("\n-- Du hast es leider nicht geschafft... --", Versuch);
Console.WriteLine("\n-- Zurück zum [H]auptmenü --");
Console.WriteLine("\n-- Zurück zum [S]piel Menü --");
Console.WriteLine("\n-- [B]eenden --");
Console.WriteLine("\n--------------------------------------------------------------------------------");
E = Convert.ToString(Console.ReadKey(true).KeyChar);
//Die Methode .toUpper() anwenden. hallo wird zu HALLO.
E = E.ToUpper();
//switch -case statement anwenden als Kontrollstruktur (default).
if (E == "S")
{
goto Spiel;
}
if (E == "H")
{
goto Menü;
}
if (E == "B")
{
Environment.Exit(0);
}
if (E != "S" || E != "B" || E != "H")
{
Console.WriteLine("Ich verstehe nicht...");
goto Spiel;
} break;
case "H":
goto Menü;
case "S":
goto Spiel;
case "B":
Console.WriteLine("Bye...");
Environment.Exit(0);
break;
default:
Console.WriteLine("Ich verstehe das nicht...");
goto Spiel;
}
}
}
}