diff --git a/01_monster_part1.rb b/01_monster_part1.rb
new file mode 100644
index 0000000..b092dd5
--- /dev/null
+++ b/01_monster_part1.rb
@@ -0,0 +1,20 @@
+class Monster
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+    @hp = hp                                  # 設定一個名為 hp（生命值）的 attribute
+    @ap = ap                                  # 設定一個名為 ap（攻擊值）的 attribute
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+    
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+end
+
+# 以下是執行步驟
+
+monster = Monster.new("Bone", 100, 30)           # 用 Monster class 創造一個 name 為 Bone 的物件，放入 monster 這個變數裡
\ No newline at end of file
diff --git a/02_monster_part2.rb b/02_monster_part2.rb
new file mode 100644
index 0000000..00473bd
--- /dev/null
+++ b/02_monster_part2.rb
@@ -0,0 +1,38 @@
+class Monster
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+    @hp = hp                                  # 設定一個名為 hp（生命值）的 attribute
+    @ap = ap                                  # 設定一個名為 ap（攻擊值）的 attribute
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+  end
+end
+
+# 以下是執行步驟
+
+monster = Monster.new("Bone", 100, 30)           # 用 Monster class 創造一個 name 為 Bone 的物件，放入 monster 這個變數裡
\ No newline at end of file
diff --git a/03_hero_vs_monster.rb b/03_hero_vs_monster.rb
new file mode 100644
index 0000000..b5f83cb
--- /dev/null
+++ b/03_hero_vs_monster.rb
@@ -0,0 +1,98 @@
+class Monster
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+    @hp = hp                                  # 設定一個名為 hp（生命值）的 attribute
+    @ap = ap                                  # 設定一個名為 ap（攻擊值）的 attribute
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+class Hero
+
+  attr_accessor :hp, :name                          # 讓外部的 method 也可以抓到這兩個 variables
+
+  def initialize(name, hp, ap)
+    @name = name
+    @hp = hp
+    @ap = ap
+    @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+    # 印出被創造的英雄的 attributes
+    puts "你的英雄 #{@name} 已經誕生了！"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+    enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+# 以下是執行步驟
+# 遊戲開始
+
+hero = Hero.new("Robinhood", 100, 30)                # 用 Hero class 創造一個 name 為 Robinhood 的物件，放入 hero 這個 variable 裡
+monster = Monster.new("Bone", 100, 30)               # 用 Monster class 創造一個 name 為 Bone 的物件，放入 monster 這個 variable 裡
+
+while hero.is_alive? && monster.is_alive?          # 如果雙方都還活著，就繼續互相攻擊對方
+  hero.attack(monster)                             # 英雄先攻擊
+  if !monster.is_alive?                            # 判斷怪獸是否被英雄打倒
+    break
+  end
+
+  monster.attack(hero)                             # 怪獸攻擊
+end
diff --git a/04_holy_knight.rb b/04_holy_knight.rb
new file mode 100644
index 0000000..6f2bb1a
--- /dev/null
+++ b/04_holy_knight.rb
@@ -0,0 +1,123 @@
+class Monster
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name,ap,hp)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+    @hp = hp                                  # 設定一個名為 hp（生命值）的 attribute
+    @ap = ap                                  # 設定一個名為 ap（攻擊值）的 attribute
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+class Hero
+
+  attr_accessor :hp, :name                          # 讓外部的 method 也可以抓到這兩個 variables
+
+  def initialize(name, hp, ap)
+    @name = name
+    @hp = hp
+    @ap = ap
+    @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+    # 印出被創造的英雄的 attributes
+    puts "你的英雄 #{@name} 已經誕生了！"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+    enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+class HolyKnight < Hero
+
+  # 新的職業：神聖武士 HolyKnight
+  # HolyKnight 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 在這裡我們把他的 attack method 修改，讓威力更大！
+
+  def attack(enemy)
+
+    # 攻擊能力：聖光，傷害會隨機取攻擊力（AP）至兩倍 AP 中的數字
+
+    damage = rand(@ap..@ap*2)
+    enemy.hp = enemy.hp - damage
+
+    puts "#{@name} 發出聖光!"
+    puts "#{enemy.name} 受到 #{damage} 點的傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+end
+
+# 以下是執行步驟
+# 遊戲開始
+
+holy_knight = HolyKnight.new("Howard", 100, 30)          # 用 Holyknight class 創造一個 name 為 Howard 的物件，放入 holy_knight 這個 variable 裡
+monster = Monster.new("Bone", 100, 30)                   # 用 Monster class 創造一個 name 為 Bone 的物件，放入 monster 這個 variable 裡
+
+while holy_knight.is_alive? && monster.is_alive?         # 如果雙方都還活著，就繼續互相攻擊對方
+  holy_knight.attack(monster)                            # 神聖武士先攻擊
+  if !monster.is_alive?                                  # 判斷怪獸是否被英雄打倒
+    break
+  end
+
+  monster.attack(holy_knight)                            # 怪獸攻擊
+end
diff --git a/05_mage.rb b/05_mage.rb
new file mode 100644
index 0000000..ffdc674
--- /dev/null
+++ b/05_mage.rb
@@ -0,0 +1,148 @@
+  class Monster
+
+    attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+    def initialize(name,ap,hp)
+      @name = name                              # 設定一個名為 name（名稱）的 attribute
+      @hp = hp                                  # 設定一個名為 hp（生命值）的 attribute
+      @ap = ap                                  # 設定一個名為 ap（攻擊值）的 attribute
+      @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+      # 印出被創造的怪獸的 attributes
+      puts "遇到怪獸 #{@name} 了!"
+      puts "生命力(HP)：#{@hp}"
+      puts "攻擊力(AP)：#{@ap}"
+      puts ""
+    end
+
+    def is_alive?
+      return @alive
+    end
+
+    def attack(enemy)
+      damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+      enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+      # 印出攻擊的過程
+      puts "#{@name} 攻擊!"
+      puts "#{enemy.name} 受到 #{damage} 點傷害"
+      puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+      puts ""
+
+      if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+        enemy.die                                     # 敵人死亡
+      end
+    end
+
+    def die                                           # 代表死亡(戰敗)
+      @alive = false
+      puts "#{@name} 被打倒了"
+    end
+  end
+
+  class Hero
+
+    attr_accessor :hp, :name                          # 讓外部的 method 也可以抓到這兩個 variables
+
+    def initialize(name,ap,hp)
+      @name = name
+      @hp = hp
+      @ap = ap
+      @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+      # 印出被創造的英雄的 attributes
+      puts "你的英雄 #{@name} 已經誕生了！"
+      puts "生命力(HP)：#{@hp}"
+      puts "攻擊力(AP)：#{@ap}"
+      puts ""
+    end
+
+    def is_alive?
+      return @alive
+    end
+
+    def attack(enemy)
+      damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+      enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+      # 印出攻擊的過程
+      puts "#{@name} 攻擊!"
+      puts "#{enemy.name} 受到 #{damage} 點傷害"
+      puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+      puts ""
+
+      if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+        enemy.die                                     # 敵人死亡
+      end
+    end
+
+    def die                                           # 代表死亡(戰敗)
+      @alive = false
+      puts "#{@name} 被打倒了"
+    end
+  end
+
+  class Mage < Hero
+
+    # 新的職業：魔法師 Mage
+    # Mage 是繼承 Hero 的 class
+    # 他已經具備 Hero 本身的 attributes 與 methods
+    # 但他也有只屬於魔法師 attributes 與 methods: mp fireball （火球）
+
+    # Mage class 需要增加一個 attribute: mp
+    # 所以要設定一個屬於魔法師 initialize
+
+    def initialize(name, hp, ap, mp)
+      super(name, hp, ap)                               # 用繼承的語法 super 來設定屬於 Hero 的 attributes，super 會呼叫 Hero 的同名方法 initialize
+
+      # 新增一個 attribute: mp (魔法力)
+      @mp = mp
+    end
+
+    # Mage class 也需要增加一個 method: fireball
+    # 同時也要修改他的 attack method
+
+    def attack(enemy)
+      # 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp， mp 不足的話無法使用
+      if @mp >= 3
+        damage = fireball
+        enemy.hp = enemy.hp - damage
+
+        puts "#{@name} 噴射火球!"
+        puts "#{enemy.name} 受到 #{damage} 點的傷害"
+        puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+        puts ""
+
+        if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+          enemy.die                                     # 敵人死亡
+        end
+      else
+        # 如果 mp 不夠 3 點，就只能用普通的攻擊，super 會呼叫 Hero 的同名方法 attack
+        super(enemy)
+      end
+    end
+
+    def fireball
+      @mp = @mp - 3                                # 每次使用 fireball 要扣 3 點 MP
+      return rand(@ap/2..@ap) + 50        # fireball 造成的傷害是正常攻擊 +50
+    end
+  end
+
+  # 以下是執行步驟
+  # 遊戲開始
+
+  # 用 mage 這個 variable 設定一個名為 Merlin 的魔法師
+  # 再用 monster 來設定一個叫 Bone 的怪獸
+
+  mage = Mage.new("Merlin", 60, 20, 10)             # 用 Mage class 創造一個 name 為 Merlin 的物件，放入 mage 這個 variable 裡
+  monster = Monster.new("Bone", 100, 30)            # 用 Monster class 創造一個 name 為 Bone 的物件，放入 monster 這個 variable 裡
+
+  while mage.is_alive? && monster.is_alive?         # 如果雙方都還活著，就繼續互相攻擊
+    mage.attack(monster)                            # 魔法師先攻擊
+    if !monster.is_alive?                           # 判斷怪獸是否已經身亡
+      break
+    end
+
+    mage.stats                                      # 印出魔法師的屬性
+    monster.attack(mage)                            # 怪獸攻擊
+  end
diff --git a/06_team.rb b/06_team.rb
new file mode 100644
index 0000000..0eac11c
--- /dev/null
+++ b/06_team.rb
@@ -0,0 +1,181 @@
+class Monster
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+    @hp = hp                                  # 設定一個名為 hp（生命值）的 attribute
+    @ap = ap                                  # 設定一個名為 ap（攻擊值）的 attribute
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+class Hero
+
+  attr_accessor :hp, :name
+
+  @@heroes = []                                   # 用來儲存所有 heroes 的 array                          # 讓外部的 method 也可以抓到這兩個 variables
+
+  def initialize(name, hp, ap)
+    @name = name
+    @hp = hp
+    @ap = ap
+    @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+    # 印出被創造的英雄的 attributes
+    puts "你的英雄 #{@name} 已經誕生了！"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+
+    @@heroes << self                                # 把新建立的這個 hero 加入 array 裡
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+    enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+
+  def self.count
+    return @@heroes.length                          # 回傳英雄們的數量
+  end
+
+  def self.all
+    return @@heroes                                 # 回傳包含所有 hero 的 array
+  end
+end
+
+class Mage < Hero
+
+  # 新的職業：魔法師 Mage
+  # Mage 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 但他也有只屬於魔法師 attributes 與 methods: mp fireball （火球）
+
+  # Mage class 需要增加一個 attribute: mp
+  # 所以要設定一個屬於魔法師 initialize
+
+  def initialize(name, hp , ap, mp)
+    super(name, hp, ap)                               # 用繼承的語法 super 來設定屬於 Hero 的 attributes，super 會呼叫 Hero 的同名方法 initialize
+
+    # 新增一個 attribute: mp (魔法力)
+    @mp = mp
+  end
+
+  # Mage class 也需要增加一個 method: fireball
+  # 同時也要修改他的 attack method
+
+  def attack(enemy)
+    # 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp， mp 不足的話無法使用
+    if @mp >= 3
+      damage = fireball
+      enemy.hp = enemy.hp - damage
+
+      puts "#{@name} 噴射火球!"
+      puts "#{enemy.name} 受到 #{damage} 點的傷害"
+      puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+      puts ""
+
+      if enemy.hp < 1
+        enemy.die
+      end
+    else
+      # 如果 mp 不夠 3 點，就只能用普通的攻擊，super 會呼叫 Hero 的同名方法 attack
+      super(enemy)
+    end
+  end
+
+  def fireball
+    @mp = @mp - 3                                # 每次使用 fireball 要扣 3 點 MP
+    return rand(@ap/2..@ap) + 50                 # fireball 造成的傷害是正常攻擊 +50
+  end
+end
+
+class HolyKnight < Hero
+
+  # 新的職業：神聖武士 HolyKnight
+  # HolyKnight 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 在這裡我們把他的 attack method 修改，讓威力更大！
+
+  def attack(enemy)
+
+    # 新的職業：神聖武士 Holy Knight
+    # 攻擊能力：聖光，傷害會隨機取攻擊力（AP）至兩倍 AP 中的數字
+
+    damage = rand(@ap..@ap*2)
+    enemy.hp = enemy.hp - damage
+
+    puts "#{@name} 發出聖光!"
+    puts "#{enemy.name} 受到 #{damage} 點的傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+end
+
+# 建立一個有不同職業 （包括英雄、神聖武士與魔法師）的團隊
+Hero.new("Robinhood", 100, 20)
+HolyKnight.new("Howard", 100, 30)
+Mage.new("Merlin",60, 20, 10)
+
+# 列印英雄隊伍
+team = Hero.all
+
+puts "You have #{Hero.count} heroes in your team:"
+
+team.each do |hero|
+  puts "#{hero.name} - Class:#{hero.class}, HP:#{hero.hp} "
+end
diff --git a/constant.rb b/constant.rb
new file mode 100644
index 0000000..3d3e112
--- /dev/null
+++ b/constant.rb
@@ -0,0 +1,198 @@
+class Monster
+
+  MAX_HP = 150
+  MAX_AP = 50
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+
+    if MAX_HP < hp
+      @hp = MAX_HP
+    else
+      @hp = hp
+    end
+
+    if MAX_AP < ap
+      @ap = MAX_AP
+    else
+      @ap = ap
+    end                                       # 設定一個名為 hp（生命值）的 attribute
+
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+class Hero
+
+  MAX_HP = 200
+  MAX_AP = 80
+
+  attr_accessor :hp, :name
+
+  @@heroes = []                                   # 用來儲存所有 heroes 的 array                          # 讓外部的 method 也可以抓到這兩個 variables
+
+  def initialize(name, hp, ap)
+    @name = name
+    
+    if MAX_HP < hp
+      @hp = MAX_HP
+    else
+      @hp = hp
+    end
+
+    if MAX_AP < ap
+      @ap = MAX_AP
+    else
+      @ap = ap
+    end                                       # 設定一個名為 hp（生命值）的 attribute
+
+    @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+    # 印出被創造的英雄的 attributes
+    puts "你的英雄 #{@name} 已經誕生了！"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+
+    @@heroes << self                                # 把新建立的這個 hero 加入 array 裡
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+    enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+
+  def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+
+  def self.count
+    return @@heroes.length                          # 回傳英雄們的數量
+  end
+
+  def self.all
+    return @@heroes                                 # 回傳包含所有 hero 的 array
+  end
+end
+
+class Mage < Hero
+
+  # 新的職業：魔法師 Mage
+  # Mage 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 但他也有只屬於魔法師 attributes 與 methods: mp fireball （火球）
+
+  # Mage class 需要增加一個 attribute: mp
+  # 所以要設定一個屬於魔法師 initialize
+
+  def initialize(name, hp , ap, mp)
+    super(name, hp, ap)                               # 用繼承的語法 super 來設定屬於 Hero 的 attributes，super 會呼叫 Hero 的同名方法 initialize
+
+    # 新增一個 attribute: mp (魔法力)
+    @mp = mp
+  end
+
+  # Mage class 也需要增加一個 method: fireball
+  # 同時也要修改他的 attack method
+
+  def attack(enemy)
+    # 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp， mp 不足的話無法使用
+    if @mp >= 3
+      damage = fireball
+      enemy.hp = enemy.hp - damage
+
+      puts "#{@name} 噴射火球!"
+      puts "#{enemy.name} 受到 #{damage} 點的傷害"
+      puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+      puts ""
+
+      if enemy.hp < 1
+        enemy.die
+      end
+    else
+      # 如果 mp 不夠 3 點，就只能用普通的攻擊，super 會呼叫 Hero 的同名方法 attack
+      super(enemy)
+    end
+  end
+
+  def fireball
+    @mp = @mp - 3                                # 每次使用 fireball 要扣 3 點 MP
+    return rand(@ap/2..@ap) + 50                 # fireball 造成的傷害是正常攻擊 +50
+  end
+end
+
+class HolyKnight < Hero
+
+  # 新的職業：神聖武士 HolyKnight
+  # HolyKnight 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 在這裡我們把他的 attack method 修改，讓威力更大！
+
+  def attack(enemy)
+
+    # 新的職業：神聖武士 Holy Knight
+    # 攻擊能力：聖光，傷害會隨機取攻擊力（AP）至兩倍 AP 中的數字
+
+    damage = rand(@ap..@ap*2)
+    enemy.hp = enemy.hp - damage
+
+    puts "#{@name} 發出聖光!"
+    puts "#{enemy.name} 受到 #{damage} 點的傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    if enemy.hp < 1                                 # 生命值小於 1，代表死亡(戰敗)
+      enemy.die                                     # 敵人死亡
+    end
+  end
+end
+
+# 建立一個有不同職業 （包括英雄、神聖武士與魔法師）的團隊
+hero = Hero.new("Robinhood", 100000, 20)
\ No newline at end of file
diff --git a/hero_game/hero.rb b/hero_game/hero.rb
new file mode 100644
index 0000000..77a9a80
--- /dev/null
+++ b/hero_game/hero.rb
@@ -0,0 +1,71 @@
+class Hero
+
+  MAX_HP = 200
+  MAX_AP = 80
+
+  attr_accessor :hp, :name
+
+  @@heroes = []                                   # 用來儲存所有 heroes 的 array                          # 讓外部的 method 也可以抓到這兩個 variables
+
+  def initialize(name, hp, ap)
+    @name = name
+    
+    if MAX_HP < hp
+      @hp = MAX_HP
+    else
+      @hp = hp
+    end
+
+    if MAX_AP < ap
+      @ap = MAX_AP
+    else
+      @ap = ap
+    end                                       # 設定一個名為 hp（生命值）的 attribute
+
+    @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+    # 印出被創造的英雄的 attributes
+    puts "你的英雄 #{@name} 已經誕生了！"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+
+    @@heroes << self                                # 把新建立的這個 hero 加入 array 裡
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+    enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    enemy.die?
+  end
+
+  def die?
+    if hp < 1
+      die
+    end
+  end
+
+  private def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+
+  def self.count
+    return @@heroes.length                          # 回傳英雄們的數量
+  end
+
+  def self.all
+    return @@heroes                                 # 回傳包含所有 hero 的 array
+  end
+end
diff --git a/hero_game/holy_knight.rb b/hero_game/holy_knight.rb
new file mode 100644
index 0000000..465197d
--- /dev/null
+++ b/hero_game/holy_knight.rb
@@ -0,0 +1,25 @@
+require_relative "hero"
+
+class HolyKnight < Hero
+
+  # 新的職業：神聖武士 HolyKnight
+  # HolyKnight 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 在這裡我們把他的 attack method 修改，讓威力更大！
+
+  def attack(enemy)
+
+    # 新的職業：神聖武士 Holy Knight
+    # 攻擊能力：聖光，傷害會隨機取攻擊力（AP）至兩倍 AP 中的數字
+
+    damage = rand(@ap..@ap*2)
+    enemy.hp = enemy.hp - damage
+
+    puts "#{@name} 發出聖光!"
+    puts "#{enemy.name} 受到 #{damage} 點的傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    enemy.die?
+  end
+end
\ No newline at end of file
diff --git a/hero_game/mage.rb b/hero_game/mage.rb
new file mode 100644
index 0000000..2a16d1f
--- /dev/null
+++ b/hero_game/mage.rb
@@ -0,0 +1,51 @@
+require_relative "hero"
+
+class Mage < Hero
+
+  # 新的職業：魔法師 Mage
+  # Mage 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 但他也有只屬於魔法師 attributes 與 methods: mp fireball （火球）
+
+  # Mage class 需要增加一個 attribute: mp
+  # 所以要設定一個屬於魔法師 initialize
+
+  MAX_MP = 10
+
+  def initialize(name, hp , ap, mp)
+    super(name, hp, ap)                               # 用繼承的語法 super 來設定屬於 Hero 的 attributes，super 會呼叫 Hero 的同名方法 initialize
+
+    # 新增一個 attribute: mp (魔法力)
+    if MAX_MP < mp
+      @mp = MAX_MP
+    else
+      @mp = mp
+    end
+  end
+
+  # Mage class 也需要增加一個 method: fireball
+  # 同時也要修改他的 attack method
+
+  def attack(enemy)
+    # 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp， mp 不足的話無法使用
+    if @mp >= 3
+      damage = fireball
+      enemy.hp = enemy.hp - damage
+
+      puts "#{@name} 噴射火球!"
+      puts "#{enemy.name} 受到 #{damage} 點的傷害"
+      puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+      puts ""
+
+      enemy.die?
+    else
+      # 如果 mp 不夠 3 點，就只能用普通的攻擊，super 會呼叫 Hero 的同名方法 attack
+      super(enemy)
+    end
+  end
+
+  def fireball
+    @mp = @mp - 3                                # 每次使用 fireball 要扣 3 點 MP
+    return rand(@ap/2..@ap) + 50                 # fireball 造成的傷害是正常攻擊 +50
+  end
+end
\ No newline at end of file
diff --git a/hero_game/monster.rb b/hero_game/monster.rb
new file mode 100644
index 0000000..839cb00
--- /dev/null
+++ b/hero_game/monster.rb
@@ -0,0 +1,59 @@
+class Monster
+
+  MAX_HP = 150
+  MAX_AP = 50
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+
+    if MAX_HP < hp
+      @hp = MAX_HP
+    else
+      @hp = hp
+    end
+
+    if MAX_AP < ap
+      @ap = MAX_AP
+    else
+      @ap = ap
+    end                                       # 設定一個名為 hp（生命值）的 attribute
+
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    enemy.die?
+  end
+
+  def die?
+    if hp < 1
+      die
+    end
+  end
+
+  private def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
\ No newline at end of file
diff --git a/hero_game/play.rb b/hero_game/play.rb
new file mode 100644
index 0000000..84f5f20
--- /dev/null
+++ b/hero_game/play.rb
@@ -0,0 +1,18 @@
+require "./monster"
+require "./mage"
+require_relative "holy_knight"
+
+
+# 建立一個有不同職業 （包括英雄、神聖武士與魔法師）的團隊
+hero = Hero.new("Robinhood", 100000, 20)
+holy_knight = HolyKnight.new("Howard", 100, 3000)
+mage = Mage.new("Merlin",60, 20, 100)
+
+# 列印英雄隊伍
+team = Hero.all
+
+puts "You have #{Hero.count} heroes in your team:"
+
+team.each do |hero|
+  puts "#{hero.name} - Class:#{hero.class}, HP:#{hero.hp} "
+end
\ No newline at end of file
diff --git a/private.rb b/private.rb
new file mode 100644
index 0000000..ed70ee6
--- /dev/null
+++ b/private.rb
@@ -0,0 +1,209 @@
+class Monster
+
+  MAX_HP = 150
+  MAX_AP = 50
+
+  attr_accessor :hp, :name                    # 設定物件外部可以直接使用和修改 name 和 hp 的 attributes
+
+  def initialize(name, hp, ap)
+    @name = name                              # 設定一個名為 name（名稱）的 attribute
+
+    if MAX_HP < hp
+      @hp = MAX_HP
+    else
+      @hp = hp
+    end
+
+    if MAX_AP < ap
+      @ap = MAX_AP
+    else
+      @ap = ap
+    end                                       # 設定一個名為 hp（生命值）的 attribute
+
+    @alive = true                             # 怪獸剛被創造，所以預設為 true，表示怪獸創造時一定是活著的
+
+    # 印出被創造的怪獸的 attributes
+    puts "遇到怪獸 #{@name} 了!"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                   # 傷害會隨機取攻擊力的一半（AP／2）至 AP 的數字
+    enemy.hp = enemy.hp - damage                # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    enemy.die?
+  end
+
+  def die?
+    if hp < 1
+      die
+    end
+  end
+
+  private def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+end
+
+class Hero
+
+  MAX_HP = 200
+  MAX_AP = 80
+
+  attr_accessor :hp, :name
+
+  @@heroes = []                                   # 用來儲存所有 heroes 的 array                          # 讓外部的 method 也可以抓到這兩個 variables
+
+  def initialize(name, hp, ap)
+    @name = name
+    
+    if MAX_HP < hp
+      @hp = MAX_HP
+    else
+      @hp = hp
+    end
+
+    if MAX_AP < ap
+      @ap = MAX_AP
+    else
+      @ap = ap
+    end                                       # 設定一個名為 hp（生命值）的 attribute
+
+    @alive = true                                   # 英雄剛被創造，所以預設為 true，表示英雄被創造時一定是活著的
+
+    # 印出被創造的英雄的 attributes
+    puts "你的英雄 #{@name} 已經誕生了！"
+    puts "生命力(HP)：#{@hp}"
+    puts "攻擊力(AP)：#{@ap}"
+    puts ""
+
+    @@heroes << self                                # 把新建立的這個 hero 加入 array 裡
+  end
+
+  def is_alive?
+    return @alive
+  end
+
+  def attack(enemy)
+    damage = rand(@ap/2..@ap)                       # 傷害會隨機取攻擊力的一半（AP／2）至 AP 中的數字
+    enemy.hp = enemy.hp - damage                    # 新的生命力是生命力減去傷害
+
+    # 印出攻擊的過程
+    puts "#{@name} 攻擊!"
+    puts "#{enemy.name} 受到 #{damage} 點傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    enemy.die?
+  end
+
+  def die?
+    if hp < 1
+      die
+    end
+  end
+
+  private def die                                           # 代表死亡(戰敗)
+    @alive = false
+    puts "#{@name} 被打倒了"
+  end
+
+  def self.count
+    return @@heroes.length                          # 回傳英雄們的數量
+  end
+
+  def self.all
+    return @@heroes                                 # 回傳包含所有 hero 的 array
+  end
+end
+
+class Mage < Hero
+
+  # 新的職業：魔法師 Mage
+  # Mage 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 但他也有只屬於魔法師 attributes 與 methods: mp fireball （火球）
+
+  # Mage class 需要增加一個 attribute: mp
+  # 所以要設定一個屬於魔法師 initialize
+
+  MAX_MP = 10
+
+  def initialize(name, hp , ap, mp)
+    super(name, hp, ap)                               # 用繼承的語法 super 來設定屬於 Hero 的 attributes，super 會呼叫 Hero 的同名方法 initialize
+
+    # 新增一個 attribute: mp (魔法力)
+    if MAX_MP < mp
+      @mp = MAX_MP
+    else
+      @mp = mp
+    end
+  end
+
+  # Mage class 也需要增加一個 method: fireball
+  # 同時也要修改他的 attack method
+
+  def attack(enemy)
+    # 這個遊戲我們設計 Mage 每次用 fireball 都需要 3 點 mp， mp 不足的話無法使用
+    if @mp >= 3
+      damage = fireball
+      enemy.hp = enemy.hp - damage
+
+      puts "#{@name} 噴射火球!"
+      puts "#{enemy.name} 受到 #{damage} 點的傷害"
+      puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+      puts ""
+
+      enemy.die?
+    else
+      # 如果 mp 不夠 3 點，就只能用普通的攻擊，super 會呼叫 Hero 的同名方法 attack
+      super(enemy)
+    end
+  end
+
+  def fireball
+    @mp = @mp - 3                                # 每次使用 fireball 要扣 3 點 MP
+    return rand(@ap/2..@ap) + 50                 # fireball 造成的傷害是正常攻擊 +50
+  end
+end
+
+class HolyKnight < Hero
+
+  # 新的職業：神聖武士 HolyKnight
+  # HolyKnight 是繼承 Hero 的 class
+  # 他已經具備 Hero 本身的 attributes 與 methods
+  # 在這裡我們把他的 attack method 修改，讓威力更大！
+
+  def attack(enemy)
+
+    # 新的職業：神聖武士 Holy Knight
+    # 攻擊能力：聖光，傷害會隨機取攻擊力（AP）至兩倍 AP 中的數字
+
+    damage = rand(@ap..@ap*2)
+    enemy.hp = enemy.hp - damage
+
+    puts "#{@name} 發出聖光!"
+    puts "#{enemy.name} 受到 #{damage} 點的傷害"
+    puts "#{enemy.name} 剩下 #{enemy.hp} 點 HP"
+    puts ""
+
+    enemy.die?
+  end
+end
+
+# 建立一個有不同職業 （包括英雄、神聖武士與魔法師）的團隊
+hero = Hero.new("Robinhood", 100, 20)
+hero.die
