Guessing Game Number Issue - c#

Before I get down-voted for the extensive code, I feel it's necessary for a solution to present itself.
I've made alterations to the program's code from the help previously presented, but I still seem to be falling into the problem that the random number number is either not being properly compared (I've had examples where number is '5' and the user's guess is '5', but I'm still getting a comment that "You're quite far off! Try again." meaning it's falling into else if (userinputcalc > 4 | userinputcalc < 10)...
So, at this stage the issue seems to lie within the comparison of number and the userinput, leading to confusing output messages.
I'm probably missing something obvious here, despite being sure it's around the loop of comparing number and userinput but I've been looking at this code and seeing nothing.
Any help is greatly appreciated, as always.
public void GuessingGame()
{
string username; // Will be the user's chosen name for program interaction
int guessesleft = 0;// Stands for the number of guesses left (out of 3)
int spaceaway = 0; // Space from the guess and the random number, if not correct guess
int roundcount = 1; //Started at 1 for the sake of the user interface - aesthetics
int number = 0; // Current value of the random number
int userinput = 0; //User input is the guess the user makes during the guessing game
int userinputcalc = 0;// calculation of guess and random number, when added to spaceaway calculation
int answersright = 0; // Number of times the user guessed the number correctly
Random rndm = new Random(); // Initialises a new class of random, which'll be used to simulate the random number
Console.WriteLine("Welcome to Guessing Game!");
Console.WriteLine("");
Console.WriteLine("Please press any button to continue.");
Console.ReadLine();
Console.WriteLine("What's your name?");
username = (Console.ReadLine());
//If you're wondering at all, the "You must guess what it is inthree tries." is intentional, since it was showing double-spaced in the command prompt
Console.WriteLine("Well, " + username + ", I am thinking of a number from 1 to 10. You must guess what it is inthree tries.");
Console.WriteLine("");
{
do
{
Console.WriteLine("Round" + roundcount); //Displays the which round (out of 10) to the user
guessesleft = 3; //The remaining guesses left for the user
do
{
number = rndm.Next(10) + 1; // int number is set to a random number between 1 and 10
Console.WriteLine("Please enter a guess:");
userinput = int.Parse(Console.ReadLine());
guessesleft = guessesleft - 1;
if (userinput == number)
{
//Below, once you've guessed right, you will have this message displayed in the console
Console.WriteLine("You guessed " + number + " *RIGHT*!");
answersright = answersright + 1;
guessesleft = 0;// No point need to guess further on something you've guessed correctly - saves correct answer value exploit
}
else if (userinput < 1 || userinput > 10) // If user's guess is less than 1 or more than 10, then out of range. Counts as a guess.
{
Console.WriteLine("You guessed " + userinput + "! and it was incorrect!");
Console.WriteLine("This is outside of the range of numbers between 1-10 ");
}
else if (userinput != number) // while the user's guess does not equal the number
{
{
// userinputcalc = Math.Abs(number - userinput);
//Left out as I was getting abnormal run-time outputs and the math showed up wrong.
//(Example: RND No. = 5 Userinput = 5 Output: "Incorrect" "Hot")
spaceaway = (number - userinput); // Works out how far from the random no. the user's guess is.
// If user guesses 6 and random no. is 5, answer will be -1 this makes the value +ve and allows output to be shown without error
if (spaceaway < 0)
{
spaceaway = (spaceaway * -1);
userinputcalc = spaceaway;
}
else if (spaceaway > 0)
{
userinputcalc = spaceaway;
}
}
{
if (userinputcalc < 2)
{
Console.WriteLine("You guessed " + userinput + "! and it was wrong!");
Console.WriteLine("Hot");
}
else if
(userinputcalc < 3)
{
Console.WriteLine("You guessed " + userinput + "! and it was wrong!");
Console.WriteLine("Warm");
}
else if
(userinputcalc < 4)
{
Console.WriteLine("You guessed " + userinput + "! and it was wrong!");
Console.WriteLine("Cold");
}
else if (userinputcalc > 4 | userinputcalc < 10)
{
Console.WriteLine("You guessed " + userinput + "! and it was wrong!");
Console.WriteLine("You're quite far off! Try again.");
}
}
}
} while (guessesleft > 0);
Console.WriteLine("");
Console.WriteLine("The number was, "+number+"!");
Console.WriteLine("");
roundcount = roundcount + 1;
} while (roundcount < 11);
Console.WriteLine("Well, " + username + ". " + "You guessed correctly, " + answersright + " times!");
}
}
}
}

