Random number + guessing game trouble

This is a discussion on Random number + guessing game trouble within the C Programming forums, part of the General Programming Boards category; I've been trying to work on my first program for the last 5 hours, this program should be very simple ...

  1. #1
    Registered User
    Join Date
    May 2007
    Posts
    45

    Question Random number + guessing game trouble

    I've been trying to work on my first program for the last 5 hours, this program should be very simple but even so I've had countless different problems with it )=

    The program idea comes from a book called Teach yourself C, second edition, 1994 pg. 57. The problem is stated as so (I'm going to shorten it some and put it into my own words):

    Create a program that generates a random number, allow it so a user has 10 chances to guess the said random number. The value of the generated number should be within 1 and 100. When a player makes a guess inform the user if his guess is to low or to high.

    Unfortunately the book doesn't show to create a random number (at least up to this point it hasn't), because of this I had to look up a function that could (I'm going to try to use rand() )

    So far I've encountered the following problems:

    • For some reason, my compiler likes to compile things from the trash bin (things with the same name as my file i want to compile). This little problem took me quite some time to figure out, I would edit the program and i would get the same messages as before. So no one encounters this problem, when you delete a file say named guess.c and decide to make a new file (same name) close your editor and reopen it. I don't know why that works but it allowed me to actually try to compile the program I wanted to. Also emptying trash bin will work. If anyone has experienced this and knows why please tell me.

    • The second problem I had was I didn't include the right .h files. This one took even longer to figure out and seems kinda a silly mistake.
    • My next problem is the one I'm stuck on, I have edited and fixed and edited some more, but my program will not run (ok thats not true it does, but it won't do what I want it to). I need to generate a random number, which I have tried to do (as shown in the following code), I set it so the rand() function gets a random number, then my program is supposed to modify it so the new number is between 1 and 100. As my program runs I have found no matter what number I run I get the returned message I need to guess even higher, even when I guess higher than the limit I have set (or apparently though I set).
    • My last problem is my program seems to go a little crazy when I try to put a character instead of an integer into the input )= I would think setting the variable to an int type would stop that problem.


    So now here is my program, unfortunately its not what I really wanted I tried to add all the loop functions but I changed it thinking it was wrong before do to the first problem I had )= So now all it has is boring if loops. Also I have heard that goto function is very bad, well I'm not sure what I can use in its place so I had to use it (=

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
    
    int guess, try, correct;
    int max;
    int low;
    
    try = 10;
    max = 100;
    low = 1;
    correct = rand();
    
    /* this will attempt to give a random value to the variable "correct" */
    
     
    repeate:
    	
    	if (correct < 0) 
    	{
    	correct = -correct;
    	}
    
    	if (correct > max) 
    	{
    	correct = correct/2;
    	}
    	
    	if (correct < low) 
    	{
    	correct = correct * 2;
    	}
    	
    	if (correct < 1)
    	{
    goto repeate;
    	}
    
    	if (correct > 100) 
    	{
    goto repeate;
    	}
    
    /* This asks a user to guess a number as long as their trys have not been used up */
    
    while (try != 0)
    
    {
    
    	printf("Guess a number from 1-100, you have %d tries\n", try);
    	scanf("%d", guess);
    
    	if (guess == correct)
    	{
    		printf("Correct, good job\n");
    		try = 0;
    	}
    
    	else if (guess > correct && try != 0)
    	{
    		printf("Sorry try agian, this time guess lower\n");
    		try = try - 1;
    	}
    
    	else if (guess < correct && try != 0)
    	{
    		printf("Wrong, Try again. This time guess higher\n");
    		try = try - 1;
    	}
    	
    	
    
    		if (try == 0 && guess != correct)
    	
    			printf("You lose\n");
    	
    
    
    }
    return 0;
    }
    I'm shure theres some basic reason I can't get it to work... But I have missed it up to this point. Also if it helps I am running linux, and the compiler I use is gcc.

    thanks to anyone that can help (or took the time to read any of that) (=

  2. #2
    Woof, woof! zacs7's Avatar
    Join Date
    Mar 2007
    Location
    Australia
    Posts
    3,459
    Wow, well goto's and labels aren't really recommended anymore. Also try and use indenting...

    I would try a re-write, plan from the start

  3. #3
    Registered User
    Join Date
    May 2007
    Posts
    45
    Sorry about the layout of the program. I will do a rewrite but first do you see anything that would result in the program not working? At this time I'm using gotos because I lack the knowledge of using anything else )=
    Also may I ask why people have stopped using the goto function?

  4. #4
    Woof, woof! zacs7's Avatar
    Join Date
    Mar 2007
    Location
    Australia
    Posts
    3,459
    Because it's confusing & hard to read, loops and ifs are better.

    If you want a number between 1 and 100, use:

    Code:
    int num = rand() &#37; 100 + 1;

  5. #5
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    you have a broken logic

    rand never returns negative numbers
    if (correct < low) - in your case it means 0
    0*2 and 0/2 is still 0

    to get a random value in the [low,high] regeon you can use for the start the simple approach
    correct = low + rand()&#37;(high-low+1);
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  6. #6
    Registered User
    Join Date
    May 2007
    Posts
    45
    Quote Originally Posted by vart View Post
    you have a broken logic

    rand never returns negative numbers
    if (correct < low) - in your case it means 0
    0*2 and 0/2 is still 0

    to get a random value in the [low,high] regeon you can use for the start the simple approach
    correct = low + rand()%(high-low+1);
    Okay simpilar is better (= But I guess I am misunderstanding how
    Code:
     if (correct < low)
    would be the resulting of the error, if rand will never give me a negative number than wouldn't the program just pass over:

    Code:
     if (correct < 0) 
    	{
    	correct = -correct;
    	}
    And procede to the following if statements?

    I see now that if rand happened to give back 0 then in that special case the program should fail, but wouldn't at all other times it run fine?

  7. #7
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    in that special case the program should fail, but wouldn't at all other times it run fine?
    I said your logic is broken one place... I haven't checked if it is OK all other places...

    Use debugger to see what happening...
    Or add temporary printfs to trace your program
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  8. #8
    Registered User
    Join Date
    May 2007
    Posts
    45
    Quote Originally Posted by vart View Post
    I said your logic is broken one place... I haven't checked if it is OK all other places...

    Use debugger to see what happening...
    Or add temporary printfs to trace your program
    Ok thats a good idea, thanks for your response.

  9. #9
    Lean Mean Coding Machine KONI's Avatar
    Join Date
    Mar 2007
    Location
    Luxembourg, Europe
    Posts
    444
    Look at the following code:

    Code:
    	if (correct < low) 
    	{
    	correct = correct * 2;
    	}
    As you can see, you defined low as being 1, so any number inferior to low is definitely smaller than 1. This in turn, is a decimal number anywhere between 0 and 1. Let's take 0.5 as example:

    0.5 * 2 = 0.25

    So your multiplication doesn't help one bit but results in an infinite loop. Since you're using integers anyway, anything below 1 will be truncated to 0. So you're ending up in an endless loop, multiplying 0 all the time by 2.

  10. #10
    Woof, woof! zacs7's Avatar
    Join Date
    Mar 2007
    Location
    Australia
    Posts
    3,459
    0.5 * 2 = 1

  11. #11
    Math wizard
    Join Date
    Dec 2006
    Location
    USA
    Posts
    582
    Quote Originally Posted by KONI View Post
    0.5 * 2 = 0.25
    Shouldn't that be "0.5 * 2 = 1" instead? You're dividing in this case. Integer division can cause unforseen problems that you wouldn't normally expect. 9/5 isn't 1.8 or 2 in the case of integer division, it's 1. The trash after the decimal is ignored/discarded.

    I don't understand the repeate and goto things (is that even C?) so I can't help you there.

  12. #12
    Registered User
    Join Date
    May 2007
    Posts
    45
    Quote Originally Posted by ulillillia View Post
    Shouldn't that be "0.5 * 2 = 1" instead? You're dividing in this case. Integer division can cause unforseen problems that you wouldn't normally expect. 9/5 isn't 1.8 or 2 in the case of integer division, it's 1. The trash after the decimal is ignored/discarded.

    I don't understand the repeate and goto things (is that even C?) so I can't help you there.
    I suppose multiplying anything less than 1 (zero in this case) wouldn't make sense (=
    I guess I was thinking that the integers where getting rounded up, but that obviously isn't the case here.

    As for the goto function, it is part of the C language (according to my book... My old book). from what I have been told it is now not used very often. The only reason I use it is because I have found it easier to deal with then the normal loops and I don't have a better way of doing things at this time (=.



    By the way I have got my program to tell me if I'm higher or lower when I guess a number, but for some reason rand() has only been giving me the number 53 every time )=

  13. #13
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    By the way I have got my program to tell me if I'm higher or lower when I guess a number, but for some reason rand() has only been giving me the number 53 every time )=
    read srand description
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  14. #14
    Registered User
    Join Date
    May 2007
    Posts
    45
    Thank you this looks like exactly what I needed (=

  15. #15
    Math wizard
    Join Date
    Dec 2006
    Location
    USA
    Posts
    582
    Code:
    while (value < another)
    {
    	// do stuff
    	value++;
    }
    That's a basic loop. The loop continues until the condition is false (or a "break;" is added). There's also for and do-while. I mostly prefer "while", but there are cases where "for" comes in handy. Leaving out the "value++;" item will cause an infinite loop which makes closing the program a pain (not in Windows 98 though, but in XP Pro it is).

    For fractional values, use floats or doubles (but be careful when using high precision - 7.000000001 as a float is actually 7.0, but as a double, it's different). Floats have 7 significant figures and doubles have 15. Using == for conditions will almost always make them false - use ranges and something "close enough" instead.

Page 1 of 2 12 LastLast
Popular pages Recent additions subscribe to a feed

Similar Threads

  1. xor linked list
    By adramalech in forum C Programming
    Replies: 23
    Last Post: 10-14-2008, 11:13 AM
  2. Generating a random number?
    By Konspiracy in forum C++ Programming
    Replies: 5
    Last Post: 04-28-2007, 01:33 AM
  3. Testing Random Number Generator
    By Roaring_Tiger in forum C Programming
    Replies: 7
    Last Post: 08-12-2005, 01:48 AM
  4. Random number generator
    By Caze in forum C++ Programming
    Replies: 6
    Last Post: 12-03-2002, 08:10 AM
  5. Array of boolean
    By DMaxJ in forum C++ Programming
    Replies: 11
    Last Post: 10-26-2001, 12:45 AM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21