2017-02-22 4 views
0

Ich versuche, eine ziemlich einfache Würfelrolle und Antwort in der Aufforderung einrichten und es funktioniert nicht richtig. Ich wollte, dass die Schleife weiter fragt, bis der Benutzer Roll, Roll oder ROLL eingibt.Bis Anweisung nicht funktioniert auf einfachen Code

def roll() 
    x = rand(5) + 1 
    y = rand(5) + 1 
    z = rand(5) + 1 
    puts "You rolled #{x},#{y},#{z}" 
    if x == y && y == z 
    puts "TRIPS! Trip #{x}s" 
    elsif x == y || y == z || x == z 
    puts "Pair!" 
    else 
    if x > y && x > z 
     puts "#{x} high" 
    end 
    if y > x && y > z 
     puts "#{z} high" 
    end 
    if z > x && z > y 
     puts "#{z} high" 
    end 
    end 
end 

puts "Type 'roll' when you're ready." 
entry = gets.chomp 

until entry == roll || Roll || ROLL 
    puts "Type 'roll' when you're ready." 
    entry = gets.chomp 
end 

roll() 

Antwort

0

Hier ist ein Beispiel, wie Sie es in einer mehr Ruby Mode machen können, die es erweiterbarer macht.

Beginnen Sie mit Ihrem roll Methode machen konzentrierte sich auf eine sehr einfache Sache:

def roll(sides = 6, count = 3) 
    Array.new(count) { rand(sides) + 1 } 
end 

Beachten Sie, dass rand(5) produziert Werte im Bereich von 0..4, es ergibt sich nie 5. Die Idee hier ist, ein Array mit beliebiger Länge zurückzugeben, und indem Sie Argumente mit Standardwerten verfügbar machen, können Sie diese Methode für andere Situationen leicht wiederverwenden.

dann alle Anzeigelogik zur Hauptschleife bewegen:

loop do 
    puts "Type 'roll' when you're ready." 
    entry = gets.chomp 

    case (entry.downcase) 
    when 'roll' 
    rolls = roll 

    puts "You rolled #{rolls.join(', ')}" 

    case (rolls.uniq.length) 
    when 1 
     puts "TRIPS! Trip #{rolls[0]}s" 
    when 2 
     puts "Pair!" 
    else 
     puts "#{rolls.max} high" 
    end 

    break 
    when 'quit' 
    break 
    end 
end 

eine Arraystruktur anstelle von drei beliebigen Variablen Verwendung erheblich hilft, wenn mit ihnen in Arbeitsaggregat. Sie können sehen, wie Dinge wie uniq und max in dieser Situation mühelos sind.

2
# Remove these two lines and just use them in the while/until 
# puts "Type 'roll' when you're ready" 
# entry = gets.chomp 


entry = '' 
# Use String.downcase on entry because the user could type rOLL or RoLl 
while entry.downcase != 'roll' # or you can use until entry.downcase == 'roll' 
    puts "Type 'roll' when you're ready." 
    entry = gets.chomp 
end 

Sie vergleichen Eintrag auf Werte, die nicht existieren. Sie müssen mit einer Zeichenfolge vergleichen.

Roll per Konvention sollte eine Klasse/Modell/Objekt einer Art sein. Zum Beispiel

class Roll 
    # create roll 
    def initialize() 
    end 
end 
roll = Roll.new 
# or for an existing class like Arrays 
array = Array.new 

ROLL vereinbarungsgemäß eine vorher würde Konstante definiert.

ROLL = 7 
# => 7 
ROLL = 4 
# => warning: already initialized constant ROLL 
Verwandte Themen