Skip to content

trieuwu/BattleShip_3.0

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

BattleShip_3.0

ProPTIT JavaCore MidContest: BattleShip. Phiên bản thứ 3. Làm lại để ôn lại trước khi sang Part 2 khóa ProPTIT JavaCore

file README được tạo bằng Gemini3Pro :)))

Dự án game Battleship (Bắn tàu) chạy trên màn hình Console, được xây dựng bằng ngôn ngữ Java thuần (Java Core). Dự án tập trung vào việc áp dụng các nguyên lý OOP: Đóng gói (Encapsulation), Kế thừa (Inheritance) và Đa hình (Polymorphism) thông qua Strategy Pattern.

Cấu trúc thư mục (Package Structure)

Tất cả các file mã nguồn (.java) đều nằm trong một package duy nhất là: package BasicModel;

Tại sao các file lại sắp xếp theo Alphabet?

Trong các IDE (như IntelliJ, Eclipse), khi các file nằm cùng một cấp thư mục (cùng package), chúng sẽ tự động được sắp xếp theo thứ tự bảng chữ cái (A-Z) để dễ tìm kiếm. Tuy nhiên, về mặt Logic, các file này không ngang hàng nhau mà được phân chia thành 5 tầng (Layer) chức năng riêng biệt như phân tích dưới đây.

PHÂN TÍCH CHI TIẾT CÁC MODULE

  1. Nhóm Model Cơ Bản (Basic Models)

Nhiệm vụ: Đây là những "viên gạch" nhỏ nhất, chứa dữ liệu nguyên thủy và được đóng gói (Encapsulation) cẩn thận. Chúng không chứa logic game phức tạp.

GeometrySystem.java:

Đại diện cho một điểm tọa độ (x, y) trên bàn cờ.

Sử dụng Getter/Setter để truy xuất dữ liệu, đảm bảo tính đóng gói.

Boat.java:

Đại diện cho thực thể "Con Tàu".

Lưu trữ: Tên, kích thước (size) và số lần bị bắn trúng (hitCount).

Logic nội tại: Tự kiểm tra xem mình đã chìm chưa thông qua hàm checkSunk().

ItemInventory.java:

Quản lý kho vũ khí của người chơi.

Lưu trữ số lượng "Bom hàng" và "Bom vuông".

Chứa logic trừ số lượng bom khi sử dụng (useRowBomb...).

Message.java:

Một Utility Class chứa các phương thức static.

Mục đích: Tập trung toàn bộ các câu thông báo (String) vào một chỗ. Giúp code logic sạch hơn và dễ dàng sửa đổi nội dung hiển thị mà không cần can thiệp vào logic game.

ShotResult.java:

Là một gói tin (Data Transfer Object) trả về sau mỗi lần bắn.

Sử dụng Enum (MISS, HIT, SUNK) để định danh kết quả rõ ràng thay vì dùng số 0, 1, 2.

Lưu danh sách các ô bị ảnh hưởng (quan trọng khi nổ bom diện rộng).

  1. Nhóm Dữ liệu & Logic Cốt lõi (Core Logic)

Nhiệm vụ: Kết nối các Model cơ bản để tạo thành logic vận hành của một thực thể trong game.

ShipCoordinate.java (Quan hệ Composition - "Có một"):

Là sự kết hợp giữa 1 con Tàu (Boat) và Danh sách các tọa độ (List).

Giải quyết bài toán: "Con tàu này nằm ở những ô nào trên bàn cờ?".

Player.java (Class Cha - Base Class):

Là trái tim của logic dữ liệu. Một Player sở hữu: Bàn cờ (map), Danh sách tàu, Kho đồ.

Hàm quan trọng processShot(x, y): Chứa toàn bộ logic nhận sát thương. Khi bị bắn, Player tự kiểm tra xem ô đó có tàu không, cập nhật trạng thái tàu và trả về ShotResult.

  1. Nhóm Trí tuệ nhân tạo (AI Strategy Pattern)

