Hello Ruby Masters! I'm attempting to write a very simple guessing game script in an effort to expand my knowledge about the Ruby Language. I'm running ruby on my OpenSuse Linux 10 box at home. I'm typically a web-programmer, but I want to get into something a little more deep. Here is my little script: ---------------- # set the default result theResult = 0 # create the random number theNumber = rand(10) while theResult != 3 print "Guess my number: " theGuess = gets.to_i # return key # 1 = number is lower # 2 = number is higher # 3 = number matched! if theNumber < theGuess theResult = 1 elseif theNumber > theGuess theResult = 2 elseif theNumber = theGuess theResult = 3 end case theResult when 1 puts "My number is lower." when 2 puts "My number is higher." when 3 puts "You guessed my number!" end print "The Result: " print theResult print "\n" print "The Guess: " print theGuess.class print "+" print theGuess print "\n" print "The Number: " print theNumber print "\n" end ---------------- and here's my output when I run it: ---------------- utdream@dream:~/ruby_scripts> ruby guess_number.rb Guess my number: 1 The Result: 0 The Guess: Fixnum+1 The Number: 3 ---------------- The result staying at 0 tells me that NONE of my comparisons worked. Can anyone tell me why? I'm sure this is something simple but any help would be appreciated. Thanks in advance! Warm regards, Jordan Michaels Vivio Technologies
on 2006-03-05 00:37
on 2006-03-05 01:04
> elseif theNumber = theGuess I guess you mean == here, not =. Best, Ulrich
on 2006-03-05 01:04
Jordan Michaels wrote: > > end > print "The Result: " > print theNumber > print "\n" > end > ---------------- > (there is no elseif kayword but elsif) It seems to be working for me. You could replace the if/elsif statements with case statement case when theNumber < theGuess # blah when theNumber > theGuess # blah else # blah end lopex
on 2006-03-05 01:07
Jordan Michaels <email@example.com> writes: > elseif theNumber > theGuess > theResult = 2 > elseif theNumber = theGuess elseif is not Ruby... try elsif instead. furthermore, equality is "==", not "=". Here, you assigns theGuess to theNumber. This assignment return the value of theGuess, hence always "true". > and here's my output when I run it: Strange. If i try to run your script, i get a : bla.rb:17: undefined method `elseif' for main:Object (NoMethodError) That's not the case for you ?
on 2006-03-05 01:07
oops it seems I missed this (theNumber = theGuess) lopex
on 2006-03-05 01:16
Eric Jacoboni wrote: > >> > >Strange. If i try to run your script, i get a : > >bla.rb:17: undefined method `elseif' for main:Object (NoMethodError) > >That's not the case for you ? > > > No, it was not the case, but that might have been helpful! > ruby --version ruby 1.8.2 (2004-12-25) [i586-linux] I'm downloading 1.8.4 as I write this. We'll see if that doesn't give me better error messages. Thanks to all for your support and suggestions! Changing the "elseif" to "elsif" did the trick. The script now works as intended. I agree with a lot of your suggestions about equality (==), and using case instead of if. When programming for clients I make a point to use the most efficient and correct code as possible, but I'm just playing with this at the moment. ;) Thanks again. It's nice to have a friendly place to turn to when you have questions! Warm regards, Jordan Michaels Vivio Technologies
on 2006-03-05 02:02
On 3/4/06, Jordan Michaels <firstname.lastname@example.org> wrote: > # set the default result > # 1 = number is lower > case theResult > when 1 > puts "My number is lower." > when 2 > puts "My number is higher." > when 3 > puts "You guessed my number!" > end This is a good place to use symbols -- if nothing else, you won't need the comments explaining the keys: if theNumber < theGuess theResult = :lower elsif theNumber > theGuess theResult = :higher elsif theNumber = theGuess theResult = :equal end case theResult when :lower puts "My number is lower." when :higher puts "My number is higher." when :equal puts "You guessed my number!" end
on 2006-03-05 02:29
On 4-Mar-06, at 8:00 PM, Bill Guindon wrote: >> Here is my little script: >> theGuess = gets.to_i >> theResult = 3 > > >> print "The Result: " >> print theNumber >> The Guess: Fixnum+1 >> The Number: 3 >> ---------------- >> >> The result staying at 0 tells me that NONE of my comparisons >> worked. Can >> anyone tell me why? I'm sure this is something simple but any help >> would >> be appreciated. You could avoid the symbols if you are prepared to understand the <=> comparison, a short example might be the_number = rand(10) loop do print "Guess my number: " the_guess = gets or break # hit eof case the_number <=> the_guess.to_i when -1 puts "My number is lower" when 1 puts "My number is higher" else puts "You guessed my number" break end end It may be interesting to see how you can trap "bad" input and generate a useful error message using what comes with Ruby Mike -- Mike Stok <email@example.com> http://www.stok.ca/~mike/ The "`Stok' disclaimers" apply.