Skip to content

Instantly share code, notes, and snippets.

@gouf
Last active Oct 31, 2017
Embed
What would you like to do?
自回答の転記 Ref: [Ruby - Rubyで次の仕様を満たすPokemonクラスを持つプログラム... (98411)|teratail](https://teratail.com/questions/98411)
# 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のダメージをうけた!
# ピッピはやられてしまった!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment