Tên đề tài: OOP Đại Chiến – Ai Là Người Giỏi Nhất? Tên tiếng Anh: OOP Arena – The Battle of Object-Oriented Programming Nền tảng: Desktop Application Ngôn ngữ: Java GUI: JavaFX CSDL: SQLite Mô hình: Object-Oriented Design + MVC/MVVM-inspired architecture AI: Adaptive Gameplay AI dựa trên phân tích hành vi và dự đoán pattern Đối tượng: Sinh viên học Lập trình hướng đối tượng
Lập trình hướng đối tượng (Object-Oriented Programming – OOP) là một trong những nền tảng quan trọng trong quá trình đào tạo sinh viên ngành Công nghệ thông tin và Khoa học máy tính.
Các khái niệm như:
có tính trừu tượng tương đối cao đối với sinh viên mới bắt đầu học.
Phương pháp học truyền thống chủ yếu dựa trên:
Cách tiếp cận này giúp sinh viên hiểu cú pháp và nguyên lý, nhưng chưa thực sự tạo ra môi trường để sinh viên trực tiếp trải nghiệm mối quan hệ giữa các khái niệm OOP.
Ví dụ, khi học về polymorphism, sinh viên có thể hiểu:
Animal animal = new Dog();
animal.makeSound();
nhưng việc hiểu tại sao polymorphism hữu ích và nó tạo ra lợi ích gì trong một hệ thống thực tế thường khó hơn.
Từ vấn đề đó, đề tài OOP Đại Chiến – OOP Arena được xây dựng với ý tưởng biến các khái niệm OOP thành những nhân vật có khả năng chiến đấu.
Ví dụ:
| Khái niệm OOP | Nhân vật |
|---|---|
| Encapsulation | Shield Knight |
| Inheritance | Mutant Warrior |
| Polymorphism | Shapeshifter |
| Abstraction | Abstract Mage |
| Interface | Connector |
| Generic | Template Wizard |
| Exception | Error Handler |
Ngược lại, các lỗi lập trình trở thành kẻ địch:
| Bug | Boss |
|---|---|
| NullPointerException | Null Beast |
| StackOverflowError | Stack Demon |
| Infinite Loop | Loop Hydra |
| ClassCastException | Cast Monster |
| RuntimeException | Runtime Boss |
Qua đó, kiến thức OOP được chuyển từ dạng khái niệm trừu tượng thành một hệ thống tương tác trực quan.
Xây dựng một ứng dụng game giáo dục bằng Java giúp sinh viên:
Đồng thời, hệ thống áp dụng AI thích nghi để tạo ra trải nghiệm chơi khác nhau dựa trên hành vi của người chơi.
Hệ thống hướng tới các mục tiêu:
Hệ thống được xây dựng theo hướng:
OOP KNOWLEDGE
│
↓
┌─────────────────┐
│ OOP CHARACTERS│
└────────┬────────┘
│
↓
┌─────────────────┐
│ BATTLE ENGINE │
└────────┬────────┘
│
┌─────────┴─────────┐
↓ ↓
PLAYER ACTION BUG AI
│ │
└─────────┬─────────┘
↓
ADAPTIVE AI
│
↓
BATTLE RESULT
│
↓
DATABASE
AI không sinh câu trả lời bằng ngôn ngữ tự nhiên.
Thay vào đó:
Player Actions
↓
Behavior Tracking
↓
Pattern Analysis
↓
Prediction
↓
AI Decision
↓
Enemy Action
Ví dụ người chơi liên tục sử dụng:
Attack → Attack → Defense → Attack → Attack
AI phát hiện người chơi có xu hướng ưu tiên Attack.
Ở lượt tiếp theo, Boss có thể chuyển sang chiến thuật:
Counter / Defense / Punish
Nếu người chơi thay đổi:
Defense → Skill → Defense → Skill
AI tiếp tục cập nhật mô hình.
Đây là điểm quan trọng.
Thay vì:
Easy
Normal
Hard
hệ thống hướng tới:
Easy ────────→ Adaptive ────────→ Hard
↑
│
Player behavior
Boss tự điều chỉnh.
Đồ án gồm 6 chương chính:
Ngoài ra gồm:
Sinh viên học OOP thường gặp ba vấn đề chính.
Các khái niệm:
Class
Object
Abstraction
Inheritance
Polymorphism
Interface
khó hình dung khi chỉ học qua slide/code.
Sinh viên có thể viết:
class Animal {}
class Dog extends Animal {}
nhưng chưa chắc hiểu rõ tại sao inheritance và polymorphism được sử dụng.
Các bài tập OOP thường có cấu trúc:
Đề bài
↓
Code
↓
Compile
↓
Output
Trong khi game có:
Action
↓
Consequence
↓
Feedback
↓
Strategy
↓
Reward
OOP Arena tận dụng cơ chế thứ hai để biến kiến thức thành trải nghiệm.
Các chức năng chính:
Có thể biểu diễn đầy đủ hơn bằng Use Case UML:
┌──────────────────────┐
│ OOP ARENA │
│ │
Player ──────────┤ Manage Profile │
│ │
Player ──────────┤ Learn OOP │
│ │
Player ──────────┤ Select Character │
│ │
Player ──────────┤ Start Battle │
│ │ │
│ ↓ │
│ Adaptive AI │
│ │
Player ──────────┤ Use Skill │
│ │
Player ──────────┤ Answer Quiz │
│ │
Player ──────────┤ View Statistics │
└──────────────────────┘
Use Case lớn:
UC-B01: Battle
được phân rã thành:
Start Battle
│
├── Select Character
│
├── Initialize Battle
│
├── Player Turn
│ ├── Normal Attack
│ ├── Use Skill
│ ├── Defense
│ └── Special Action
│
├── AI Turn
│ ├── Analyze Behavior
│ ├── Predict Action
│ └── Select Counter
│
├── Calculate Damage
│
├── Check Status
│
└── End Battle
Mở ứng dụng
↓
Main Menu
↓
Chọn Battle
↓
Chọn Character
↓
Chọn Enemy
↓
Khởi tạo Battle
↓
Player Turn
↓
Player Action
↓
Record Behavior
↓
AI Analysis
↓
AI Action
↓
Calculate Result
↓
Check HP
↙ ↘
HP > 0 HP = 0
↓ ↓
Next Turn End Battle
↓
Save Statistics
UC-B01 – Start Battle
Player.
Cho phép người chơi bắt đầu một trận đấu với Bug/Boss.
Battle.Nếu người chơi không đủ điều kiện mở khóa character:
Character Locked
↓
Display Requirement
↓
Return Character Selection
UC-AI01 – Adaptive Enemy Behavior
Adaptive AI.
Phân tích hành vi người chơi và lựa chọn chiến thuật phù hợp.
Player Action
Current HP
Enemy HP
Available Skills
Previous Actions
Turn Number
Battle State
Collect Data
↓
Build Behavior Profile
↓
Calculate Action Probability
↓
Predict Next Action
↓
Evaluate Counter Actions
↓
Select Best Action
↓
Execute
Một action:
ATTACK
DEFEND
SPECIAL
COUNTER
HEAL
Code phải:
Ứng dụng chạy được trên các hệ điều hành hỗ trợ Java.
Có thể thêm:
New Character
New Skill
New Boss
New Game Mode
New AI Strategy
mà không cần sửa toàn bộ hệ thống.
Hệ thống áp dụng bốn nguyên lý chính:
Thông tin HP không được thay đổi trực tiếp:
public class Character {
private int hp;
public int getHp() {
return hp;
}
public void takeDamage(int damage) {
if (damage < 0) {
throw new IllegalArgumentException();
}
hp = Math.max(0, hp - damage);
}
}
public abstract class Character {
public abstract void performAction();
}
Character
│
├── EncapsulationHero
├── InheritanceHero
├── PolymorphismHero
└── InterfaceHero
Character character;
character = new EncapsulationHero();
character.attack();
character = new PolymorphismHero();
character.attack();
Cùng một interface nhưng hành vi khác nhau.
Sử dụng:
Đặc biệt Class Diagram là thành phần quan trọng để chứng minh hệ thống được thiết kế theo OOP.
Java được lựa chọn vì:
JavaFX được sử dụng để xây dựng:
SQLite được sử dụng vì:
Hệ thống không sử dụng ChatGPT/LLM để sinh text.
AI nằm trực tiếp trong gameplay.
Mỗi action của người chơi được ghi nhận:
public enum ActionType {
ATTACK,
DEFEND,
SKILL,
HEAL
}
Ví dụ:
Turn 1 → ATTACK
Turn 2 → ATTACK
Turn 3 → SKILL
Turn 4 → ATTACK
Turn 5 → DEFEND
Hệ thống thống kê:
Attack: 60%
Skill: 20%
Defense: 15%
Heal: 5%
AI có thể phát hiện:
Player có xu hướng tấn công trực tiếp.
Sau đó ưu tiên counter.
Có thể sử dụng transition matrix:
Next Action
A D S H
A 0.60 0.10 0.20 0.10
D 0.20 0.50 0.20 0.10
S 0.40 0.10 0.40 0.10
H 0.30 0.20 0.10 0.40
Nếu hành động hiện tại là ATTACK, AI dự đoán:
ATTACK = 60%
SKILL = 20%
DEFEND = 10%
HEAL = 10%
AI sẽ lựa chọn counter tương ứng.
AI cũng theo dõi:
Player Win Rate
Damage Dealt
Damage Received
Average Turn
Skill Usage
Defense Rate
Nếu người chơi thắng quá dễ:
Difficulty ↑
Nếu người chơi thua liên tục:
Difficulty ↓
Điều này tạo ra trải nghiệm:
AI không chỉ đánh người chơi — AI học cách người chơi đánh.
Đề xuất sử dụng kiến trúc Layered + MVC/MVVM-inspired.
┌─────────────────────────────┐
│ Presentation │
│ JavaFX │
├─────────────────────────────┤
│ Application │
│ Controllers │
├─────────────────────────────┤
│ Domain │
│ Characters / Battle / AI │
├─────────────────────────────┤
│ Infrastructure │
│ SQLite / Repository │
└─────────────────────────────┘
Mục tiêu là tách:
UI ≠ Game Logic ≠ AI ≠ Database
JavaFX UI
│
↓
Controllers
│
┌───────────┼───────────┐
↓ ↓ ↓
BattleService QuizService PlayerService
│
↓
BattleEngine
│
┌─────┴─────┐
↓ ↓
Player Enemy
│ │
│ AdaptiveAI
│ │
└─────┬─────┘
↓
ResultService
↓
Repository
↓
SQLite
Đề xuất cấu trúc:
src/main/java/com/ooparena/
│
├── app/
│ └── OOPArenaApplication.java
│
├── controller/
│ ├── MainController.java
│ ├── BattleController.java
│ ├── CharacterController.java
│ ├── QuizController.java
│ └── StatisticsController.java
│
├── model/
│ ├── character/
│ ├── enemy/
│ ├── battle/
│ ├── skill/
│ ├── quiz/
│ └── player/
│
├── ai/
│ ├── AdaptiveAI.java
│ ├── BehaviorTracker.java
│ ├── PatternAnalyzer.java
│ ├── ActionPredictor.java
│ └── DifficultyManager.java
│
├── service/
│ ├── BattleService.java
│ ├── PlayerService.java
│ ├── QuizService.java
│ └── StatisticsService.java
│
├── repository/
│ ├── PlayerRepository.java
│ ├── BattleRepository.java
│ └── StatisticsRepository.java
│
├── database/
│ ├── DatabaseManager.java
│ └── SchemaInitializer.java
│
├── exception/
│ ├── InvalidActionException.java
│ ├── CharacterLockedException.java
│ └── BattleStateException.java
│
├── util/
│ ├── RandomUtils.java
│ └── ValidationUtils.java
│
└── view/
└── ...
╔════════════════════════════════════╗
║ OOP ĐẠI CHIẾN ║
║ ║
║ ⚔ PLAY BATTLE ║
║ ║
║ 📚 OOP ACADEMY ║
║ ║
║ 🧬 CLASS LAB ║
║ ║
║ 📊 STATISTICS ║
║ ║
║ ⚙ SETTINGS ║
╚════════════════════════════════════╝
┌─────────────────────────────────────────┐
│ SELECT YOUR OOP HERO │
├────────────┬────────────┬───────────────┤
│ 🛡️ │ 🧬 │ 🎭 │
│ Encapsulate │ Inheritance│ Polymorphism │
│ │ │ │
│ DEFENSE 95 │ ATK 90 │ SPEED 95 │
│ │ │ │
│ [SELECT] │ [SELECT] │ [SELECT] │
└────────────┴────────────┴───────────────┘
┌───────────────────────────────────────────┐
│ BOSS BATTLE │
│ │
│ PLAYER BOSS │
│ │
│ 🛡️ HERO 💀 NULL BEAST │
│ ██████████ ████████ │
│ HP 100/100 HP 150/150 │
│ │
│ TURN 05 │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │ ATTACK │ │ SKILL │ │ DEFEND │ │
│ └────────┘ └────────┘ └────────┘ │
│ │
│ AI ANALYSIS: ████████ │
└───────────────────────────────────────────┘
Có thể có một panel phụ:
┌───────────────────────────┐
│ AI BEHAVIOR ANALYSIS │
├───────────────────────────┤
│ Attack ███████ 65% │
│ Skill ███ 20% │
│ Defense ██ 10% │
│ Heal █ 5% │
│ │
│ Predicted: ATTACK │
│ Confidence: 65% │
└───────────────────────────┘
Lưu ý: Khi thi thật, panel này có thể được ẩn hoặc chỉ xuất hiện sau trận để tránh làm lộ chiến thuật AI.
Class diagram lõi:
SQLite database:
oop_arena.db
Player
------------------
id
username
level
experience
created_at
Character
------------------
id
name
type
hp
attack
defense
unlocked
Battle
------------------
id
player_id
character_id
enemy_id
result
turn_count
damage_dealt
damage_taken
started_at
ended_at
ActionHistory
------------------
id
battle_id
turn_number
actor
action_type
timestamp
Skill
------------------
id
name
type
damage
cooldown
description
Quan hệ:
Player
│
└────< Battle
│
├──── Character
│
├──── Enemy
│
└────< ActionHistory
Java
JavaFX
Maven
SQLite
Git + GitHub
IntelliJ IDEA / VS Code / Eclipse
JUnit
Có thể sử dụng:
Không yêu cầu API trả phí.
AI có thể được xây dựng hoàn toàn bằng Java:
BehaviorTracker
+
PatternAnalyzer
+
ActionPredictor
+
DifficultyManager
Điều này rất phù hợp với tiêu chí:
Không sử dụng công nghệ mất phí.
MVP dự kiến có:
Training Mode
Học từng concept.
Battle Mode
Đánh Bug.
Boss Mode
Đánh Boss có AI.
Quiz Battle
Trả lời câu hỏi OOP để gây damage.
Class Lab
Xem class/object/UML trực quan.
Character
↓
Choose Skill
↓
Battle Engine
↓
Damage Calculation
↓
Enemy Reaction
Ví dụ:
╔══════════════════════════════════╗
║ QUIZ ATTACK ║
╠══════════════════════════════════╣
║ Which concept hides internal ║
║ implementation details? ║
║ ║
║ A. Inheritance ║
║ B. Encapsulation ║
║ C. Polymorphism ║
║ D. Generic ║
╚══════════════════════════════════╝
Đúng:
+30 DAMAGE
Sai:
-10 HP
Như vậy kiến thức trực tiếp ảnh hưởng tới gameplay.
Người chơi chọn:
Polymorphism
Hệ thống hiển thị:
Character
▲
┌──────┼──────┐
│ │ │
Dog Cat Bird
│ │ │
bark() meow() sing()
Có thể click từng class để xem:
Attributes
Methods
Inheritance
Override
Interface
Ví dụ người chơi:
Turn 1 ATTACK
Turn 2 ATTACK
Turn 3 ATTACK
Turn 4 ATTACK
AI:
Attack probability = 82%
→ Boss switches to Counter Mode
Người chơi nhận ra:
"Boss đang bắt bài mình."
Đây chính là hook để tạo wow moment trong demo.
Test:
Ví dụ:
@Test
void characterCannotHaveNegativeHp() {
Character hero = new EncapsulationHero();
hero.takeDamage(9999);
assertEquals(0, hero.getHp());
}
Input:
ATTACK
ATTACK
ATTACK
ATTACK
ATTACK
Expected:
Predicted action = ATTACK
Input:
DEFEND
DEFEND
DEFEND
DEFEND
Expected:
Predicted action = DEFEND
Kiểm tra:
UI
↓
Controller
↓
BattleService
↓
BattleEngine
↓
AI
↓
Repository
↓
Database
MVP có thể đóng gói thành:
OOP-Arena/
├── oop-arena.jar
├── config/
├── database/
│ └── oop_arena.db
└── README.md
Người dùng cài Java Runtime phù hợp và chạy:
java -jar oop-arena.jar
Trong phiên bản hoàn thiện có thể đóng gói native application cho Windows.
Đây là chương rất quan trọng đối với hackathon.
Không nên chỉ nói:
"Ứng dụng có CRUD và JavaFX."
Phải nhấn mạnh các điểm khác biệt.
Thay vì:
OOP → textbook → code
hệ thống sử dụng:
OOP
↓
Character
↓
Skill
↓
Battle
↓
Consequence
Ví dụ:
Polymorphism không còn là một đoạn code trong slide mà trở thành một nhân vật có khả năng thay đổi hành vi trong trận đấu.
Một điểm nổi bật:
AI được dùng để điều khiển gameplay thay vì sinh nội dung văn bản.
AI quan sát:
Player behavior
và tạo:
Adaptive enemy behavior
Điều này khiến AI trở thành một phần thực sự của sản phẩm, thay vì một chatbot được gắn thêm để "có AI".
Hai người chơi khác nhau sẽ có thể gặp Boss khác nhau.
Aggressive
Attack-heavy
→ Boss thiên về Counter.
Defensive
Skill-heavy
→ Boss thay đổi chiến thuật.
Do đó:
Cùng một Boss nhưng gameplay không hoàn toàn giống nhau.
Kiến thức OOP được đưa vào:
Ví dụ:
+50 XP
Unlocked: POLYMORPHISM
Đây là điểm mình đặc biệt khuyến nghị nhấn mạnh khi thuyết trình.
Ứng dụng dạy OOP bằng một hệ thống được xây dựng bằng OOP.
Ví dụ:
Game Character
↓
Abstract Class
↓
Inheritance
↓
Override
↓
Polymorphism
Trong khi chính source code của game cũng sử dụng:
Abstract Class
Inheritance
Encapsulation
Polymorphism
Interface
Generic
Exception
Collection
Nói cách khác:
Sản phẩm vừa là công cụ học OOP, vừa là một case study về cách xây dựng phần mềm hướng đối tượng.
Đây là bảng rất đáng đưa vào slide/demo:
| Chương | Trong OOP Arena |
|---|---|
| Chương 1 | Tổng quan hệ thống |
| Chương 2 | Java + UML |
| Chương 3 | Encapsulation |
| Chương 4 | Constructor + Object |
| Chương 5 | Overloading + static |
| Chương 6 | Aggregation + Inheritance |
| Chương 7 | Abstract + Interface + Override |
| Chương 8 | Polymorphism |
| Chương 9 | Generic + Collection |
| Chương 10 | Exception |
| Chương 11 | JavaFX |
| Chương 12 | Class Diagram + OO Design |
| Chương 13 | SOLID + Design Pattern |
Như vậy sản phẩm không phải game Java đơn thuần.
Nó là một hệ thống tích hợp gần như toàn bộ nội dung môn học.
Ví dụ:
BattleEngine
không nên trực tiếp biết cách AI dự đoán.
Thay vào đó:
public interface EnemyStrategy {
Action chooseAction(BattleState state);
}
Có:
RandomStrategy
AggressiveStrategy
DefensiveStrategy
AdaptiveStrategy
Battle Engine chỉ biết:
EnemyStrategy strategy;
→ dễ mở rộng.
Đây là cách đưa Design Pattern + SOLID vào chương nâng cao.
Có thể áp dụng:
Cho AI:
EnemyStrategy
├── RandomStrategy
├── AggressiveStrategy
├── DefensiveStrategy
└── AdaptiveStrategy
Tạo character:
CharacterFactory.create("POLYMORPHISM");
Theo dõi:
HP changed
Battle state changed
Turn changed
Tách database khỏi business logic.
Đây sẽ là điểm cộng kỹ thuật lớn.
Đề tài OOP Đại Chiến – OOP Arena hướng tới giải quyết vấn đề học các khái niệm lập trình hướng đối tượng theo phương pháp trực quan và tương tác.
Hệ thống chuyển đổi các khái niệm:
Class
Object
Inheritance
Abstraction
Encapsulation
Polymorphism
Interface
Exception
Generic
thành các thành phần gameplay.
Bên cạnh đó, hệ thống sử dụng Adaptive AI để phân tích hành vi của người chơi và điều chỉnh chiến thuật của đối thủ.
Điểm khác biệt của đề tài nằm ở việc AI không được sử dụng như một chatbot thông thường mà được tích hợp trực tiếp vào cơ chế ra quyết định của game.
Đồng thời, chính phần mềm cũng được thiết kế theo các nguyên lý OOP mà nó giảng dạy.
Player vs Player
Global OOP Ranking
Có thể thay Markov-based prediction bằng:
Tạo Boss với:
Random abilities
Random weaknesses
Random patterns
Chapter 1
↓
Chapter 2
↓
...
Chapter 13
Mỗi chapter mở khóa một cơ chế.
Giáo viên có thể:
Có thể xây dựng danh mục tham khảo theo các nhóm:
Khi hoàn thiện báo cáo, các tài liệu cụ thể cần được ghi theo một chuẩn thống nhất như IEEE hoặc APA.
| Character | Concept | Vai trò |
|---|---|---|
| Shield Knight | Encapsulation | Tank |
| Mutant Warrior | Inheritance | Damage |
| Shapeshifter | Polymorphism | Adaptive |
| Abstract Mage | Abstraction | Special |
| Connector | Interface | Support |
| Template Wizard | Generic | Utility |
| Exception Handler | Exception | Counter |
| Boss | Concept |
|---|---|
| Null Beast | NullPointerException |
| Loop Hydra | Infinite Loop |
| Stack Demon | StackOverflow |
| Cast Monster | ClassCastException |
| Runtime Lord | RuntimeException |
Actor: Player
Create Profile
↓
Enter Username
↓
Validate
↓
Save
Open Character Menu
↓
View Characters
↓
View Stats
↓
Select Character
↓
Confirm
Select Concept
↓
View Character
↓
View OOP Principle
↓
View Example
Select Character
↓
Select Enemy
↓
Initialize Battle
↓
Start Turn
Player
↓
Attack
↓
BattleEngine
↓
Calculate Damage
↓
Enemy.takeDamage()
↓
Update UI
Player
↓
Select Skill
↓
Validate Cooldown
↓
Execute Skill
↓
Apply Effect
↓
Update Battle State
Show Question
↓
Player Answer
↓
Validate Answer
↓
Correct?
↙ ↘
Yes No
↓ ↓
Damage Penalty
Enemy Turn
↓
Read Battle State
↓
Read Action History
↓
Analyze Pattern
↓
Predict Player Action
↓
Evaluate Available Actions
↓
Select Strategy
↓
Execute Action
Battle End
↓
Calculate Result
↓
Calculate XP
↓
Update Player
↓
Save Battle
↓
Save Action History
↓
Update Statistics
comments (0)