How to replace while with do-while in this code? - c#

Is there any easy way to add "do" to this program? Need to have one "do" in my assignment :)
namespace Uppgift_1___Gissa_talet
{
class Program
{
static void Main(string[] args)
{
Random randomerare = new Random();
int slump_tal = randomerare.Next(1, 101);
Console.WriteLine("Minigame: Gissa talet!");
Console.WriteLine();
Console.WriteLine("Skriv in ett tal mellan 1 och 100:");
string str = Console.ReadLine();
int tal = Convert.ToInt32(str);
while (tal != slump_tal)
{
if (tal < slump_tal) //Är det mindre?
{
Console.WriteLine("Fel! Större!");//Säg då att det ska vara större
}
else if (tal > slump_tal)
{
Console.WriteLine("Fel! Mindre!");
}
tal = Convert.ToInt32(Console.ReadLine());//Läs in nästa gissning
}
Console.WriteLine("Grattis! Du gissade rätt!");
Console.WriteLine("Tryck på en tangent för att avsluta...");
Console.ReadLine();
}
}
}

namespace Uppgift_1___Gissa_talet
{
class Program
{
static void Main(string[] args)
{
Random randomerare = new Random();
int slump_tal = randomerare.Next(1, 101);
Console.WriteLine("Minigame: Gissa talet!");
Console.WriteLine();
Console.WriteLine("Skriv in ett tal mellan 1 och 100:");
string str = Console.ReadLine();
int tal = Convert.ToInt32(str);
do //You start the loop before the test expression is checked
{
if (tal < slump_tal) //Är det mindre?
{
Console.WriteLine("Fel! Större!");//Säg då att det ska vara större
}
else if (tal > slump_tal)
{
Console.WriteLine("Fel! Mindre!");
}
tal = Convert.ToInt32(Console.ReadLine());//Läs in nästa gissning
}while(tal != slump_tal); // The test expression is checked here.
Console.WriteLine("Grattis! Du gissade rätt!");
Console.WriteLine("Tryck på en tangent för att avsluta...");
Console.ReadLine();
}
}
}

All you have to do is move the while to the end of the block (followed by a semi-colon) and add a do to the beginning of the block.
Additionally, this allows you to move the user input completely inside the loop instead of having it written twice. The only catch is that tal must be defined outside the loop since it's used in the while condition:
private static void Main(string[] args)
{
int slump_tal = new Random().Next(1, 101);
int tal;
Console.WriteLine("Minigame: Gissa talet!\n");
Console.WriteLine("Skriv in ett tal mellan 1 och 100:");
do
{
tal = Convert.ToInt32(Console.ReadLine());
if (tal < slump_tal)
{
Console.WriteLine("Fel! Större!");
}
else if (tal > slump_tal)
{
Console.WriteLine("Fel! Mindre!");
}
} while (tal != slump_tal);
Console.WriteLine("Grattis! Du gissade rätt!");
Console.WriteLine("Tryck på en tangent för att avsluta...");
Console.ReadLine();
GetKeyFromUser("\nDone! Press any key to exit...");
}
Another improvement you could make is to include a helper method that validates that the user input is actually a number, so that you don't throw an exception if they enter something like "two" instead of "2". The following method takes in a "prompt" string (the question for the user), and makes use of a loop where the condition uses int.TryParse to validate that the entry is an integer, and it continues to loop until it returns true, then returns the integer entered by the user:
private static int GetIntFromUser(string prompt)
{
int input;
do
{
Console.Write(prompt);
} while (!int.TryParse(Console.ReadLine(), out input));
return input;
}
Now we can make use of this method to get the user input:
private static void Main(string[] args)
{
int slump_tal = new Random().Next(1, 101);
int tal;
var prompt = "Skriv in ett tal mellan 1 och 100: ";
Console.WriteLine("Minigame: Gissa talet!\n");
do
{
tal = GetIntFromUser(prompt);
prompt = tal < slump_tal
? "Fel! Det numret är för litet. Försök igen: "
: "Fel! Det numret är för stort. Försök igen: ";
} while (tal != slump_tal);
Console.WriteLine("Grattis! Du gissade rätt!");
Console.WriteLine("Tryck på valfri tangent för att avsluta...");
Console.ReadLine();
}

