menu_book LESSON MODE

OOP Ch.10 — Dự Án Tổng Kết RPG

calendar_today Đăng 29 May 2026
OOP Ch.10 — Dự Án Tổng Kết RPG
school

NOW LEARNING

OOP Ch.10 — Dự Án Tổng Kết RPG

🏆
Chapter 10 · Chương Cuối · OOP Series

Dự Án Tổng Kết
⚔️ RPG Mini Game

Kết hợp toàn bộ 9 chapters — Class, Encapsulation, Inheritance, Polymorphism, Magic Methods, Abstract, Composition — vào một trò chơi RPG hoàn chỉnh!

🗺️

Toàn bộ 9 chapter OOP trong 1 dự án

🏛️
Ch.1-2 — Class & Methods
NhanVat, KyNang, VuKhi — mọi entity đều là Class
🔒
Ch.3 — Encapsulation
__hp, @property, setter validate HP ≥ 0
🧬
Ch.4 — Inheritance
ChienBinh, PhapSu, CungThu kế thừa NhanVat
🎭
Ch.5 — Polymorphism
tan_cong() khác nhau với mỗi nhân vật
Ch.6 — Magic Methods
__str__, __len__(party), __lt__(so sánh HP)
🔵
Ch.7 — Class/Static
@classmethod tạo nhân vật preset, @staticmethod tính sát thương
📐
Ch.8 — Abstract
KyNangABC ép buộc mọi kỹ năng có su_dung()
🧩
Ch.9 — Composition
NhanVat has-a TrangBi, has-a GioKyNang
⚔️ RPG — Bước 1/4

KyNangABC + NhanVat base class

from abc import ABC, abstractmethod
import random

# ════════════════════════════════════════
# ABSTRACT — Ch.8
# ════════════════════════════════════════
class KyNangABC(ABC):
    def __init__(self, ten, mana_cost):
        self.ten       = ten
        self.mana_cost = mana_cost

    @abstractmethod
    def su_dung(self, nguoi_dung, muc_tieu): pass

    def __str__(self):
        return f"✦ {self.ten} ({self.mana_cost} mana)"

# ════════════════════════════════════════
# BASE CLASS — Ch.1,2,3
# ════════════════════════════════════════
class NhanVat:
    _so_nhan_vat = 0         ← class attribute — Ch.7

    def __init__(self, ten, hp, mana, suc_manh):
        self.ten       = ten
        self.__hp      = hp        ← private — Ch.3
        self.hp_max    = hp
        self.mana      = mana
        self.suc_manh  = suc_manh
        self.ky_nang   = []       ← composition — Ch.9
        self.kinh_nghiem = 0
        NhanVat._so_nhan_vat += 1

      # ── @property — Ch.3 ────────────────
    @property
    def hp(self): return self.__hp

    @hp.setter
    def hp(self, val):
        self.__hp = max(0, min(val, self.hp_max))

    @property
    def con_song(self): return self.__hp > 0

      # ── Magic Methods — Ch.6 ────────────
    def __str__(self):
        thanh_hp = "█" * int(self.hp/self.hp_max * 10) + "░" * (10 - int(self.hp/self.hp_max * 10))
        return f"[{self.ten:10}] HP:{self.hp:3}/{self.hp_max} [{thanh_hp}] Mana:{self.mana:3}"

    def __lt__(self, other): return self.hp < other.hp

      # ── Methods — Ch.2 ──────────────────
    def them_ky_nang(self, kn):
        self.ky_nang.append(kn); return self

    def tan_cong(self, muc_tieu):     ← override ở class con — Ch.5
        sat = NhanVat.tinh_sat_thuong(self.suc_manh)
        muc_tieu.hp -= sat
        self.kinh_nghiem += 10
        print(f"  ⚔️  {self.ten} đánh {muc_tieu.ten}: -{sat} HP")

    def dung_ky_nang(self, idx, muc_tieu):
        if idx < len(self.ky_nang):
            self.ky_nang[idx].su_dung(self, muc_tieu)

      # ── @staticmethod — Ch.7 ────────────
    @staticmethod
    def tinh_sat_thuong(co_ban):
        return co_ban + random.randint(-3, 5)

      # ── @classmethod — Ch.7 ─────────────
    @classmethod
    def tong_so(cls):
        return cls._so_nhan_vat
⚔️ RPG — Bước 2/4

3 nhân vật + Kỹ năng đặc biệt

# ════════════════════════════════════════
# CÁC KỸ NĂNG — Abstract implementation
# ════════════════════════════════════════
class ChemLocXoay(KyNangABC):
    def su_dung(self, nd, mt):
        if nd.mana < self.mana_cost: print("  💧 Không đủ mana!"); return
        nd.mana -= self.mana_cost
        sat = nd.suc_manh * 2
        mt.hp -= sat
        print(f"  🌀 {nd.ten} Chém Lốc Xoáy → {mt.ten} -{sat} HP!")

