2016-07-27 13 views
1

私はルービーで小さなハングマンゲームを作ろうとしています。私は、次のコードを使用して推測入力を検証しようとしています:if文を入力すると、入力の種類が決まります。

puts "Enter a word: " 
answer = gets.chomp 
tries = 5 
answer_array = answer.chars 

until tries == 0 
    hits = "" 
    puts "enter your guess: " 
    guess = gets[0] 
    if guess.class != "String" 
    puts "enter a letter!!" 
    else 
    puts "nice!!!" 
    end 
    tries -= 1 
end 

をいくつかの理由 - 私は--theプログラムがスローguessのために得るものは何でも入力「の文字を入力してください!」。 if文を定義する方法に何か問題がありますか?文字列と整数を区別したいだけです。

+0

はguess.class場合 '試してみてください= STRING'や'ない(guess.is_a文字列?) 'や' guess.class.name = "文字列" ' –

答えて

3

getsは常に文字列を返すので、そのクラスを検証したいとは思いません。
guess.length == 1

それは実際には正規表現を使用して、文字であれば、あなたがチェックできる、という次のとおりです:
あなたが入力が単一の文字であることを確認したい場合は、入力の長さが1である場合には、最初に確認することができます (guess =~ /[A-Za-z]/) == 0
基本的に、最初の文字の位置はguessです。 0の位置に1文字しかなければならないので、推測が文字の場合、この条件は真となります。

そう組み合わせ:

guess = gets.chomp # You want to remove the newline! 
if (guess.length == 1) and (guess =~/[A-Za-z]/) == 0 
    puts "Nice!" 
    ... 
else 
    puts "Input a single letter!" 
end 
+2

また、大文字小文字を区別しない正規表現には'/[a-z]/i'を使います。 –

+1

また、 'guess.match(/ \ A [A-Za-z] + \ z /)'行に*文字が1つ以上含まれているかどうかをテストし、最新のルビー 'match? 'より効率的に。 '(x =〜/.../)== 0 'のものは単なる奇妙なものです。 – tadman

1

guess.nameは、Stringという定数を返します。 String"String"と異なることに気をつける必要があります。一重引用符で囲むと、文字列になりますが、定数にはなりません。

ので、

if guess.class != String 
     puts "enter a letter!!" 
    else 
     puts "nice!!!" 
    end 

にあなたのif節を変更したり、.is_a?メソッドを使用します。

if guess.is_a?(String) 
     puts "enter a letter!!" 
    else 
     puts "nice!!!" 
    end 
+2

のErm!!。このコードは無意味であることに気付く価値があります。なぜなら、 '推測'は常に**文字列になります**!私たちが本当にやりたいことは、確かに、次のようなものです: 'guess = gets.chomp; if guess.length!= 1 .... ' –

+0

真。それも意味がある。 – aBadAssCowboy

+0

でも、 '〜ならば〜!/ A [a-zA-Z] \ z/... ' –

関連する問題