HELP? Guess the number game.!!!
-
Thursday, October 18, 2012 4:21 PM
Hello, i have just started computing, and have had trouble making a guess the number game on Small basic. I have to let the user have eight tries before the games ends below is a script of what i have done so far.
TextWindow.WriteLine ("Hello, can you guess the number i am thinking of?, it is between 1 and 100")
RandomNumber= Math.GetRandomNumber (100)
MakeGuess:
Guess=Textwindow.Read()
If Guess > RandomNumber Then
TextWindow.WriteLine ("Nope, that's wrong. My number is lower")
Goto MakeGuess
EndIf
If Guess < RandomNumber Then
TextWindow.WriteLine ("Nope, that's wrong. My number is higher")
Goto MakeGuess
EndIf
If Guess=RandomNumber Then
Sound.PlayBellRing()
TextWindow.WriteLine ("Yeah, you are correct!")
EndIf
If Goto MakeGuess=(8) Then
TextWindow.WriteLine ("You have had far too many guesses, so GAMES OVER (muhahahaha) LOSER!!!")
EndIfthe underlined and bold bit is the bit that does not work. HELP??? PlZ!!
All Replies
-
Thursday, October 18, 2012 4:50 PM
The line "if goto makeguess..." does not make sense
try this:
TextWindow.WriteLine ("Hello, can you guess the number i am thinking of?, it is between 1 and 100")
RandomNumber= Math.GetRandomNumber (100)
tries = 0
MakeGuess:
Guess=Textwindow.Read()tries = tries + 1
If Guess > RandomNumber Then
TextWindow.WriteLine ("Nope, that's wrong. My number is lower")
ElseIf Guess < RandomNumber Then
TextWindow.WriteLine ("Nope, that's wrong. My number is higher")
EndIfIf Guess=RandomNumber Then
Sound.PlayBellRing()
TextWindow.WriteLine ("Yeah, you are correct!")
Else
if tries < 8 then
goto MakeGuess
else
TextWindow.WriteLine ("You have had far too many guesses, so GAMES OVER (muhahahaha) LOSER!!!")
endif
EndIf
The whole data on the internet is saved in 540.000.000.000.000.000.000.000.000 electrons, which is as much as a handful of peanuts
- Edited by Rene_Miner Thursday, October 18, 2012 4:52 PM
- Proposed As Answer by Math Man Thursday, October 18, 2012 4:59 PM
- Marked As Answer by Ed Price - MSFTMicrosoft Employee, Owner Tuesday, October 30, 2012 8:18 AM
-
Thursday, October 18, 2012 6:54 PM
Hi Ruweyda,
Welcome to the forums. Here is a simple example for you to look at, try and move away from using GoTo's.
Answer = Math.GetRandomNumber(100) For Guesses = 1 To 8 TextWindow.Write("Guess: ") Guess = TextWindow.ReadNumber() If Guess > Answer Then TextWindow.WriteLine("Guess Lower") ElseIf Guess < Answer Then TextWindow.WriteLine("Guess Higher") Else TextWindow.WriteLine("WINNER - You guessed in " + Guesses + " guesses") Guesses = 8 EndIf EndFor -
Thursday, October 18, 2012 7:21 PM
...move away from using GoTo's.
What's so wrong in the use of goto? Does the computer explode if it's used too often?
It's the most simple (and probably the second important) command for controlling a computer. JMP was there before JSR - and JSR is a combination of 2 JMPs. So one day you might advice people not to use Subs, because they do two Goto's?
If goto would be such a dangerous command - why did they build it in?
And the other thing: Listing above doesn't tell, if game's over
The whole data on the internet is saved in 540.000.000.000.000.000.000.000.000 electrons, which is as much as a handful of peanuts
- Edited by Rene_Miner Thursday, October 18, 2012 7:28 PM
-
Thursday, October 18, 2012 8:15 PMI think he said that because too many 'goto's can lead to spaghetti code (or very unreadable code).
I am a 10 year old that loves math, games, and computers. 'Binary is as easy as 1, 10, 11.'
-
Thursday, October 18, 2012 10:58 PM
There is nothing wrong with using Goto's as such but why make your life harder? It's about using the right tools for the task at hand.
"For loops are the shorthand way to make loops when the number of iterations is known" - The original poster knew how many times he wanted to ask the same questions and perform the same checks, so why use a GoTo?
GoTo's are generally harder to read and follow, like Math Man said they can lead to spaghetti code, sub routines can too but then are more so than not placed inside a main loop keeping spaghetti code to a minimum.
Here is an example why you shouldn't use them
ThisIsTrue = "True" While ThisIsTrue TextWindow.WriteLine("ThisIsTrue") Goto ThisIsFalse EndWhile ThisIsFalse: TextWindow.WriteLine("ThisIsTrue should now be false but it isn't!")
So I have escaped my condition even though its not false, why would I do that?
-
Friday, October 19, 2012 12:40 AMAnswererI sometimes use Gotos myself, but try to keep them to a minimum. 90% of it is for infinite loops.
The other rare uses would be to escape from or immediately reach the end of a loop. Respectively emulating the keywords 'Break' & 'Continue', which don't exist in SB.
Specifically for the For...EndFor loop type, a 'Break' can be scheduled to happen next time the loop reaches the EndFor, by making the iterator = condition ( or greater than ). Just like Mainchip did w/ the iterator Guesses = 8.
In fact, it's the 1st time I see some1 using "for break hack" besides myself in this forum! ;-P
A last example of use of Goto would be to jump ahead and skip a portion of code inside a loop, which shouldn't be executed at 1st, but should happen for all the other times. It's a little spaghetti doing so, but it spares the need & execution time to make an extra If...EndIf condition just to avoid that 1st execution!
In general, just avoid Gotos and use loops & subroutines instead!
@ Rene_Miner -> Java language creators deliberately removed Goto keyword from it! >;-)Click on "Propose As Answer" if some post solves your problem or "Vote As Helpful" if some post has been useful to you! (^_^)
-
Friday, October 19, 2012 12:56 AMAnswerer
And the other thing: Listing above doesn't tell, if game's over.
Nice spot! But there are solutions too!
A boolean flag variable can be used, which is the easiest method or...
Consider the following 3 For loops:
For guesses = 1 To 8 EndFor TextWindow.WriteLine("Guesses = " + guesses) For guesses = 1 To 8 guesses = 8 EndFor TextWindow.WriteLine("Guesses = " + guesses) For guesses = 1 To 8 guesses = 8 + 1 EndFor TextWindow.WriteLine("Guesses = " + guesses)The 1st 2 loops, by the end, have guesses = 9, which is the condition 8 increased by 1.
Now, 3rd one we obtain guesses = 10, which is condition 8 increased by 1, plus the additional 1 present in guesses = 8 + 1.
Thus, a For loop which hadn't its iterator manipulated (and w/ Step = 1), would always finish w/ its iterator = condition (after the To keyword) + 1. Otherwise, we can conclude the iterator has been manipulated to a greater number!
Click on "Propose As Answer" if some post solves your problem or "Vote As Helpful" if some post has been useful to you! (^_^)
- Edited by GoToLoopEditor Friday, October 19, 2012 1:18 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 1:18 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 1:23 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 1:24 AM
-
Friday, October 19, 2012 1:13 AMAnswerer
Hi again!
Re-modified the already modified Mainchip's version, to illustrate better the abnormal loop break check.
And guess what, shoved in an infinite Goto loop! Mwaahahah!!!
guessesMax = 8 numberMax = 100 TextWindow.BackgroundColor = "DarkBlue" GameLoop: TextWindow.Clear() answer = Math.GetRandomNumber(numberMax) TextWindow.WriteLine("Guess a number between 1 & " + numberMax + " :") TextWindow.WriteLine("") For guesses = 1 To guessesMax TextWindow.Write("Guess #" + guesses + " ") guess = TextWindow.ReadNumber() If guess > answer Then TextWindow.WriteLine("Guess Lower!") ElseIf guess < answer Then TextWindow.WriteLine("Guess Higher!") Else TextWindow.WriteLine("WINNER! - You've guessed in " + guesses + " guess(es).") guesses = guessesMax + 1 ' guesses will be greater than guessesMax + 1 in the end EndIf TextWindow.WriteLine("") EndFor If guesses = guessesMax + 1 Then ' True if loop iterator had not been tampered with TextWindow.WriteLine("You've had far too many guesses, so GAME OVER (mwaaahahahah) LOSER!!!") EndIf TextWindow.Pause() Goto GameLoop
Click on "Propose As Answer" if some post solves your problem or "Vote As Helpful" if some post has been useful to you! (^_^)
- Edited by GoToLoopEditor Friday, October 19, 2012 1:16 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 2:41 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 2:42 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 2:42 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 2:46 AM
- Edited by GoToLoopEditor Friday, October 19, 2012 2:47 AM
- Marked As Answer by Ed Price - MSFTMicrosoft Employee, Owner Tuesday, October 30, 2012 8:18 AM
-
Friday, October 19, 2012 7:20 AM
Guys I did not mean it that way. Check the first line of this thread, Ruweyda is making her/his first steps and just learns that there is something like a "GoTo" and how to use it. So now you frighten Ruweyda of doing something wrong by using that goto, but there's nothing wrong with it if it's used in the right place.
Peace?
The whole data on the internet is saved in 540.000.000.000.000.000.000.000.000 electrons, which is as much as a handful of peanuts
-
Saturday, October 20, 2012 9:38 PM
A quote from Linus Torvalds on the utility of Goto.
And sometimes structure is bad, and gets into the way, and using a "goto" is just much clearer.
For example, it is quite common to have conditionals THAT DO NOT NEST.
In which case you have two possibilities
-
use goto, and be happy, since it doesn't enforce nesting
This makes the code more readable, since the code just does what the algorithm says it should do.
-
duplicate the code, and rewrite it in a nesting form so that you can
use the structured jumps.This often makes the code much LESS readable, harder to maintain, and bigger.
The Pascal language is a prime example of the latter problem. Because it doesn't have a "break" statement, loops in (traditional) Pascal end up often looking like total shit, because you have to add totally arbitrary logic to say "I'm done now".
Basically what it comes down to is this: If you only use goto's as your looping and branching mechanism your code is going to be a mess. However, if you religiously avoid goto's your code can wind up just as convoluted and confusing.
-
-
Sunday, October 21, 2012 3:24 AMAnswerer
The Pascal language is a prime example of the latter problem. Because it doesn't have a "break" statement, loops in (traditional) Pascal end up often looking like total shit, because you have to add totally arbitrary logic to say "I'm done now".
Small Basic doesn't have a keyword equivalent for 'break' to get outta loop, much less a 'continue' to force an immediate next iteration of it.
So, I do use Gotos for these cases. Or use the obscure & messy 'break hack emulation' in the case of For loops, making the iterator variable >= the end condition; which is equivalent of saying an encrypted "I'm done now"!
Moreover, it'd be gr8 if SB had some new keywords like -> BreakFor, BreakWhile & NextFor, NextWhile.
It would be nicey as well if we had a new type of loop where the condition is checked at the end of it. Like -> Repeat ... Until <condition becomes TRUE>.
And of course, the equivalents -> BreakRepeat & NextRepeat! ;-P
It'd be excellent for user's input, where a loop has to happen at least once, and keep on repeating until its exit condition is satisfied!
Click on "Propose As Answer" if some post solves your problem or "Vote As Helpful" if some post has been useful to you! (^_^)
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:25 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:26 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:33 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:34 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:34 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:35 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:37 AM
- Edited by GoToLoopEditor Sunday, October 21, 2012 3:39 AM
- Marked As Answer by Ed Price - MSFTMicrosoft Employee, Owner Tuesday, October 30, 2012 8:18 AM