class PhepChuaLanh(KyNangABC):
    def su_dung(self, nd, mt):
        if nd.mana < self.mana_cost: print("  💧 Không đủ mana!"); return
        nd.mana -= self.mana_cost
        hoi = 40
        mt.hp += hoi
        print(f"  💚 {nd.ten} Chữa Lành → {mt.ten} +{hoi} HP!")

class MuiTenBang(KyNangABC):
    def su_dung(self, nd, mt):
        if nd.mana < self.mana_cost: print("  💧 Không đủ mana!"); return
        nd.mana -= self.mana_cost
        sat = nd.suc_manh + 15
        mt.hp -= sat
        print(f"  🏹 {nd.ten} Mũi Tên Băng → {mt.ten} -{sat} HP!")

# ════════════════════════════════════════
# CLASS CON — Inheritance + Polymorphism
# ════════════════════════════════════════
class ChienBinh(NhanVat):
    def __init__(self, ten):
        super().__init__(ten, hp=180, mana=60, suc_manh=28)
        self.giap = 8
        self.them_ky_nang(ChemLocXoay("Chém Lốc Xoáy", 20))

    def tan_cong(self, mt):          ← Polymorphism — override
        sat = NhanVat.tinh_sat_thuong(self.suc_manh)
        mt.hp -= sat
        self.kinh_nghiem += 10
        print(f"  🗡️  {self.ten} chém mạnh {mt.ten}: -{sat} HP")

class PhapSu(NhanVat):
    def __init__(self, ten):
        super().__init__(ten, hp=100, mana=160, suc_manh=20)
        self.them_ky_nang(PhepChuaLanh("Chữa Lành", 30))
        self.them_ky_nang(MuiTenBang("Mũi Tên Băng", 25))

    def tan_cong(self, mt):
        sat = NhanVat.tinh_sat_thuong(self.suc_manh) + 8
        mt.hp -= sat
        self.kinh_nghiem += 10
        print(f"  🔮 {self.ten} phóng phép {mt.ten}: -{sat} HP")

class QuaiVat(NhanVat):
    @classmethod
    def tao_boss(cls, ten):          ← classmethod factory
        q = cls(ten, hp=300, mana=0, suc_manh=35)
        return q
⚔️ RPG — Bước 3/4

Party + BattleEngine

# ── PARTY — Composition Ch.9 ─────────────
class Party:
    def __init__(self, ten):
        self.ten     = ten
        self.thanh_vien = []

    def __len__(self):                ← Magic — Ch.6
        return len([v for v in self.thanh_vien if v.con_song])

    def __str__(self):
        lines = [f"  {v}" for v in self.thanh_vien]
        return f"⚔️  [{self.ten}]\n" + "\n".join(lines)

    def them(self, nv):
        self.thanh_vien.append(nv)

    def thanh_vien_song(self):
        return [v for v in self.thanh_vien if v.con_song]

# ── BATTLE ENGINE ────────────────────────
class BattleEngine:
    @staticmethod
    def in_tieu_de(text):
        print(f"\n{'═'*40}")
        print(f"  {text}")
        print(f"{'─'*40}")

    @staticmethod
    def chien_dau(party, ke_thu_list):
        vong = 1
        while len(party) > 0 and any(k.con_song for k in ke_thu_list):
            BattleEngine.in_tieu_de(f"VÒNG {vong}")

              # Party tấn công — Polymorphism!
            for nv in party.thanh_vien_song():
                ke_thu_song = [k for k in ke_thu_list if k.con_song]
                if not ke_thu_song: break
                muc_tieu = min(ke_thu_song)    ← __lt__ — Ch.6
                if isinstance(nv, PhapSu) and nv.mana >= 25:
                    nv.dung_ky_nang(1, muc_tieu)
                else:
                    nv.tan_cong(muc_tieu)    ← Polymorphism!

              # Kẻ thù phản công
            for ke_thu in [k for k in ke_thu_list if k.con_song]:
                tv = party.thanh_vien_song()
                if tv:
                    nan_nhan = min(tv)     ← nhắm người HP thấp nhất
                    ke_thu.tan_cong(nan_nhan)

              # In trạng thái
            print(f"\n{party}")
            vong += 1

        if len(party) > 0:
            print(f"\n🎉 CHIẾN THẮNG! Party {party.ten} đã thắng!")
        else:
            print("\n💀 THẤT BẠI! Party đã toàn diệt...")
⚔️ RPG — Bước 4/4

Khởi động trận chiến!

# ════════════════════════════════════════
# KHỞI ĐỘNG GAME
# ════════════════════════════════════════
print("⚔️  ═══════════════════════════════ ⚔️")
print("        PYTHON RPG — TRẬN CHIẾN       ")
print("⚔️  ═══════════════════════════════ ⚔️\n")

# Tạo Party anh hùng — Builder-style chaining
arthur = ChienBinh("Arthur")
merlin = PhapSu("Merlin")

party = Party("Anh Hùng")
party.them(arthur)
party.them(merlin)

# Tạo kẻ địch qua classmethod factory
rong   = QuaiVat.tao_boss("Rồng Đen")
goblin = QuaiVat("Goblin", hp=80, mana=0, suc_manh=18)

