🏆
Dự Án Tổng Kết
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!
Bản đồ OOP — Dùng gì ở đâu trong dự án
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
Phần 1 — Nền tảng: Abstract Class & Base
⚔️ 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
Phần 2 — Class con & Kỹ năng (Inheritance + Polymorphism)
⚔️ 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
Phần 3 — Party & Hệ thống chiến đấu
⚔️ 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...")
Phần 4 — Chạy Game & Kết quả
⚔️ 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!
Ôn tập — Toàn bộ OOP Series 10 Chapters
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.__hpChapter 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 OOPBước tiếp theo — Học gì sau OOP?
📖 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! 🎉
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?
4 tính chất cốt lõi của OOP là gì?
→ Encapsulation, Inheritance, Polymorphism, Abstraction
→ Encapsulation, Inheritance, Polymorphism, Abstraction
Khi nào dùng Inheritance vs Composition?
→ Is-a → Inheritance | Has-a → Composition
→ Is-a → Inheritance | Has-a → Composition
@abstractmethod ép buộc điều gì?
→ Class con phải implement method đó
→ Class con phải implement method đó
Polymorphism và Duck Typing khác nhau không?
→ Duck Typing = Poly không cần kế thừa chung
→ Duck Typing = Poly không cần kế thừa chung
min(list_objects) hoạt động nhờ magic method nào?
→ __lt__ (less than)
→ __lt__ (less than)
Builder Pattern trả về gì sau mỗi method?
→ self — để method chaining
→ self — để method chaining