Related

my guessing game is not working and i don´t know why

I'm working on a guessing game that I need to improve for school, and I need to make it so that my game can make more rounds. But I hav a problem, the program doesn´t want to quit, it only starts a new round even if I "make the quit command".
The problem now is that my game doesn´t even want to start and I have no idea why. I have tried so many things to try to fix it and nothing works and I need to make it to a do while loop instead. And I think I know how to do that without big problems.
Here is my code
using System;
namespace MyFirstProgram
{
class Program
{
static void Main(string[] args)
{
Random random = new Random();
bool playAgain = true;
int min = 1;
int max = 100;
int guess;
int number;
int guesses;
String response;
while (playAgain)
{
guess = 0;
guesses = 0;
response = "";
number = random.Next(min, max + 1);
while (guess != number)
{
//opening quote
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("gissa talet\nDu ska nu gissa ett tal mellan 1
ocn 100, så varsågod..\nskriv in ett tal");
guess = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Guess: " + guess);
//when guess is over 100
if (guess > 100)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("Du måste skriva in ett tal mellan 1 och
100!");
}
else
{
//if guess is to small
if (guess > number)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("Ditt tal är för litet. gissa på ett
större tal");
}
//if guess is to large
else if (guess < number)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("Ditt tal är för stort. gissa på ett
mindre tal.");
}
//when your guess is close but not right
if (Math.Abs(guess - number) <= 3)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Du är dock nära och det bränns");
}
}
guesses++;
}
//when you won
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Grattis du gissa rätt,\n talet är" + " " + number);
Console.WriteLine("gissning" + " " + guesses);
//playagain command
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("vill du spela igen? (Ja/Nej): ");
response = Console.ReadLine();
response = response.ToUpper();
if (response == "Ja")
{
playAgain = true;
}
else
{
playAgain = false;
}
}
//end quote
Console.WriteLine("tack för att du spela");
Console.ReadKey();
}
}
}
You have line breaks in your strings, which make your code unable to compile. In C#, you can't break strings like this:
// This does not compile
string str = "my string on
several lines";
I tagged involved lines with /* here ---> */ comments below:
using System;
namespace MyFirstProgram
{
class Program
{
static void Main(string[] args)
{
Random random = new Random();
bool playAgain = true;
int min = 1;
int max = 100;
int guess;
int number;
int guesses;
String response;
while (playAgain)
{
guess = 0;
guesses = 0;
response = "";
number = random.Next(min, max + 1);
while (guess != number)
{
//opening quote
Console.ForegroundColor = ConsoleColor.Green;
/* here ---> */ Console.WriteLine("gissa talet\nDu ska nu gissa ett tal mellan 1 ocn 100, så varsågod..\nskriv in ett tal");
guess = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Guess: " + guess);
//when guess is over 100
if (guess > 100)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
/* here ---> */ Console.WriteLine("Du måste skriva in ett tal mellan 1 och 100!");
}
else
{
//if guess is to small
if (guess > number)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
/* here ---> */ Console.WriteLine("Ditt tal är för litet. gissa på ett större tal");
}
//if guess is to large
else if (guess < number)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
/* here ---> */ Console.WriteLine("Ditt tal är för stort. gissa på ett mindre tal.");
}
//when your guess is close but not right
if (Math.Abs(guess - number) <= 3)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Du är dock nära och det bränns");
}
}
guesses++;
}
//when you won
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Grattis du gissa rätt,\n talet är" + " " + number);
Console.WriteLine("gissning" + " " + guesses);
//playagain command
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("vill du spela igen? (Ja/Nej): ");
response = Console.ReadLine();
response = response.ToUpper();
if (response == "JA")
{
playAgain = true;
}
else
{
playAgain = false;
}
}
//end quote
Console.WriteLine("tack för att du spela");
Console.ReadKey();
}
}
}
You could however write it with verbatim string literal (#"myText"):
// This compiles
Console.WriteLine(#"gissa talet
Du ska nu gissa ett tal mellan 1 ocn 100, så varsågod..
skriv in ett tal");
Side note: if you guess the right number, you still enter the "guess is close" part (as guess-number == 0 which is <= 3).
See red line in below screenshot:
The reason that it doesn't work is that you convert the response to upper case. However you don't check for the upper case version of the word.
So if (response == "Ja") should be if (response == "JA")
Just for the record, usually when you compare string in C#, seek for ways that let you also provide StringComparison.
For example, if I want to check if a string is Ja, but without considering character case, I can write something like this:
public static void Main()
{
string input = "JA";
if (input.Equals("Ja", StringComparison.InvariantCultureIgnoreCase))
{
Console.WriteLine("They're the same!");
}
}
// result: They're the same!
By the way, C# Dictionary also supports this.
public static void Main()
{
Dictionary<string, string> dict = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
dict.Add("Ja", "Peko");
Console.WriteLine(dict["JA"]);
}
// result: Peko
Besides your other problems you have a infinite loop hidden somewhere here...
//if guess is to small
if (guess > number)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("Ditt tal är för litet. gissa på ett större tal");
}
//if guess is to large
else if (guess < number)
{
Console.ForegroundColor = ConsoleColor.DarkRed;
Console.WriteLine("Ditt tal är för stort. gissa på ett mindre tal.");
}
//when your guess is close but not right
if (Math.Abs(guess - number) <= 3)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Du är dock nära och det bränns");
}
I am sure you can figure it out by yourself from here on!

