おもしろそうなので書いてみました
ただ、質問の内容が丸投げであるとの指摘があるようなので、好き勝手書きました
何か参考になれば幸いです
ruby
1# 2体のポケモンを戦わせる
2class PokemonBattle
3 def initialize(pokemon_a, pokemon_b)
4 @turn_count = 0
5 @players = [pokemon_a, pokemon_b]
6 end
7
8 def game_start!
9 print_initial_situation
10 loop do
11 battle!
12 print_battle_situation
13 turn_phaze!
14 break if game_over?
15 end
16 end
17
18 private
19
20 # 剰余で順繰りに順番を回す
21 def turn_phaze!
22 @turn_count += 1
23
24 @players.reverse! if @players.size.modulo(@turn_count).even?
25 end
26
27 # たたかう
28 def battle!
29 attacker, defender = @players # 攻撃側と防御側を取り出す
30 defender.taken_damage!(attacker.attack_power)
31 end
32
33 def print_initial_situation
34 puts @players.map(&:own_status)
35 end
36
37 # 実際に戦った状況を報告する
38 def print_battle_situation
39 attacker, defender = @players
40 puts [
41 "#{attacker.name}のこうげき",
42 "#{defender.name}は#{attacker.attack_power}のダメージをうけた!",
43 ("#{defender.name}はやられてしまった!" if defender.defeated?)
44 ]
45 end
46
47 def game_over?
48 @players.find(&:defeated?) # やられたひとが居ないか探す
49 end
50end
51
52# 名前, 体力, 攻撃力パラメータを持つポケモンを生成する
53class Pokemon
54 attr_reader :name, :vitality, :attack_power
55
56 # 引数をハッシュ形式で受けて適切な変数に割り当て
57 def initialize(**opts)
58 @name = opts[:name]
59 @vitality = opts[:vitality]
60 @attack_power = opts[:attack_power]
61 end
62
63 def own_status
64 "なまえ:#{@name}, たいりょく:#{@vitality}, こうげき:#{@attack_power}"
65 end
66
67 def defeated?
68 @vitality <= 0
69 end
70
71 def taken_damage!(attack_power)
72 @vitality -= attack_power
73 end
74end
75
76pidgey = Pokemon.new(name: 'ポッポ', vitality: 100, attack_power: 30)
77clefairy = Pokemon.new(name: 'ピッピ', vitality: 50, attack_power: 20)
78
79# 実際に死なないように複製体で戦わせる
80battle = PokemonBattle.new(pidgey.clone, clefairy.clone)
81battle.game_start!
82# =>
83# なまえ:ポッポ, たいりょく:100, こうげき:30
84# なまえ:ピッピ, たいりょく:50, こうげき:20
85# ポッポのこうげき
86# ピッピは30のダメージをうけた!
87#
88# ピッピのこうげき
89# ポッポは20のダメージをうけた!
90#
91# ポッポのこうげき
92# ピッピは30のダメージをうけた!
93# ピッピはやられてしまった!