ruby 自回答の転记Ref:[Ruby - Rubyで次の仕様を満たすPokemonクラスを持つプログラム...(98411)| teratail](https://teratail.com/q

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby 自回答の転记Ref:[Ruby - Rubyで次の仕様を満たすPokemonクラスを持つプログラム...(98411)| teratail](https://teratail.com/q相关的知识,希望对你有一定的参考价值。

# 2体のポケモンを戦わせる
class PokemonBattle
  def initialize(pokemon_a, pokemon_b)
    @turn_count = 0
    @players = [pokemon_a, pokemon_b]
  end

  def game_start!
    print_initial_situation
    loop do
      battle!
      print_battle_situation
      turn_phaze!
      break if game_over?
    end
  end

  private

  # 剰余で順繰りに順番を回す
  def turn_phaze!
    @turn_count += 1
    @players.reverse! if @turn_count.modulo(@players.size).odd?
    @players
  end

  # たたかう
  def battle!
    attacker, defender = @players # 攻撃側と防御側を取り出す
    defender.damage!(attacker.attack_power)
  end

  def print_initial_situation
    puts @players.map(&:own_status)
  end

  # 実際に戦った状況を報告する
  def print_battle_situation
    attacker, defender = @players
    puts [
      "#{attacker.name}のこうげき",
      "#{defender.name}は#{attacker.attack_power}のダメージをうけた!",
      ("#{defender.name}はやられてしまった!" if defender.defeated?)
    ]
  end

  def game_over?
    @players.find(&:defeated?) # やられたひとが居ないか探す
  end
end

# 名前, 体力, 攻撃力パラメータを持つポケモンを生成する
class Pokemon
  attr_reader :name, :vitality, :attack_power

  # 引数をハッシュ形式で受けて適切な変数に割り当て
  def initialize(**opts)
    @name = opts[:name]
    @vitality = opts[:vitality]
    @attack_power = opts[:attack_power]
  end

  def own_status
    "なまえ:#{@name}, たいりょく:#{@vitality}, こうげき:#{@attack_power}"
  end

  def defeated?
    @vitality <= 0
  end

  def damage!(attack_power)
    @vitality -= attack_power
  end
end

pidgey = Pokemon.new(name: 'ポッポ', vitality: 100, attack_power: 30)
clefairy = Pokemon.new(name: 'ピッピ', vitality: 50, attack_power: 20)

# 実際に死なないように複製体で戦わせる
battle = PokemonBattle.new(pidgey.clone, clefairy.clone)
battle.game_start!
# =>
# なまえ:ポッポ, たいりょく:100, こうげき:30
# なまえ:ピッピ, たいりょく:50, こうげき:20
# ポッポのこうげき
# ピッピは30のダメージをうけた!
#
# ピッピのこうげき
# ポッポは20のダメージをうけた!
#
# ピッピのこうげき
# ポッポは20のダメージをうけた!
#
# ポッポのこうげき
# ピッピは30のダメージをうけた!
# ピッピはやられてしまった!

以上是关于ruby 自回答の転记Ref:[Ruby - Rubyで次の仕様を満たすPokemonクラスを持つプログラム...(98411)| teratail](https://teratail.com/q的主要内容,如果未能解决你的问题,请参考以下文章

ruby Ruby?やってます,(`·ω·')キリッという为に押さえときたいテクニックref:http://qiita.com/kitaro_tn/items/6372e3

ruby 尝试使用实例方法Module#refineお试しでつかってみる。スコープを限定させてクラスのメソッドを改変·拡张するRef:http://www.ruby-doc.org/core

ruby Rubocopチートシートref:http://qiita.com/kitaro_tn/items/abb881c098b3df3f9871

ruby Rails4で简CSV CSVダウンロードref:http://qiita.com/oharato/items/414b7e5a61034bf8311c

ruby Chef + Kithcen环境でServerspecのテスト実行までの顺序ref:http://qiita.com/ikuwow/items/27397b9675bd50e87b73

Mac os 10.11 更新ruby