2016-10-24 10 views
0

tractor_beamインスタンスのメソッドを追加する必要があります。アイテムの文字列の説明(例:「牛」)をパラメータとして使用します。呼び出されたとき、このメソッドはシールドを無効にし、船の現在の位置と共に物資を追加し、ピックアップするのが重すぎない場合(下記のアルゴリズムを参照)、再度シールドを有効にしてtrueを返します。項目が重すぎてピックアップできない場合、メソッドはインベントリ更新をスキップしてfalseを返します。メソッド呼び出し時の戻り値が正しくありません

Algorithm:

項目は、その文字が.ordを使用して複数500まで追加あれば拾うためには重すぎる(私は知っている、非常に科学的なわけではありません。)例えば、の手紙は、まで追加、私たちのトラクタービームは牛を拉致することができますので、問題ありません。

私の問題は、それがnilと空のハッシュを返すことです。どのようにしてアイテムを分割してそれぞれを追加するのですか?

コード:

class Spaceship 
    attr_accessor :name, :location, :item, :inventory 
    attr_reader :max_speed 

    def initialize (name, max_speed, location) 
    puts "Initializing new Spaceship" 
    @name = name 
    @max_speed = max_speed 
    @location = location 
    @item = item 
    @inventory = {} 
    end 

    def disable_shield 
    puts "Shield is off!" 
    end 

    def enable_shield 
    puts "Shield is on!" 
    end 

    def warp_to(location) 
    puts "Traveling at #{max_speed} to #{location}!" 
    @location = location 
    end 

    def tractor_beam(item) 
    disable_shield 

    item = item.split('') 

    item.each do |let| 
     let.ord 
     let + let.next 
    end 

    return item 

    if item > 500 
     enable_shield 
     @inventory[@location] = item 
     return true 
    else 
     return false 
     end 
    end 
end 

ドライバコード:

uss_enterprise = Spaceship.new("USS Enterprise","200,000 mph", "China") 

hms_anfromeda = Spaceship.new("HMS Andromeda", "108,277 mph", "China") 

uss_enterprise.disable_shield 
hms_anfromeda.enable_shield 

p hms_anfromeda.location 

hms_anfromeda.warp_to("Namibia") 

p hms_anfromeda.location 

hms_anfromeda.tractor_beam("cow") 

p hms_anfromeda.item 

ターミナル:

Initializing new Spaceship 
Initializing new Spaceship 
Shield is off! 
Shield is on! 
"China" 
Traveling at 108,277 mph to Namibia! 
"Namibia" 
Shield is off! 
nil 
+1

あなたのトラクタービームを選ぶことができます。これは、トリックを行う必要があります

item.each do |let| let.ord let + let.next end return item if item > 500 

牛を、羽はない? –

+1

もちろん、クラスは「スターシップ」と呼ばれるべきですか? –

+0

トラクタ_ビーム(項目)の37行目の "返品明細"の後にコードに到達することはできません。 'item> 500'が呼び出されない場合。 –

答えて

1

:また

、あなたが実際にこのような何かをしたいかもしれませんあなたは私が思うinitialize方法で作成され@item変数のインスタンスを使用していません条件付きは決して実行されません。それを取り除く。 第二に、あなたはordを使用してアイテムの重量を得るが、あなたは何に値を代入されていません。

item = item.split('') 
weight = 0 

item.each do |let| 
    weight += let.ord # add the ord of this letter to the weight 
end 

if weight > 500 # weight is now the ord of each letter of item 'cow' 
    enable_shield 
    @inventory[@location] = item 
    return true 
else 
    return false 
end 
+0

これはまだ空の配列を返します。位置は、 "体重が500未満"の場合は牛が必要です。 – SG17

1

このラインtractor_beamメソッドのは、if文に到達する前に毎回実行されるため、問題が発生していると思います。 、あなたはif条件の前にreturn文を持って、まず

def tractor_beam(item) 
    disable_shield 

    @item = item.split('') 
    weight = 0 

    @item.each do |let| 
    weight += let.ord 
    end 

    if weight < 500 
    enable_shield 
    @inventory[@location] = @item 
    return true 
    else 
    return false 
    end 
    end 
end 
+0

@C dot StrifeVIIそれでもやりたいことはしません。 – SG17

+0

@ carlmarkhamそれでもやりたいことはしません。 – SG17

+0

私は答えなかった、私はちょうど答えを編集した –

関連する問題