OK I think theres quite a few issues here (some are off topic but definitely worth mentioning)..
I wouldn't advise using while loops to check for specific inputs
For example:
Instead of roundCount != 11 use roundCount < 11
Then there is less chance of forever getting stuck in a loop
You should declare Random outside of your loops otherwise you run the risk of just getting the same numbers ("randomly")
You reset the number to a new number after every guess so the user doesn't have a chance to guess the right number
With all this being said, I think the Math.Abs was correct if you are trying to find the distance away from the number.. I wouldnt use less than two though as that would mean only numbers that are 1 away from the answer are "hot"
Note: Answer is based off question revision #5
Update
Doesn't seem like you were far off but you still reset the number every loop
number = rndm.Next(10) + 1; //Insert here
do
{
//Displays the which round (out of 10) to the user
Console.WriteLine("Round" + roundcount);
guessesleft = 3; //The remaining guesses left for the user
do
{
// Remove this -- number = rndm.Next(10) + 1;

I think this is what you want,please try it:
static int guessesleft;
static Random ran = new Random();
static int MagicNumber;
static string UserInput;
static void Main(string[] args)
{
ConsoleKeyInfo ci = new ConsoleKeyInfo();
do
{
guessesleft = 3;
UserInput = "";
Console.Clear();
string username;
int guesscount = 1;
Console.WriteLine("Welcome to Jackie's Guessing Game!");
Console.WriteLine("");
Console.WriteLine("Please press any button to continue.");
Console.ReadLine();
Console.WriteLine("What's your name?");
username = (Console.ReadLine());
//If you're wondering at all, the "You must guess what it is inthree tries." is intentional, since it was showing double-spaced in the command prompt
Console.WriteLine("Well, " + username + ", I am thinking of a number from 1 to 10. You must guess what it is inthree tries.");
Console.WriteLine("");
MagicNumber = ran.Next(1, 11);
do
{
Console.WriteLine("Please insert your " + guesscount++ + "º guess!");
UserInput = Console.ReadLine().Trim();
if (UserInput == MagicNumber.ToString())
break;
if (Math.Abs(Convert.ToInt32(UserInput) - MagicNumber) < 2)
Console.WriteLine("Hot!!");
else if(Math.Abs(Convert.ToInt32(UserInput) - MagicNumber) < 3)
Console.WriteLine("Warm!!");
Console.WriteLine("No luck , you have " + --guessesleft + "º guesses left!");
Console.WriteLine();
} while (guesscount < 4);
if (guesscount == 4)
Console.WriteLine("Sorry " + username + " no more tries,you lost!");
else
Console.WriteLine("Congratulations your guess with number " + UserInput + " is correct,the number was " + MagicNumber);
Console.WriteLine("Press Q to quit or Enter to Play again!");
ci = Console.ReadKey();
} while (ci.Key != ConsoleKey.Q);
}

Related

Stop program from crashing when pressing Enter

So, today I decided to start learning C# from scratch. I've managed to make a little math problems program. The thing is, whenever the user just presses enter without entering a value (or anything which isn't a number), the program crashes. I've read something about TryParse but I just can't get it.
Here's my code (part of it):
{
Random numberGenerator = new Random();
int num01 = numberGenerator.Next(1, 20);
int num02 = numberGenerator.Next(1, 20);
Console.WriteLine("Welcome, user.");
Console.ReadKey();
Fail2:
Console.WriteLine("¿What's " + num01 + "x" + num02 + "?");
int res1 = Convert.ToInt32(Console.ReadLine());
if (res1 == num01*num02)
{
Console.WriteLine("Your answer is correct");
Console.ReadKey();
}
else
{
goto Fail;
}
Thanks in advance!
Hello & welcome to StackOverflow! I have a couple of suggestions:
Avoid using goto
Replace all your Convert.X with X.TryParse whenever it's the user who gives you the value, since you don't know what it could be
Random numberGenerator = new Random();
int num01 = numberGenerator.Next(1, 20);
int num02 = numberGenerator.Next(1, 20);
Console.WriteLine("Welcome, user.");
Console.ReadKey();
// Always use a loop instead of goto statements!
while (true)
{
Console.WriteLine("¿What's " + num01 + "x" + num02 + "?");
// Old line: int res1 = Convert.ToInt32(Console.ReadLine());
// Problem: this assumes that Console.ReadLine() returns a valid number, e.g. "3"
// but as you said, the user can trick you and put something else
if (!int.TryParse(Console.ReadLine(), out int res1))
continue; // This will rerun the loop from the top, so the user will need to re-write a response
if (res1 == num01*num02)
{
Console.WriteLine("Your answer is correct");
Console.ReadKey();
}
else
{
break; // stop the outer loop on top
}
}
Use int.TryParse like this...
int res1 = 0;
if (!int.TryParse(Console.ReadLine(), out res1))
{
//failed;
}
if (res1 == num01*num02)
...
https://learn.microsoft.com/en-us/dotnet/api/system.int32.tryparse?view=netcore-3.1

Somehow my value never equals 1, is there a reason for that?

I can't ever get guessLimit to equal 1, in the system log when I enter the limit of guesses as 5 and start guessing, the guessLimit will go down all the way to 2 and it will give me the "You Lose" message without letting me do my final guess... is there a reason for that?
public static void Main(string[] args){
string guess = "";
bool outOfguesses = false;
int guessCount = 0;
Console.Clear();
Console.Write("Enter the amount of guesses you want: ");
int guessLimit = Convert.ToInt32(Console.ReadLine());
Console.Clear();
Console.Write("Enter a word that will be guessed...: ");
string secretWord = Console.ReadLine();
Console.Clear();
Console.Write("You have " + guessLimit + " guesses" + "\nEnter a guess: ");
guess = Console.ReadLine();
while(guess.ToLower() != secretWord.ToLower() && !outOfguesses){
if(guessLimit >= guessCount || guessLimit == 1){
guessCount++;
guessLimit--;
Console.Write("\nWRONG! You have " + guessLimit + " guesses left." + "\nEnter another guess: ");
guess = Console.ReadLine();
} else{
outOfguesses = true;
}
}
if(outOfguesses == true){
Console.WriteLine("\nSorry...\nYou lose!");
} else{
Console.WriteLine("\nGood Job.\nYou Win!!");
}
Console.ReadLine();
}
When your if statement reaches
(Is 2 >= 3) this is false so it will skip over the if and go to the else
Which is why it stops there.
Also change your guesslimit ==1 to <1

Code is supposed to include all of user's input but stops after third input

My code first takes the "s" or "k" or "c" input from the user to display a price. The user enters a coin value to bring down that price. My code works when the user inputs the "s" and the first coin value, but after that it just closes after a fourth input and I'm not sure why.
I tried ReadKey and Console.ReadLine but im not sure where to go from here
namespace VendingMachine
{
class Program
{
static void Main(string[] args)
{
//Gives user necessary info to operate vending machine
Console.WriteLine("Welcome to vending machine.");
Console.WriteLine("We offer you (s)oda, coo(k)ies, and (c)hips");
Console.WriteLine("Please select the product you want to purchase:");
string userselection = Console.ReadLine();
if (userselection == "s")
{
//Generates a random number between 0 and 5 using the random class
Random rn = new Random();
int randomnumber = rn.Next(1, 5);
double lottery = randomnumber * 10;
Console.WriteLine("Congratulations! You win a coupon with " + lottery + " cents.");
//soda price after lottery
double sodaprice = 100 - lottery;
Console.WriteLine("You only need to pay " + sodaprice + " cents");
Console.WriteLine("Please insert a coin of 5, 10, or 25:");
string coininput = Console.ReadLine();
double coin = Convert.ToDouble(coininput);
while (coin > 0)
{
if (coin == 25)
{
double sodapricecoins = sodaprice - coin;
Console.WriteLine("You still owe " + sodapricecoins + " cents.");
Console.WriteLine("Please insert a coin of 5, 10, or 25:");
break;
}
else if (coin == 10)
{
double sodapricecoins = sodaprice - coin;
Console.WriteLine("You still owe " + sodapricecoins + " cents.");
Console.WriteLine("Please insert a coin of 5, 10, or 25:");
break;
}
else if (coin == 5)
{
double sodapricecoins = sodaprice - coin;
Console.WriteLine("You still owe " + sodapricecoins + " cents.");
Console.WriteLine("Please insert a coin of 5, 10, or 25:");
break;
}
}
}
}
}
}
The program should be running continuously until it hits 0 or negative, I know I don't have that part yet.
The first thing to do is to remove the break inside the three if, but if you notice the three if contains the same code. They are not needed at all.
The second point is to have a way to exit the loop. This could be when the user types zero for the coin of if the amount due is equal or below zero.
The third point is to ask the coin value inside the loop, do the math and then decide if you want to continue the loop or stop it.
Console.WriteLine("You only need to pay " + sodaprice + " cents");
// To force to start the loop, we ask the value inside the loop
double coin = 1d;
// We should reach zero or less starting from the initial price (minus lottery)
double amountDue = sodaprice;
while (coin > 0)
{
Console.WriteLine("Please insert a coin of 5, 10, or 25:");
string coininput = Console.ReadLine();
// use tryparse when trying to convert user input in numbers.
// tryparse returns true if the input is a number without raising exceptions
if(double.TryParse(coininput, out coin))
{
// Decrement the amount to pay with the user input
amountDue -= coin;
// Decide for a message and continue the loop or stop
if(amountDue > 0)
Console.WriteLine("You still owe " + amountDue + " cents.");
else
break;
}
}
If you want that program runs continuously until sodaprice hits 0 or negative try this code, but your while loop with coin > 0 condition, continue until user types zero or negetive number.
//Gives user necessary info to operate vending machine
Console.WriteLine("Welcome to vending machine.");
Console.WriteLine("We offer you (s)oda, coo(k)ies, and (c)hips");
Console.WriteLine("Please select the product you want to purchase:");
string userselection = Console.ReadLine();
if (userselection == "s")
{
//Generates a random number between 0 and 5 using the random class
double lottery = new Random().Next(1, 5) * 10;
Console.WriteLine("Congratulations! You win a coupon with " + lottery + " cents.");
//soda price after lottery
double sodaprice = 100 - lottery;
Console.WriteLine("You only need to pay " + sodaprice + " cents");
double coin;
do
{
Console.WriteLine("Please insert a coin of 5, 10, or 25:");
if (double.TryParse(Console.ReadLine(), out coin))
{
if (coin == 25 || coin == 10 || coin == 5)
{
sodaprice -= coin;
Console.WriteLine(sodaprice > 0 ? "You still owe " + sodaprice + " cents." : "Finish...");
}
}
} while (sodaprice > 0);
}
Console.ReadLine();

C# code issue - Code not working properly

I wrote a basic number guessing game from C#. It seems to return the 3rd option ("Wrong choice! Please try again.") every time no matter what var c is chosen by the user. I was trying with characters (s instead of 1 and w instead of 2 etc with c as a string) but it gave the same results. Not sure where it's going bad.
using System;
namespace Challanges
{
class Program
{
static int guess = 500;
static int low = 1;
static int high = 1000;
static bool cont = false;
static void Guess() //guesses and adjusts variables according to input.
{
int c;
Console.WriteLine("Is your number greater or less than: " + guess + Environment.NewLine + "If it is less than, press 1; if it is greater, press 2." + Environment.NewLine + "If it is your number, press 3.");
c = Convert.ToInt32(Console.Read());
if (c == 1)
{
high = 500;
guess = low + high / 2;
}
else if (c == 2)
{
low = 500;
guess = low + high / 2;
}
else if (c == 3)
{
Console.WriteLine("Congratulations!! We found your number!");
cont = true;
}
else
{
Console.WriteLine("Wrong choice! Please try again.");
Console.ReadKey();
}
}
static void Main(string[] args)
{
Console.WriteLine("Hello World!" + Environment.NewLine + "Let's play a guessing game. Think of a number between 1 and 1000." + Environment.NewLine + "Type your number :)");
int x = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Your number is: " + x + Environment.NewLine + "Too easy?");
Console.ReadKey();
Console.WriteLine("Think of a number");
if(cont == false)
{
Guess();
} else
{
Console.ReadKey();
}
}
}
}
As mentioned in the comments before, Console.Read() returns a character code. The character code for the number 1 is 49, thus your conditions fail and the else block is executed.
What you wanted to do was use Console.ReadLine()which returns a string instead of character codes. If you cast that string into an Int32 you should be able to evaluate your conditions correctly.

Please help i have got very confused with the if statement below

I want the user to input a number, but if it is below zero I would like to show an error message and then loop round and ask the user for another number. Here is the code I have at the moment.
// this determines what the loop does.
for (int CustPos = 0; CustPos < LineNum; CustPos = CustPos + 1)
{
// this asks the user to enter the sales figures
Console.Write("enter sales figures for" + customer[CustPos] + " ");
// this is user's input is read in and stored.
sales_figures[CustPos] = Double.Parse(Console.ReadLine());
if (sales_figures[CustPos] < MIN_SALES_FIGURE) //True - continue
{
Console.WriteLine("");
Console.WriteLine("entry invalid");
Console.WriteLine("enter another value");
}
else//FALSE -> Go back to start of loop
{
Console.WriteLine("");
}
//this section displays the cust name, sales figure 70/30.
Console.WriteLine(" ");
fee_payable[CustPos] = (sales_figures[CustPos] / 100.0)
* licence_fee_in_percent[CustPos];
Console.WriteLine(customer[CustPos] +
" ----------- " + fee_payable[CustPos]);
Console.WriteLine("Licence fee to be paid in GBP is :" +
fee_payable[CustPos]);
seventy_percent_value = ((fee_payable[CustPos] / 10.0) * 7);
Console.WriteLine("70 percent of this fee is" +
seventy_percent_value);
thirty_percent_value = ((fee_payable[CustPos] / 10.0) * 3);
Console.WriteLine("30 percent of this fee is" +
thirty_percent_value);
Console.WriteLine(" ");
}
. Please help all advice will be greatly appreciated!
Thanks
I think a do-while loop would be better here, pseudocode:
userInput = -1
do
{
userInput = Console.ReadLine
}
while (userInput <0)
Colin E.
Youre on the right track, just look at the keyword Continue
This is the example in the link:
using System;
class ContinueTest
{
static void Main()
{
for (int i = 1; i <= 10; i++)
{
if (i < 9)
{
continue;
}
Console.WriteLine(i);
}
}
}
Note: The continue statement passes control to the next iteration of the enclosing iteration statement in which it appears.
if (sales_figures[CustPos] < MIN_SALES_FIGURE) //True - Continue //FALSE -> Go back to start of loop
You don't actually have any code here to make it go back to the start of the loop.
I recommend that you write it all out as pseudocode first, then turn it into code:
if (number entered is too low)
then restart loop
otherwise carry on
Instead of an if, you'll want a while:
while( sales_figure[CustPos] < 0 )
{
Console.Write("enter sales figures for" + customer[CustPos] + " ");
sales_figures[CustPos] = Double.Parse(Console.ReadLine());
}
Which guarantees that it will keep prompting until they enter something greater than zero.
Continue, does NOT do what you want it to. Continue means, "move on and ignore this iteration" which means you'd have an incorrect value for that customer.
Use a WHILE loop in combination with your IF:
continueflag = 0;
while (continueflag == 0)
{
sales_figures[CustPos] = Double.Parse(Console.ReadLine());
Console.WriteLine("");
if (sales_figures[CustPos] >= MIN_SALES_FIGURE) {
Console.WriteLine("entry invalid");
Console.WriteLine("enter another value");
} else continueflag = 1;
}

Categories

Resources