print("👥 PARTY ANH HÙNG:")
print(party)
print(f"\n👿 KẺ THÙ: {rong}")
print(f"          {goblin}")
print(f"\n📊 Tổng nhân vật đã tạo: {NhanVat.tong_so()}")

# BẮT ĐẦU TRẬN!
BattleEngine.chien_dau(party, [goblin, rong])
⚔️ ═══════════════════════════════ ⚔️
PYTHON RPG — TRẬN CHIẾN
⚔️ ═══════════════════════════════ ⚔️
 
👥 PARTY ANH HÙNG:
⚔️ [Anh Hùng]
[Arthur ] HP:180/180 [██████████] Mana: 60
[Merlin ] HP:100/100 [██████████] Mana:160
 
👿 KẺ THÙ: [Rồng Đen ] HP:300/300 [██████████] Mana: 0
[Goblin ] HP: 80/ 80 [██████████] Mana: 0
📊 Tổng nhân vật đã tạo: 4
 
════════════════════════════════════════
VÒNG 1
────────────────────────────────────────
🗡️ Arthur chém mạnh Goblin: -31 HP
🏹 Merlin Mũi Tên Băng → Goblin -35 HP!
⚔️ Rồng Đen đánh Arthur: -38 HP
⚔️ Goblin đánh Arthur: -21 HP
 
════════════════════════════════════════
VÒNG 2
────────────────────────────────────────
🗡️ Arthur chém mạnh Goblin: -29 HP
💚 Merlin Chữa Lành → Arthur +40 HP!
... (tiếp tục chiến đấu)
 
🎉 CHIẾN THẮNG! Party Anh Hùng đã thắng!
📚

Tổng kết — Những gì bạn đã học!

Chapter 1
🏛️ Class & Object
class, __init__, self, PascalCase, tạo object
NhanVat()
Chapter 2
⚡ Methods
Instance method, self, method gọi method khác
tan_cong(self, mt)
Chapter 3
🔒 Encapsulation
__private, @property, getter/setter, validation
self.__hp
Chapter 4
🧬 Inheritance
class Con(Cha), super(), override, isinstance()
ChienBinh(NhanVat)
Chapter 5
🎭 Polymorphism
Cùng method, nhiều hành vi. Duck typing.
nv.tan_cong(mt)
Chapter 6
✨ Magic Methods
__str__, __len__, __add__, __lt__, __eq__
min(ke_thu_list)
Chapter 7
🔵 Class/Static
@classmethod (cls, factory), @staticmethod (utility)
QuaiVat.tao_boss()
Chapter 8
📐 Abstract
ABC, @abstractmethod, ép buộc implement
KyNangABC(ABC)
Chapter 9
🧩 Composition
Has-a, Strategy, Builder, method chaining
self.ky_nang = []
Chapter 10 🏆
⚔️ RPG Project
Kết hợp tất cả 9 chapter vào một project hoàn chỉnh!
Full OOP
🚀

Bước tiếp theo — Học gì sau OOP?

🌐
Web với Django/Flask
OOP là nền tảng của mọi web framework Python. Models, Views, Controllers — tất cả đều là class!
🎮
Game với Pygame
Mọi sprite, enemy, player trong Pygame đều là class. RPG này là bước đầu hoàn hảo!
🤖
Design Patterns
Singleton, Observer, Decorator, Factory — 23 design patterns kinh điển sử dụng OOP nâng cao.
📖 Học thêm:   realpython.com (OOP chuyên sâu)  |  refactoring.guru (Design Patterns)  |  pygame.org (Game dev)  |  djangoproject.com (Web)
🌟 🏆 🌟
🎓 Chứng nhận hoàn thành
OOP Python Series
Chúc mừng! Bạn đã hoàn thành toàn bộ 10 chapters về Lập trình Hướng đối tượng với Python.
Từ Class đơn giản đến RPG Game hoàn chỉnh — bạn đã đi một hành trình dài! 🎉
🏛️ Class & Object
🔒 Encapsulation
🧬 Inheritance
🎭 Polymorphism
✨ Magic Methods
📐 Abstract
🧩 Composition
⚔️ RPG Master

🏆 Quiz Tổng Kết!

Ôn lại toàn bộ OOP Series — bạn nhớ được bao nhiêu?

1️⃣4 tính chất cốt lõi của OOP là gì?
→ Encapsulation, Inheritance, Polymorphism, Abstraction
2️⃣Khi nào dùng Inheritance vs Composition?
→ Is-a → Inheritance | Has-a → Composition
3️⃣@abstractmethod ép buộc điều gì?
→ Class con phải implement method đó
4️⃣Polymorphism và Duck Typing khác nhau không?
→ Duck Typing = Poly không cần kế thừa chung
5️⃣min(list_objects) hoạt động nhờ magic method nào?
→ __lt__ (less than)
6️⃣Builder Pattern trả về gì sau mỗi method?
→ self — để method chaining
OOP Series: ✅ HOÀN THÀNH! 10/10
🏆