0

このテキストベースの RPG のガイダンスがわかりません。プレーヤーの入力で 4 つのクラスのいずれかを選択し、そのクラスを保存して統計を割り当てるようにします。今のところ、私が選択した場合にのみ機能します"Warrior"。私は何を間違っていますか?

stats = Hash.new
stats["Strength"] = 10
stats["Dexterity"] = 10
stats["Charisma"] = 10
stats["Stamina"] = 10
puts "Hello, brave adventurer.  What is your name?"
player_name = gets.chomp.capitalize

puts "Well, #{player_name}, you are certainly brave!  Choose your profession.  (Choose         from Warrior, Wizard, Archer, or Thief)."

player_class = gets.chomp.downcase

while player_class != ("warrior" || "thief" || "archer" || "wizard")
  puts "I do not recognize #{player_class} as a valid class.  Please choose between     Warrior, Wizard, Archer, or Thief."
  player_class = gets.chomp.downcase
end

if player_class == "warrior"
  puts "Yay a warrior!"
  stats["Strength"] = 20
elsif player_class == "thief"
  puts "yay a thief!"
  stats["Dexterity"] = 20
elsif player_class == "archer"
  puts "yay an archer!"
elsif player_class == "wizard"
  puts "Sweet a wizard!"
end
4

3 に答える 3

3

とても簡単です。

1.9.3p194 :001 > ("warrior" || "thief" || "archer" || "wizard")
 => "warrior" 

複数の文字列の論理 OR は、最初の文字列に評価されます。

その行を次のように置き換えることができます。

while player_class != "warrior" and player_class != "thief" and player_class !=  "archer" and player_class != "wizard"
于 2013-01-05T16:00:56.300 に答える
2

クラスを配列として設定してみてください...

player_classes = ["warrior", "thief", "archer", "wizard"]

そして、プレイヤーが有効なクラスに入ったかどうかを確認したい場合...

while ! player_classes.include? player_class 

代わりは。

単一の単語には、さらに優れたイディオムを使用できます...

%w(warrior thief archer wizard)

生成する

["warrior", "thief", "archer", "wizard"]

前進する

プレーヤー クラスをハッシュに入れることで、このアプローチを一歩進めることができます。

例えば:

player_classes = {
  'warrior' => {:message => "Yay a warrior!", :stats => {:strength => 20} },
  'thief'   => {:message => "Ooh a thief!", :stats => {:dexterity => 20} },
  'archer'  => {:message => "Cool! an archer" },
  'wizard'  => {:message => "Sweet! a wizard" }
}

次に、次のようなことができます。

while ! player_classes.key? player_class

一致が得られたら、次のようにハッシュから値を引き出すことができます。

selected_class = player_classes[player_class]
stats.merge selected_class[:stats] if selected_class[:stats] 

そのプレーヤー クラスのハッシュに統計がない場合は何も起こりません。ある場合はマージされます。

たとえば、これをテストするには...

selected_class = player_classes['warrior']
stats.merge selected_class[:stats] if selected_class[:stats] 

# stats is now {:strength=>20, :dexterity=>10, :charisma=>10, :stamina=>10}

selected_class = player_classes['wizard']
stats.merge selected_class[:stats] if selected_class[:stats] 

# stats is now {:strength=>10, :dexterity=>10, :charisma=>10, :stamina=>10}

次に、次のようにメッセージを表示できます。

puts player_classes[player_class][:message]

これにより、プレイヤー クラスの入力をキャプチャしてからハッシュを処理するロジックが削減されます。

元のコードの修正

ハッシュを使用して単純なデータ モデルとして機能します。

次のようなコードになります。

#!/usr/bin/env ruby

stats = { :strength => 10, :dexterity => 10, :charisma => 10, :stamina => 10 }

player_classes = {
  'warrior' => {:message => "Yay a warrior!", :stats => {:strength => 20} },
  'thief'   => {:message => "Ooh a thief!", :stats => {:dexterity => 20} },
  'archer'  => {:message => "Cool! an archer" },
  'wizard'  => {:message => "Sweet! a wizard" }
}

puts "Welcome brave adventurer, what is your name?"
player_name = gets.chomp.capitalize

puts "Well, #{player_name}, you are certainly brave!  Choose your profession.  (Choose from Warrior, Wizard, Archer, or Thief)."
player_class = gets.chomp.downcase

while ! player_classes.key? player_class
  puts "I do not recognize #{player_class} as a valid class.  Please choose between Warrior, Wizard, Archer, or Thief."
  player_class = gets.chomp.downcase
end

selected_class = player_classes[player_class]
stats.merge selected_class[:stats] if selected_class[:stats] 

puts selected_class[:message]

これは読みやすくもなりますが、ゲームを拡張すると、このようなコードを簡単に操作できないことがわかります。次に、関数を使用してコードをさまざまなルーチンに分割する方法について学習する必要があります。配列、ハッシュ、コレクションでできることは他にもあります。

また、Ruby の理想的な使い方である、オブジェクト指向スタイルでの Ruby のプログラミングについて、できるだけ早く学び始める必要があります。

Tutorials Point は、Ruby についてさらに学習するための非常に適切なサイトです。

于 2013-01-05T16:01:38.540 に答える
0

あなたが間違ったことについては、ディエゴの答えを参照してください。

これは、caseステートメントを使用する必要がある典型的なケースです。ルーチンを切り取って、次のようにプレーヤー クラスを取得できます。

public
def get_player_class
  case player_class = gets.chomp.downcase
  when "warrior" then puts "Yay a warrior!"; stats["Strength"] = 20
  when "thief" then puts "yay a thief!"; stats["Dexterity"] = 20
  when "archer" then puts "yay an archer!"; true
  when "wizard" then puts "Sweet a wizard!"; true
  else puts "I do not recognize #{player_class} as a valid class. "\
    "Please choose between Warrior, Wizard, Archer, or Thief."; false
  end
end

stats = {"Strength" => 10, "Dexterity" => 10, "Charisma" => 10, "Stamina" => 10,}
puts "Hello, brave adventurer.  What is your name?"
player_name = gets.chomp.capitalize
puts "Well, #{player_name}, you are certainly brave! "\
  "Choose your profession.  (Choose from Warrior, Wizard, Archer, or Thief)."
nil until get_player_class
于 2013-01-05T16:19:28.377 に答える