Why are my vectors being reset instead of having their own value?

I'm studying programing right now and I need to make a "bus". I've got a vector with 25 spots and user will fill these with passengers. I've got a switch-case menu so you can choose if you want to add a passenger or get the full passenger list and so on. When I've entered about 5 passengers and want to get the passenger list everyone on the bus turns to 0 instead of the age I entered. I have no idea what's wrong?
Comments in the code are in Swedish.
{
class Buss
{
public int[] passagerare;
public int antal_passagerare ;
public void Run()
{
Console.WriteLine("Welcome to the awesome Buss-simulator");
do
{
Console.WriteLine("Välj alternativ");
Console.WriteLine("1: Lägg till passagerare");
Console.WriteLine("2: Skriv ut listan över passagerare");
Console.WriteLine("3: Skriv ut total åldern över passagerna");
Console.WriteLine("4: Skriv ut medelåldern över passagerarna");
Console.WriteLine("0: Avsluta programmet.");
string str = Console.ReadLine();
int temp = Convert.ToInt32(str);
switch (temp)
{
case 1:
Console.WriteLine("Lägg till passagerare (ange ålder endast)!");
add_passenger();
break;
case 2:
Console.WriteLine("Skriv ut gästlistan!");
print_buss();
break;
case 3:
Console.WriteLine("hejsan");
break;
case 4:
Console.WriteLine("hejsan");
break;
case 0:
Console.WriteLine("hejsan");
break;
}
//ska ändra så att om man väljer 0 så stängs programmet
} while (true);
//Här ska menyn ligga för att göra saker
//Jag rekommenderar switch och case här
//I filmen nummer 1 för slutprojektet så skapar jag en meny på detta sätt.
//Dessutom visar jag hur man anropar metoderna nedan via menyn
//Börja nu med att köra koden för att se att det fungerar innan ni sätter igång med menyn.
//Bygg sedan steg-för-steg och testkör koden.
}
//Metoder för betyget E
public void add_passenger()
{
passagerare = new int[25];
if (antal_passagerare < 25)
{
Console.WriteLine("Ålder på passagerare nr " + antal_passagerare);
string age = Console.ReadLine();
int age2 = Convert.ToInt32(age);
passagerare[antal_passagerare] = age2;
Console.WriteLine(passagerare[antal_passagerare]);
antal_passagerare++;
}
else
{
Console.WriteLine("Bussen är full!");
}
//Lägg till passagerare. Här skriver man då in ålder men eventuell annan information.
//Om bussen är full kan inte någon passagerare stiga på
}
public void print_buss()
{
for (int i = 0; i < antal_passagerare; i++)
{
Console.WriteLine(passagerare[i]);
}
}
// public int calc_total_age()
//{
//}
//public int calc_average_age()
//{
//}
public void find_age()
{
}
public void sort_buss()
{
}
}
class Program
{
public static void Main(string[] args)
{
var minbuss = new Buss();
minbuss.Run();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
If I am understanding this correctly, you are setting the array:
passagerare = new int[25];
to a new array every time you get into the add_passenger function so altthough you may actually set it the first time, the next time the user gets into the function, it'll be reset again.
If this is the case, the you can simply define it before you call this function and pass it as a parameter.
EDIT: In regards to your comment, you can define it in one of two palces.
1) You can create a constructor that sets the array to a length of [25] such as:
public Buss(){
passagerare = new int[25];
}
2) You can define it before you enter your switch statement and pass the array into to each function as a parameter.

Linear search after assigning variables [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
I have been making a program that has been working. But now i want to change the search function of the program to something simpler. This is what I have done: and the error message is use of unassigned local variable logg. To be clear, this is how I want the search function to look. Now I just need to figure out the variable thing.
full code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Loggbok
{
class MainClass
{
public static void Main(string[] args)
{
DateTime tiden = DateTime.UtcNow; //Skriver ut tiden vid varje inlägg
bool running = true; //Ger ett booleskt värde till variabeln running för att kunna skapa en loop
List<string[]> loggbok = new List<string[]>(); //Här skapas listan som innehåller arrayen
while (running) //Här skapas loopen
{
Console.WriteLine("\n************************************");
Console.WriteLine("\nVälkommen till loggboken!");
Console.WriteLine("\n************************************");
Console.WriteLine("\n[1] Skriv nytt inlägg i loggboken");
Console.WriteLine("[2] Skriv ut alla loggar");
Console.WriteLine("[3] Sök inlägg i loggboken");
Console.WriteLine("[4] Radera innehåll i loggboken");
Console.WriteLine("[5] Avsluta loggboken");
Console.WriteLine("\n************************************");
Console.Write("\nVälj: ");
int option; //Int eftersom valet ska vara ett heltal
try
{
option = Int32.Parse(Console.ReadLine()); //testar så att inmatningen är av typen Int
}
catch
{
Console.WriteLine("Fel, du får bara skriva in nummer"); //Felmeddelande om inmatningen är en bokstav
continue;
}
switch (option)
{
case 1:
string[] logg = new string[2]; //Här deklareras arrayen
Console.WriteLine("\n************************************");
Console.WriteLine(tiden);
Console.WriteLine("Ange en Titel:");
logg[0] = Console.ReadLine(); //Här sparas titeln
Console.Clear();
Console.WriteLine("\n************************************");
Console.WriteLine("Skriv inlägg:");
logg[1] = String.Format("{0}{1}{2}", Console.ReadLine(), Environment.NewLine,
DateTime.Now.ToString(
"yyyy-MM-dd HH:mm:ss")); //Här sparas inlägget samt datum och tid, detta är möjligt tack vare formattering
loggbok.Add(logg);
break;
case 2:
foreach (string[] item in loggbok) //För att skriva ut alla items i loggboken
{
Console.WriteLine("\n--------------------------------------\n ");
Console.WriteLine(item[0]); //För att skriva ut titel
Console.WriteLine(item[1]); //För att skriva ut inlägg
Console.WriteLine("\n--------------------------------------\n ");
}
Console.ReadLine();
break;
case 3:
Console.WriteLine("\n************************************");
Console.WriteLine("Skriv in ett ord du vill söka efter i loggboken:");
string nyckelord = Console.ReadLine(); //Här sparas inmatningen av nyckelordet
for (int i = 0; i < logg.Length; i++)
{
if (logg[i] == nyckelord)
{
Console.WriteLine(logg[0]);
Console.WriteLine(logg[1]);
}
else
{
Console.WriteLine("Finns ej");
}
}
break;
case 4:
Console.WriteLine("\n************************************");
Console.WriteLine("Skriv titeln på det inlägg du vill ta bort:");
string title = Console.ReadLine(); //Sparar titeln på inlägget användaren vill radera
for (int x = 0; x < loggbok.Count; x++) //Loopa igenom varje titel
{
if (String.Equals(loggbok[x][0], title, StringComparison.OrdinalIgnoreCase)
) //Icke skiftlägeskänslig matchning av titeln.
{
loggbok.RemoveAt(x); //Matchning funnen.
}
else
{
Console.WriteLine("Titeln finns inte, återgår till huvudmenyn");
}
}
break; //Avsluta loopen.
case 5:
running = false; //Avslutar loopen och därmed programmet
break;
default:
Console.WriteLine(
"Nu blev det fel, välj mellan [1] [2] [3] [4] [5]"); //Felmeddelande om valet är någon annan siffra än de som menyn innehåller
break;
}
}
}
}
}
This is what I have done: and the error message is use of unassigned
local variable logg
all local variables must be assigned before control leaves the containing method.
It is declared in case 1
remove the string[] logg = new string[2]; from case 1 and insert it before the opening try block otherwise you won't be able to use the array throughout the other cases.
string[] logg = new string[2];//Här deklareras arrayen
try
{
option = Int32.Parse(Console.ReadLine());//testar så att inmatningen är av typen Int
}
...
...
...
Your question is not clear and should be improved.
Assuming the code is given exactly as it is, then you are using break out of a loop or switch block.
Correct and check if you still have problems.

c#, Changing program to linear search

I made this code a couple of days ago and have a pretty simple question. I know questions like this have been asked, but I couldn't find anything that specifically works for my case. I want to change the search function in case 3 to a less complex search method, so I basically want to replace it with linear search. If that is not possible I want to implement the linear search somewhere else. You guys have any clues? All help is appreciated.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Loggbok
{
class MainClass
{
public static void Main(string[] args)
{
DateTime tiden = DateTime.UtcNow;//Skriver ut tiden vid varje inlägg
bool running = true;//Ger ett booleskt värde till variabeln running för att kunna skapa en loop
List<string[]> loggbok = new List<string[]>();//Här skapas listan som innehåller arrayen
while (running)//Här skapas loopen
{
Console.WriteLine("\n************************************");
Console.WriteLine("\nVälkommen till loggboken!");
Console.WriteLine("\n************************************");
Console.WriteLine("\n[1] Skriv nytt inlägg i loggboken");
Console.WriteLine("[2] Skriv ut alla loggar");
Console.WriteLine("[3] Sök inlägg i loggboken");
Console.WriteLine("[4] Radera innehåll i loggboken");
Console.WriteLine("[5] Avsluta loggboken");
Console.WriteLine("\n************************************");
Console.Write("\nVälj: ");
int option;//Int eftersom valet ska vara ett heltal
try
{
option = Int32.Parse(Console.ReadLine());//testar så att inmatningen är av typen Int
}
catch
{
Console.WriteLine("Fel, du får bara skriva in nummer");//Felmeddelande om inmatningen är en bokstav
continue;
}
switch (option)
{
case 1:
string[] logg = new string[2];//Här deklareras arrayen
Console.WriteLine("\n************************************");
Console.WriteLine(tiden);
Console.WriteLine("Ange en Titel:");
logg[0] = Console.ReadLine();//Här sparas titeln
Console.Clear();
Console.WriteLine("\n************************************");
Console.WriteLine("Skriv inlägg:");
logg[1] = String.Format("{0}{1}{2}", Console.ReadLine(), Environment.NewLine, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));//Här sparas inlägget samt datum och tid, detta är möjligt tack vare formattering
loggbok.Add(logg);
break;
case 2:
foreach (string[] item in loggbok)//För att skriva ut alla items i loggboken
{
Console.WriteLine("\n--------------------------------------\n ");
Console.WriteLine(item[0]);//För att skriva ut titel
Console.WriteLine(item[1]);//För att skriva ut inlägg
Console.WriteLine("\n--------------------------------------\n ");
}
Console.ReadLine();
break;
case 3:
Console.WriteLine("\n************************************");
Console.WriteLine("Skriv in ett ord du vill söka efter i loggboken:");
var nyckelord = Console.ReadLine();//Här sparas inmatningen av nyckelordet
var entries = loggbok.Where(entry => entry.Any(item =>item.IndexOf(nyckelord, StringComparison.OrdinalIgnoreCase) > -1));//För att kontrollera om nyckelordet finns samt ignorera skiftlägeskänslighet, och finna både titel och inlägg
foreach (var entry in entries)//för att finna alla inlägg/titlar som matchar nyckelord
{
Console.WriteLine("\n--------------------------------------\n ");
Console.WriteLine(string.Join(", ", entry));//Skriver ut titel samt inlägg som matchat nyckelordet
Console.WriteLine("\n--------------------------------------\n ");
}
if (entries.Count() == 0)//Om ingen matchning hittas
{
Console.WriteLine("\n--------------------------------------\n ");
Console.Write("Din sökning misslyckades...");//Felmeddelande om ingen matchning hittas
Console.WriteLine("\n--------------------------------------\n ");
}
break;
case 4:
Console.WriteLine("\n************************************");
Console.WriteLine("Skriv titeln på det inlägg du vill ta bort:");
string title = Console.ReadLine();//Sparar titeln på inlägget användaren vill radera
for (int x = 0; x < loggbok.Count; x++) //Loopa igenom varje titel
{
if (String.Equals(loggbok[x][0], title, StringComparison.OrdinalIgnoreCase)) //Icke skiftlägeskänslig matchning av titeln.
{
loggbok.RemoveAt(x); //Matchning funnen.
}
else
{
Console.WriteLine("Titeln finns inte, återgår till huvudmenyn");
}
}
break; //Avsluta loopen.
case 5:
running = false;//Avslutar loopen och därmed programmet
break;
default:
Console.WriteLine("Nu blev det fel, välj mellan [1] [2] [3] [4] [5]");//Felmeddelande om valet är någon annan siffra än de som menyn innehåller
break;
}
}
}
}
}
Your keyword search in case 3 is already linear. Are you just trying to make the search statement less verbose inside the switch? Then turn the search expression into a function:
static IEnumerable<string[]> SearchByKeyword(IEnumerable<string[]> loggbok,
string nyckelord) {
return loggbok.Where(entry => entry
.Any(item => item.IndexOf(nyckelord,
StringComparison.OrdinalIgnoreCase) > -1));
}
and invoke it in the switch statement:
var entries = SearchByKeyword(loggbok, nyckelord);

c# How do I choose a random word in my dictionary that the person can guess on and for it also to say how many letters it is? [Hangman Game] [duplicate]

This question already has answers here:
Random entry from dictionary
(7 answers)
Closed 8 years ago.
I am currently making an Hangman game, and I have everything set except having it so for each turn the player is guessing on a random word, currently they can guess on all the words in my dictionary/wordbank, and also to tell the player how many letters the word has, Currently you can write random words in hope that you get the correct one. The only idea I have is o to use Random, but further then that and I'm lost.
Cheers.
class Program
{
static List<string> ordbank = new List<string>()
{
"Leksak", "Djur", "Organismer", "Mat", "Länder"
};
static bool runMenu = true; //kör menyn
static bool runGame = false; //kör spelet
static int numberOfTries = 2; //antal försök personen har på sig
static int wrongGuesses = 0; // hur många gånger har personen gissat fel
static int numWordsToPutIn = 1; //Lägga till ett extra ord till listan, skulle vilja göra så man kan lägga till fler än 1 åt gången.
static void Main(string[] args)
{
Console.WriteLine("Hänga gubbe!\n1) Lägg till ord\n2) Lista till alla ord\n3) Spela\n4) Avsluta");
do
{
Console.Write("Menu: ");
string menuInput = Console.ReadLine();
switch (menuInput.ToLower())
{
case "1":
Console.WriteLine("Du ska lägga till " + numWordsToPutIn + " ord nu.");
for (int i = 1; i <= numWordsToPutIn; i++)
{
Console.WriteLine("Lägg till ord " + i + ": ");
string wordInput = Console.ReadLine();
ordbank.Add(wordInput);
}
ordbank.Sort();
break; //Ifall man vill lägga till nytt ord till listan.
case "2":
Console.WriteLine("Nu skrivs alla orden ut: ");
if (ordbank.Count > 0)
{
foreach (string ord in ordbank)
{
Console.WriteLine(ord);
}
}
else
{
Console.WriteLine("Listan är tom. Fyll den först."); //Behövs denna nu när jag ändrade så ord redan finns?
}
break; //Skriver ut orden de lagt in.
case "3":
if (ordbank.Count == 0)
{
Console.WriteLine("Fyll ordlistan med " + numWordsToPutIn + " ord innan du börjar spelet");
break;
}
Console.WriteLine("Hur många fel får man ha: " + numberOfTries + " ");
Console.WriteLine("Då kör vi, gissa vilka ord som finns med");
runGame = true;
wrongGuesses = 0;
do
{
Console.Write("Gissa ord: ");
string guessedWord = Console.ReadLine();
if (ordbank.Contains(guessedWord))
{
ordbank.Remove(guessedWord);
//kolla om personen har vunnit
if (ordbank.Count == 0)
{
Console.WriteLine("Grattis du vann");
runGame = false;
}
else
{
Console.WriteLine("Wohoo det ordet fanns med, fortsätt!");
}
}
else
{
wrongGuesses++;
//kolla om personen har förlorat
if (wrongGuesses == numberOfTries)
{
runGame = false;
Console.WriteLine("Du förlorade.");
ordbank.Clear();
}
else
{
Console.WriteLine("Du gissade fel, du har " + (numberOfTries - wrongGuesses) + " försök kvar");
}
}
} while (runGame);
break;
case "4":
Console.WriteLine("Spelet avslutas nu...");
runMenu = false;
break;
default:
Console.WriteLine("Snälla välj ett tal mellan 1 - 4.");
break;
}
} while (runMenu == true);
}
}
}
You can use the Random class to generate pseudo-random numbers. Its Next method can be used to retrieve a random number between 0 (including) and a given max value (excluding).
If you use the word list's element count as the max value, you're computing a random index which is between 0 and (list length - 1). You can then retrieve your random word at that index:
var random = new Random();
// Compute a valid list index
int randomIndex = random.Next(ordbank.Count);
// Fetch the word at that index
string randomWord = ordbank[randomIndex];
Make sure to only create one instance of Random and to re-use it. Otherwise, you might notice that the same numbers could be generated over and over again if Random.Next is called in a loop.
This is obviously a course assignment of some sort, so i don't want to do it for you but the below code should give you a hint to the solution.
Add all of the below to your code and use appropriately.
int selectedWordIndex = 0;
Random rand = new Random();
void pickNewRandomWord(){
selectedWordIndex = rand.Next(ordbank.Count);
}
string getSelectedWord(){
return ordbank[selectedWordIndex];
}

Categories