Nhiệm vụ: Đây là phần thể hiện tính Đa hình (Polymorphism) rõ nhất. Chúng ta tách biệt "Hành vi bắn" ra khỏi "Đối tượng Bot".

BotStrategy.java (Interface - Bản hợp đồng):

Phân tích sâu: Đây không phải là một class, mà là một giao diện. Nó chỉ quy định một hàm duy nhất: getNextMove(Player target).

Tác dụng: Bất kỳ class nào "ký hợp đồng" (implements) với interface này đều phải đưa ra được một tọa độ bắn. Điều này cho phép AIBot thay đổi não bộ linh hoạt mà không cần sửa code của Bot.

EasyStrategy.java:

Hiện thực hóa BotStrategy.

Logic: "Ngây thơ" - Sử dụng Random để chọn bừa một ô chưa bắn.

HardStrategy.java:

Hiện thực hóa BotStrategy.

Logic: "Gian lận" - Class này truy cập trực tiếp vào danh sách tàu của đối thủ, tìm ra ô có tàu (value == 1) để bắn trúng 100%.

NormalStrategy.java:

Hiện thực hóa BotStrategy.

Logic: "Thông minh" - Sử dụng thuật toán săn đuổi (Hunt & Target).

Mặc định bắn Random.

Nếu trúng -> Lưu tọa độ đó lại và sinh ra các tọa độ lân cận (trên, dưới, trái, phải).

Lượt sau ưu tiên bắn các tọa độ lân cận đó.

AIBot.java:

Kế thừa từ Player.

Điểm đặc biệt: Có chứa một thuộc tính private BotStrategy strategy.

Khi khởi tạo, tùy vào độ khó được chọn, nó sẽ gắn strategy bằng Easy, Normal hoặc Hard. Đây chính là ứng dụng của Strategy Pattern.

  1. Nhóm Tiện ích Game (Game Utilities)

Nhiệm vụ: Các công cụ hỗ trợ để game vận hành trơn tru, tách biệt logic hiển thị và logic setup ra khỏi Player.

GameSetup.java:

Chứa thuật toán xếp tàu ngẫu nhiên (Random Placement).

Logic: Thử đặt tàu -> Kiểm tra va chạm/tràn map -> Nếu sai thì thử lại chỗ khác (Backtracking đơn giản).

MapDisplay.java (View Layer):

Chịu trách nhiệm duy nhất là System.out.println.

Có chế độ "Fog of War" (Sương mù): Nếu in map của Bot, nó sẽ ẩn các con tàu (1) đi và hiển thị như nước biển (0).

BattleMechanics.java:

Trọng tài của trận đấu.

Quản lý lượt đi (turnCount), xác định xem lượt này là của ai.

Logic phần thưởng: Đếm số lần bắn trúng liên tiếp (consecutiveHits) để mở khóa Bom.

Menu.java:

Hiển thị text hướng dẫn người dùng chọn chế độ chơi.

  1. Nhóm Điều khiển (Controller)

Nhiệm vụ: Nơi lắp ráp tất cả các linh kiện trên thành một cỗ máy hoàn chỉnh.

GameController.java:

Khởi tạo game (Human vs Bot).

Chứa Vòng lặp game (Game Loop): while(gameRunning).

Điều phối luồng: In map -> Người chơi nhập lệnh -> Xử lý -> Bot bắn trả -> Kiểm tra thắng thua.

Main.java:

Cửa ngõ của chương trình (Entry Point).

Chạy hàm main để kích hoạt GameController.

Cách chạy Game

Đảm bảo đã cài đặt Java Development Kit (JDK) - Khuyên dùng bản 8 hoặc 17 trở lên.

Mở Project bằng IntelliJ IDEA (hoặc IDE bất kỳ).

Tìm file src/battleship/Main.java.

Nhấn nút Run (Biểu tượng tam giác xanh lá).

About

ProPTIT JavaCore MidContest: BattleShip. Phiên bản thứ 3. Làm lại để ôn lại trước khi sang Part 2 khóa ProPTIT JavaCore

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages