Guessing Game

Got a LiveCode personal license? Are you a beginner, hobbyist or educator that's new to LiveCode? This forum is the place to go for help getting started. Welcome!

Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller

drbfragged
Posts: 7
Joined: Wed Feb 24, 2016 6:07 am

Guessing Game

Post by drbfragged » Wed Feb 24, 2016 6:13 am

Hi everyone! I am learning LiveCode for a class, and we are making a guessing game. I have the game working pretty well, but I'm trying to keep the same random number until it is correctly guessed, but how I have it set up currently, I set off an endless answer loop and have to force quit to stop it. I'm looking for advice on how to have LiveCode answer once and close the dialog, but keep the same random number generated at the beginning.

Code: Select all

on mouseUp
   put the text of fld "fld_guess" into theGuess
   
   set the randomSeed to the long seconds
   put random(100) into theAnswer
   
   //Will repeat using the same number until the correct number is guessed
   repeat until theGuess is theAnswer
      if theGuess is theAnswer then
         answer "Correct"
         exit repeat
         put empty into fld "fld_guess" 
         
         //If the number is more than 5 numbers too low
      else if theGuess < (theAnswer - 5) then
         answer "Too low! Try a higher number!"
         put empty into fld "fld_guess" 
         
         //If the number is more than 5 numbers too high
      else if theGuess > (theAnswer + 5) then
         answer "Too high! Try a lower number!"
         put empty into fld "fld_guess" 
         
         //If the number is 5 or less numbers too low   
      else if theGuess < theAnswer && (theGuess >= theAnswer - 5) then
         answer "Close! Just a little higher."
         put empty into fld "fld_guess" 
         
         //If the number is 5 or less numbers too high   
      else if theGuess > theAnswer && (theGuess <=theAnswer + 5) then
         answer "Close! Just a little lower!"
         put empty into fld "fld_guess" 
         
      end if
   end repeat   
end mouseUp



Simon
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 3901
Joined: Sat Mar 24, 2007 2:54 am

Re: Guessing Game

Post by Simon » Wed Feb 24, 2016 7:48 am

Hi drbfragged,
Welcome to the forums!

I think one of your classmates asked this question already;
http://forums.livecode.com/viewtopic.php?f=7&t=26547

Simon
I used to be a newbie but then I learned how to spell teh correctly and now I'm a noob!

drbfragged
Posts: 7
Joined: Wed Feb 24, 2016 6:07 am

Re: Guessing Game

Post by drbfragged » Wed Feb 24, 2016 2:44 pm

Hi Simon! Thanks for pointing me to that thread. I tried the suggestions listed, and I am still having trouble, but I'm not really sure why. The code worked before, except for the infinite answer loop, but now, I'm getting an error whenever I run it. I added to my previous code:

Code: Select all

if theAnswer is empty then
      put random(100) into theAnswer
   end if 

Simon
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 3901
Joined: Sat Mar 24, 2007 2:54 am

Re: Guessing Game

Post by Simon » Wed Feb 24, 2016 5:44 pm

Did you read in that thread that the repeat loop wasn't needed?

Simon
I used to be a newbie but then I learned how to spell teh correctly and now I'm a noob!

drbfragged
Posts: 7
Joined: Wed Feb 24, 2016 6:07 am

Re: Guessing Game

Post by drbfragged » Wed Feb 24, 2016 6:41 pm

I did. I tried it with and without the repeat loop, and neither seems to be working. I get a different error message each way. I get the message "button "Submit Guess": execution error at line 17 (Operators -: error in left operand), char 5" without the repeat loop and "button "Submit Guess": execution error at line 17 (Operators -: error in left operand), char 5" with the repeat.

Simon
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 3901
Joined: Sat Mar 24, 2007 2:54 am

Re: Guessing Game

Post by Simon » Wed Feb 24, 2016 7:06 pm

I don't know which line 17 is?
But it's clear that the problem isn't with the loop as the 2 error messages look the same to me.

Simon
I used to be a newbie but then I learned how to spell teh correctly and now I'm a noob!

dunbarx
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 10320
Joined: Wed May 06, 2009 2:28 pm

Re: Guessing Game

Post by dunbarx » Wed Feb 24, 2016 7:25 pm

Hi.

Post your latest handler.

Do not cheat, though it seems you have not (good for you!), by looking at that other thread.

Craig Newman

drbfragged
Posts: 7
Joined: Wed Feb 24, 2016 6:07 am

Re: Guessing Game

Post by drbfragged » Wed Feb 24, 2016 7:39 pm

This is my current code. All of the errors seem to be referencing my "if" and "else if" statements, but I'm still unsure what the issue is.

Code: Select all

on mouseUp
   put the text of fld "fld_guess" into theGuess
   
   set the randomSeed to the long seconds
   if theAnswer is empty then
      put random(100) into theAnswer
   end if   
      
   //Will repeat using the same number until the correct number is guessed
   if theGuess is theAnswer then      
         answer "Correct"  
         put empty into fld "fld_guess"       
            
    //If the number is more than 5 numbers too low        
    else if theGuess < (theAnswer - 5) then     
         answer "Too low! Try a higher number!"   
         put empty into fld "fld_guess"    
            
     //If the number is more than 5 numbers too high       
     else if theGuess > (theAnswer + 5) then    
         answer "Too high! Try a lower number!"   
         put empty into fld "fld_guess"    
            
     //If the number is 5 or less numbers too low          
     else if theGuess < theAnswer && (theGuess >= theAnswer - 5) then    
         answer "Close! Just a little higher."   
         put empty into fld "fld_guess"    
            
     //If the number is 5 or less numbers too high          
     else if theGuess > theAnswer && (theGuess <=theAnswer + 5) then    
         answer "Close! Just a little lower!"   
         put empty into fld "fld_guess"    
            
     end if         
end mouseUp


dunbarx
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 10320
Joined: Wed May 06, 2009 2:28 pm

Re: Guessing Game

Post by dunbarx » Wed Feb 24, 2016 8:50 pm

Step by step, literally, By that I mean have you stepped through your handler? You will find at the very top that the variable "theAnswer" may contain the text "theAnswer" as opposed to the value you will, in a later step, load with your random number. But then your conditional never fires.

Just as a way to move forward, comment out the "if/then" lines that frame that random function line, and then step through. You can then think about ways to initialize better.

Craig

drbfragged
Posts: 7
Joined: Wed Feb 24, 2016 6:07 am

Re: Guessing Game

Post by drbfragged » Thu Feb 25, 2016 3:08 am

Hi Craig. Thanks for the advice. I think that is exactly what is happening, since it works without the if statement around the random code, but I'm not entirely sure how to resolve that. I want the random number to stay the same until it is correctly guessed, but the if statement around the random code prevents the code from running, and a repeat around the other if/else if statements throws me into an infinite answer loop.

dunbarx
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 10320
Joined: Wed May 06, 2009 2:28 pm

Re: Guessing Game

Post by dunbarx » Thu Feb 25, 2016 4:06 am

I am confused about the structure of your game.

Try this in a new button and tell me what you think. Do you know what custom properties are? The point of the handler is that the setting of the hidden answer is separate from the process that "repeats", asking for guesses until either the user gives up (is there a way out of that?) or guesses correctly, or the sun burns out.

Code: Select all

on mouseUp
   set the guessNumber of me to  random(100) 
   startAsking 
end mouseUp

on startAsking
   ask "Guess a number"
   if it is a number then
      put the guessNumber of btn 1 into tAnswer
      switch
         case it =  tAnswer
            answer "Bingo"
            exit to top
            break
         case it < tAnswer
            answer "Too Low"
            break
         case it >  tAnswer
            answer "Too High"
            break
      end switch
   end if
   startAsking 
end startAsking
Step through this. The custom property will appear in the lower handler. You can always put it somewhere more visible during development.

This ought to be a practice game for what is called a binary search. In other words, the game ought to track and exhort the user to find a way to use a minimum number of guesses. You might work on that.

There are other things it requires, besides your careful examination and feedback to me.

Craig

EDIT.

I changed "btn 2" in the above handler to "btn 1", which is what you would get if you made a new button on a card. I already had a button for another purpose.
Last edited by dunbarx on Thu Feb 25, 2016 7:03 pm, edited 2 times in total.

