Last active
October 31, 2017 16:05
-
-
Save gouf/4ab56006654e8f2f64c30f2f4977f2b8 to your computer and use it in GitHub Desktop.
自回答の転記 Ref: [Ruby - Rubyで次の仕様を満たすPokemonクラスを持つプログラム... (98411)|teratail](https://teratail.com/questions/98411)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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