Not Sure How to Get My Program to Start Over

I am sorry if this is the wrong place. I am a complete noob. I just
started a class online and got an idea for my own program. If anyone
has time…I can’t figure out how to have my program start over.
Everything seems to run well, but it wont start over. When I try to put
the Rolldie variable into the userRoll method it gives me an error
because a constant can’t change. I am guessing I need to make a class
maybe?

def rollD6
1+rand(6)
end

def rollD4
1+rand(4)
end

def rollD8
1+rand(8)
end

def rollD10
1+rand(10)
end

def rollD12
1+rand(12)
end

def rollD20
1+rand(20)
end

def rollD100
1+rand(100)
end

def userRoll
puts “Please choose which die you would like to roll: 1: D4, 2: D6, 3:
D8, 4: D10, 5: D12, 6: D20, 7: D100”

end

userRoll

Rolldie = gets.chomp

if Rolldie == “1”
puts rollD4
elsif Rolldie == “2”
puts rollD6
elsif Rolldie == “3”
puts rollD8
elsif Rolldie == “4”
puts rollD10
elsif Rolldie == “5”
puts rollD12
elsif Rolldie == “6”
puts rollD20
elsif Rolldie == “7”
puts rollD100
else puts “You didn’t select a number 1 through 7!”
end

puts “Would you like to roll again? Y or N”
rollAgain = gets.chomp.downcase

if rollAgain == “y”
userRoll <==============THIS IS THE PROBLEM

elsif rollAgain == “n”
puts “Thank you for rolling!”
else
puts “You need to type Y or N”
end

Hi Oli,
you’ve almost answered your own question- how can I get something to
start over? What about a loop?

while(true)

break unless rollAgain
end

The traditional way of doing this is with a do-while:

do

roll dice

want to play again?

while (rollAgain == “yes”)

You might end up turning this into a class like DiceMaster, but you may
not have to. What would a DiceMaster do?
Ask which dice to use (and use the right dice.)
Roll the dice. (Maybe the dice roll themselves, like: d6.roll)
Say, Good luck!

So, you could have two classes: Dice and DiceMaster:

class Dice
def initialize(size)
@size = size
end

def roll
1+rand(@size)
end
end

class DiceMaster

def initialize
which_dice
end

def which_dice
puts “Which dice would you …?”

@dice = Dice.new(Rolldie.to_i)
end

def roll
@dice.roll
end

def play_again?
puts “Would you like to …?”

if roll_again == "y"
  true
elsif roll_again == "n"
  false
else
  puts "Must be Y or N"
  play_again
end

end
end

do
dm = DiceMaster.new
dm.roll
while dm.play_again?

Which feels like DiceMaster is not a very useful class.

Robert H. wrote in post #1184952:

You can shorten this if you use a case menu by the way.

case roll_again
when "y"
  true
when "n"
  false
end

At the least for long but simple if/else checks,
this works very well.

I love case/when menus.

I’d wish they would become first class objects within
objects/classes so that they can be accessed and queried too.

Thanks for the reply Robert. I actually just learned the case command
and love it. I finally got it to loop by adding a loop towards the end.
For some reason I kept trying to loop the whole thing. I also ended up
making a class with several methods. I now have a fully functioning D n
D dice roller! Too bad its not the 80s…I could have really used it.
I intended on adding an interface and then trying to convert it to be a
free app on Android.

Thanks for all the help guys.

You can shorten this if you use a case menu by the way.

case roll_again
when "y"
  true
when "n"
  false
end

At the least for long but simple if/else checks,
this works very well.

I love case/when menus.

I’d wish they would become first class objects within
objects/classes so that they can be accessed and queried too.

Ahhh perfect Joe. Thank you deeply. There are so many good ideas in
there. Thanks again and have a good one!

Well, if you really wanted to shorten the yes/no thing…

!!(roll_again =~ /y/i)