jacque
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 7392
Joined: Sat Apr 08, 2006 8:31 pm
Contact:

Re: Guessing Game

Post by jacque » Thu Feb 25, 2016 5:21 pm

This will fail:

Code: Select all

    else if theGuess < theAnswer && (theGuess >= theAnswer - 5) then
Ampersands are used to concatenate text. For logical comparisons use "and".
Jacqueline Landman Gay | jacque at hyperactivesw dot com
HyperActive Software | http://www.hyperactivesw.com

drbfragged
Posts: 7
Joined: Wed Feb 24, 2016 6:07 am

Re: Guessing Game

Post by drbfragged » Sat Feb 27, 2016 3:36 am

Jacque, thank you for the information. I am more familiar with Java and C#, so I am used to using ampersands.

Hi Craig. That code works well, but I am hoping to find a way to continue the input from the field, rather than the ask window. I tried to edit the code to work with the field, but I have not been able to figure that out, if that is even an option. This is what my code looks like now.

Code: Select all

on mouseUp
   put the text of fld "fld_guess" into theGuess
   set the theGuess of me to random(100) 
   startAsking 
end mouseUp

on startAsking
   if it is a number then
      put the theGuess of fld "fld_guess" into theAnswer
      switch
         //if the number is guessed correctly
         case it = theAnswer then           
            answer "Correct"  
            put empty into fld "fld_guess"       
            exit to top
            break
            
            //If the number is more than 5 numbers too low        
         case it < (theAnswer - 5) then    
            answer "Too low! Try a higher number!"   
            put empty into fld "fld_guess"
            break    
            
            //If the number is more than 5 numbers too high       
         case it > (theAnswer + 5) then    
            answer "Too high! Try a lower number!"   
            put empty into fld "fld_guess"
            break    
            
            //If the number is 5 or less numbers too low          
         case it < theAnswer and (it >= theAnswer - 5) then    
            answer "Close! Just a little higher."   
            put empty into fld "fld_guess"
            break   
            
            //If the number is 5 or less numbers too high          
         case it > theAnswer and (it<=theAnswer + 5) then    
            answer "Close! Just a little lower!"   
            put empty into fld "fld_guess"
            break
            
      end switch
   end if
   startAsking 
end startAsking
I get the error "button "Submit Guess": compilation error at line 12 (switch: bad 'case' condition) near "then", char 20" for the line case it = theAnswer then

Simon
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 3901
Joined: Sat Mar 24, 2007 2:54 am

Re: Guessing Game

Post by Simon » Sat Feb 27, 2016 3:56 am

Hi drbfragged,
In a Switch/Case you don't need the "then".
Case handles true or false all by it's self. This can cause problems when the answer fits two different Case statements so be aware that the first Case will always trigger before the second.

Simon
I used to be a newbie but then I learned how to spell teh correctly and now I'm a noob!

dunbarx
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 10320
Joined: Wed May 06, 2009 2:28 pm

Re: Guessing Game

Post by dunbarx » Sat Feb 27, 2016 5:36 am

Hi.

So much fun.

Oops. Ahem

Make a button and two fields. Name the button "Start". Put this into its script:

Code: Select all

global tAnswer

on mouseUp
   put random(99) into tAnswer
   put tAnswer into fld 2
   set the label of me to "Enter Guess"
   select text of fld 1
end mouseUp
In the FIRST field, where you will be entering the guesses, this into its script:

Code: Select all

global tAnswer

on returnInField
     switch
      case me =  tAnswer
         answer "Bingo"
         set the label of btn "start" to "Start"
         put "" into me
         exit to top
         break
       case me < tAnswer
         set the label of btn 1 to "Too Low"
         break
      case me >  tAnswer
         set the label of btn 1 to "Too High"
         break
   end switch
   put "" into me
   select text of me
end returnInField
Click the button, You can now enter a number into the guessing field, and hit return to terminate.

The second field is there just to display the random number. I used a global variable, well, just because. You can surely think of ways to improve this in terms of user interface. Let me know if this is getting closer to what you really want.

Craig

Post Reply