Reputation: 149
I've been working on this a while but now I bumped into a problem where I need to let the program start over when the user reached the end of his/her guesses:
"Speler " + currentPlayer.PlayerName + "heeft geen gisignen meer!"
I have a bunch of classes and I'll put it in here too:
class GetalSpel
{
public List<Speler> Spelers { get; set; }
public int numberToGuess { get; set; }
public int MaxAantalGissingen { get; set; }
public int MaxGetal { get; set; }
public bool Gestopt { get; set; }
public GetalSpel()
{
Spelers = new List<Speler>();
//name of variable/property = new Classname();
}
public GetalSpel(int maxAantalGissingen, int maxGetal)
{
Spelers = new List<Speler>();
this.MaxAantalGissingen = maxAantalGissingen;
this.MaxGetal = maxGetal;
Random random = new Random();
numberToGuess = random.Next(1, MaxGetal + 1);
}
public void EnterNewPlayer(string name)
{
if (Spelers.Any(item => item.PlayerName == name))
{
Console.WriteLine("Speler " + name + " is reeds in gebruik!");
}
else
{
Speler player = new Speler();
player.PlayerName = name;
Spelers.Add(player);
Console.WriteLine("Speler " + player + " is ingescreven.");
Console.WriteLine("Druk enter om verder te gaan");
Console.ReadLine();
}
}
public bool GuessNumber(string name, int number)
{
bool guessNumber = false;
Speler currentPlayer = Spelers.Find(item => item.PlayerName == name);
if (number == numberToGuess)
{
guessNumber = true;
Console.WriteLine("Proficiat " + currentPlayer.PlayerName + " het getal was" + numberToGuess + "!");
Gestopt = true;
}
else if (currentPlayer.Gissingen == MaxAantalGissingen)
{
Console.WriteLine("Speler " + currentPlayer.PlayerName + "heeft geen gisignen meer!");
}
else
{
currentPlayer.Gissingen = currentPlayer.Gissingen + 1;
}
return guessNumber;
}
}
class Speler
{
public string PlayerName { get; set; }
public int Gissingen { get; set; }
public Speler()
{
PlayerName = "";
Gissingen = 0;
}
public Speler(string Name)
{
PlayerName = Name;
Gissingen = 0;
}
}
class Program
{
static void Main(string[] args)
{
int maxGetal = 0, maxAantalGissingen = 0;
string input;
Console.WriteLine("Raad het getal spel!");
do
{
Console.Write("Geef het maximum getal in waarnaar kan geraden worden: ");
try
{
maxGetal = int.Parse(Console.ReadLine());
if (maxGetal <= 0)
{
Console.WriteLine("Getal moet positief zijn!");
}
}
catch (FormatException)
{
Console.WriteLine("Moet een getal zijn!");
}
} while (maxGetal <= 0);
do
{
Console.WriteLine("Geef het maximum aantal pogingen in: ");
try
{
maxAantalGissingen = int.Parse(Console.ReadLine());
if (maxAantalGissingen <= 0)
{
Console.WriteLine("Getal moet positief zijn!");
}
}
catch (FormatException)
{
Console.WriteLine("Moet een getal zijn!");
}
} while (maxAantalGissingen <= 0);
GetalSpel game = new GetalSpel(maxAantalGissingen, maxGetal);
Console.Clear();
do
{
Console.WriteLine("1. Schrijf Speler in");
Console.WriteLine("2. Start Spel");
Console.WriteLine("3. Stop");
Console.Write("> ");
input = Console.ReadLine();
switch (input)
{
case "1":
{
try
{
Speler speler = new Speler();
Console.WriteLine("Geeft de naam van de nieuwe speler ");
speler.PlayerName = Console.ReadLine();
game.Spelers.Add(speler);
}
catch (FormatException)
{
Console.WriteLine("Het naam mocht geen nummers bevatten.");
throw;
}
}
break;
case "2":
do
{
Console.WriteLine("Nieuwe gissing");
Console.WriteLine("Geef de naam van de speler: ");
string chosenPlayer = Console.ReadLine();
Console.WriteLine("Geef het getal: ");
int chosenNumber = int.Parse(Console.ReadLine());
try
{
game.GuessNumber(chosenPlayer, chosenNumber);
}
catch (NullReferenceException)
{
Console.WriteLine("Speler " + chosenPlayer + " is niet ingeschreven!");
}
} while (game.Gestopt == false);
Console.WriteLine("Druk op enter om verder te gaan");
Console.ReadLine();
break;
default:
break;
case "3":
{
Environment.Exit(0);
}
break;
}
} while (input != "3");
}
}
Upvotes: 1
Views: 423
Reputation: 1090
Previous approach sure is better than mine, as another solution you can use labels and goto.
public static void Main()
{
start:
//Some logic
goto start;
}
Upvotes: 2
Reputation: 2353
A simple solution is to move the code of the 'Main' method to a separate method (e.g. StartNewGame()). Once the application reaches the last line of the method (in this case 'while(input != "3")' call the StartNewGame() method again.
(Pseudo) code:
private static void StartNewGame()
{
int maxGetal = 0, maxAantalGissingen = 0;
string input;
Console.WriteLine("Raad het getal spel!");
// Do something
GetalSpel game = new GetalSpel(maxAantalGissingen, maxGetal);
Console.Clear();
do
{
// Do something
} while (input != "3");
StartNewGame(); // <--- This is the call to solve the described issue.
}
Upvotes: 3