You are on page 1of 33

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI

VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG


──────── * ───────

BÀI TẬP LỚN


MÔN: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

ĐỀ TÀI: Xây dựng game Battle Ship

Nhóm sinh viên thực hiện:

Tên sinh viên Mã sinh viên Lớp Khóa


Đinh Duy Anh 20200013 132623 65
Đỗ Vũ Tùng Lâm 20204574 132623 65
Nguyễn Đắc Hoàng Anh 20204510 132623 65
Cao Thành Huy 20204656 132623 65
Nguyễn Viết Toàn 20200545 132623 65

Giáo viên hướng dẫn: ThS. Nguyễn Mạnh Tuấn


IT3100 – Lập trình hướng đối tượng 20212
Hà Nội, tháng 6 năm 2022

MỤC LỤC
MỤC LỤC.................................................................................................................... 2

LỜI NÓI ĐẦU.............................................................................................................. 3

PHÂN CÔNG THÀNH VIÊN TRONG NHÓM.......................................................4

CHƯƠNG 1. KHẢO SÁT, ĐẶC TẢ YÊU CẦU BÀI TOÁN...............................5


1.1. Mô tả yêu cầu bài toán...................................................................................5
1.2. Biểu đồ use case..............................................................................................5
1.2.1. Biểu đồ use case tổng quan........................................................................5
1.2.2. Biểu đồ use case phân rã mức 2.................................................................6
1.3. Đặc tả use case................................................................................................7

CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ BÀI TOÁN...........................................11


2.1. Thiết kế Cơ sở dữ liệu hoặc Cấu trúc tệp dữ liệu.......................................11
2.2. Biểu đồ trình tự.............................................................................................11
2.3. Biểu đồ lớp....................................................................................................13
2.4. Thiết kế chi tiết lớp.......................................................................................18

CHƯƠNG 3. THUẬT TOÁN SỬ DỤNG.............................................................24


3.1. Công nghệ sử dụng.......................................................................................24
3.2. Các thuật toán đã sử dụng...........................................................................24

CHƯƠNG 4. XÂY DỰNG CHƯƠNG TRÌNH MINH HỌA..............................25


4.1. Kết quả chương trình minh họa..................................................................25
4.2. Giao diện chương trình................................................................................25
4.3. Kiểm thử các chức năng...............................................................................28
4.3.1. Kiểm thử cho chức năng 1.......................................................................28
4.3.2. Kiểm thử cho chức năng 2.......................................................................29
4.3.3. Kiểm thử cho chức năng 3.......................................................................29
4.3.4. Kiểm thử cho chức năng 4.......................................................................29
4.3.5. Kết luận...................................................................................................29
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN................................................................30

TÀI LIỆU THAM KHẢO.........................................................................................31

2
IT3100 – Lập trình hướng đối tượng 20212
PHỤ LỤC................................................................................................................... 32

LỜI NÓI ĐẦU

Trò chơi bắn tàu, hay còn gọi là BattleShip là một trò chơi thú vị, đồng thời có
cách chơi đơn giản, dễ hiểu nhưng để đạt được chiến thắng cũng không phải một việc
dễ dàng. Ngay khi tiếp xúc với đề tài này, chúng em đã nhận thấy đây là một đề tài
phù hợp để triển khai các kiến thức được học về lập trình hướng đối tượng, cũng như
tạo ra một game giải trí bổ ích dành cho các bạn sau những giờ học căng thẳng.
Game BattleShip là một tựa game không quá nặng về mặt đồ họa về đồ họa,
hiệu ứng mà chủ yếu tập trung vào nội dung, thuật toán, cách tổ chức Class trong Java.
Nhóm làm game đã cố gắng áp dụng những kiến thức về lập trình hướng đối tượng và
các cấu trúc dữ liệu, thuật toán để hoàn thành bài tập lớn này.
Với những yêu cầu của bài toán, chúng em đã cố gắng nỗ lực suy nghĩ hình
thành những đoạn chương trình tốt nhất để phục vụ nhu cầu thực tế này. Sau nhiều
tuần cùng học tập, trao đổi và làm việc, chúng em đã hoàn thành chương trình cũng
như bài báo cáo và hướng dẫn sử dụng chương trình này.
Nhóm chúng em xin chân thành cảm ơn thầy giáo Nguyễn Mạnh Tuấn, và các
thầy cô trong Trường Công nghệ thông tin và truyền thông, Đại học Bách Khoa Hà
Nội đã đưa ra đề tài thú vị, hấp dẫn và hữu ích này cũng như đã giúp chúng em hoàn
thành đề tài này.

3
IT3100 – Lập trình hướng đối tượng 20212

PHÂN CÔNG THÀNH VIÊN TRONG NHÓM

Họ và tên Email Công việc thực hiện Đánh giá


Đinh Duy anh.dd200013@sis.hust.edu.vn Khảo sát đặc tả yêu Hoàn
Anh cầu bài toán thành
Thiết kế tổng quan các
lớp quan trọng
Điều phối và lên lịch
công việc
Xây dựng chương trình
chi tiết
Thuyết trình và demo
sản phẩm
Đỗ Vũ lam.dvt204574@sis.hust.edu.vn Xây dựng chương trình Hoàn
Tùng Lâm chi tiết thành
Xây dựng thư mục
hình ảnh và âm thanh
Viết slide
Nguyễn Đắc anh.ndh204510@sis.hust.edu.vn Phân tích bài toán Hoàn
Hoàng Anh Vẽ các biểu đồ lớp thành
Viết báo cáo
Kiểm thử chương trình
Cao Thành huy.ct204656@sis.hust.edu.vn Kiểm thử chương trình
Hoàn
Huy Tham gia viết 1 số thành
chức năng
Nguyễn toan.nv200545@sis.hust.edu.vn Tìm kiếm tài liệu Hoàn
Viết Toàn Tìm kiếm công nghệ thành
và các thuật toán cần
thiết

4
IT3100 – Lập trình hướng đối tượng 20212

CHƯƠNG 1. KHẢO SÁT, ĐẶC TẢ YÊU CẦU BÀI TOÁN

1.1. Mô tả yêu cầu bài toán


Xây dựng trò chơi bắn tàu, cho phép người chơi chơi với máy, bao gồm các chức năng
chính:
+ Cho phép người chơi lựa chọn tàu chiến, sắp xếp đội hình (mỗi loại tàu chiến có kích
thước và điểm số khác nhau)
+ Đánh dấu tọa độ bắn trật , bắn trúng của mỗi lượt chơi
+ Lưu lại kết quả điểm số đạt được (điểm số và số lần dự đoán người chơi đã thực
hiện) và lịch sử trận chiến (các bước dự đoán của người chơi và kết quả bắn trúng /
bắn trượt)
+ Xây dựng thuật toán cho máy chơi ở hai mức độ dễ và khó
+ Cấu hình game: tắt bật âm thanh / âm nhạc / reset điểm số
+ Giới thiệu luật chơi

1.2. Biểu đồ use case


1.2.1. Biểu đồ use case tổng quan
- Tác nhân: Player
- Các usecase:
+ Start
+ Prepare
+ Fight
+ End Game

5
IT3100 – Lập trình hướng đối tượng 20212
1.2.2. Biểu đồ use case phân rã mức 2
Phân rã use case Start, ta được các use case:
+ Play
+ Set Sound
+ Set Mode
+ View Rule
+ View High Score
+ Exit

Phân rã use case Prepare, ta được các use case


+ Select Ship
+ Place Ship

6
IT3100 – Lập trình hướng đối tượng 20212
Phân tích use case Fight, ta được các use case:
+ Shoot
+ Information

1.3. Đặc tả use case


- Đặc tả use case Start
Mã UC (UC #) BS007 Tên usecase Start
Tác nhân Người chơi (Player)
Điều kiện trước Người chơi chạy chương trình
Luồng thực thi
chính
No. Thực hiện Hành động
1 Player Click vào nút easy/ hard
2 System Thay đổi chế độ chơi khó / dễ
3 Player Click vào nút GameRule
4 System Hiển thị hướng dẫn chơi
5 Player Click vào nút HighScore
6 System Hiển thị màn hình lịch sử
điểm cao
7 Player Click vào nút Sound on/ off
8 System Bật/ tắt âm thanh
9 Player Click vào nút Play
10 System Khởi tạo giao diện sắp xếp
tàu lên bản đồ
11 Player Click vào nút Exit
12 System Thoát khỏi chương trình
Điều kiện sau Người chơi ấn nút Play

7
IT3100 – Lập trình hướng đối tượng 20212
- Đặc tả use case Prepare

Mã UC (UC #) BS008 Tên usecase Prepare

Tác nhân Người chơi (Player)


Điều kiện trước Người chơi click vào nút Play ở giao diện MainMenu
Luồng thực thi
chính
No. Thực hiện Hành động
1 Player Kéo tàu từ container chứa tàu vào
trong Map
2 System Hiển thị vị trí tàu người chơi kéo
vào
3 Player Kéo tàu từ vị trí cũ đến vị trí mới
trong Map
4 System Hiển thị vị trí tàu người chơi vừa
kéo thả
5 Player Click vào nút auto
6 System Sắp xếp tàu ở container vào trong
Map một cách ngẫu nhiên
7 Player Click vào nút back
8 System Khởi tạo giao diện MainMenu
9 Player Click vào nút ready
10 System Khởi tạo giao diện PlayGame
Luồng thực thi
mở rộng
1a System Đổi hướng tàu nếu player ấn
chuột phải
1b System Trả tàu về vị trí cũ nếu player thả
tàu ở ngoài map
1c System Trả tàu về vị trí cũ nếu player thả
tàu vào tàu khác
2a System Đổi hướng tàu nếu player ấn
chuột phải
2b System Trả tàu về vị trí cũ nếu player thả
tàu ở ngoài map
2c System Trả tàu về vị trí cũ nếu player thả
tàu vào tàu khác
Điều kiện sau Tất cả các tàu đều được xếp lên Map
- Đặc tả use case Fight

Mã UC (UC #) BS009 Tên usecase Fight

Tác nhân Người chơi (Player)


Điều kiện trước Người chơi click vào nút ready trong giao diện xếp tàu và tất cả các
tàu đều đã được sắp xếp lên Map
Luồng thực thi

8
IT3100 – Lập trình hướng đối tượng 20212
chính
No. Thực hiện Hành động
1 Player Click vào nút back
2 System Đóng cửa sổ PlayGame và
hiện cửa sổ với giao diện
MainMenu
3 Player Click vào 1 ô bất kỳ trên bản
đồ.
4 System Kiểm tra ô đó đã được đánh
hay chưa.
5 System Kiểm tra ô được chọn có tàu
hay không
6 System Kiểm tra xem có tàu nào bị
hạ hoàn toàn chưa
7 System Kiểm tra người chơi hoặc
máy đã thắng chưa
8 System Chọn 1 ô ngẫu nhiên để bắn
tàu người chơi
9 Player Click nút “Play Again” khi
player hoặc máy đã thắng
10 System Lưu kết quả điểm số của
người chơi vào dữ liệu điểm
11 System Quay trở về Menu
12 Player Click nút Highscore khi
player hoặc máy đã thắng
13 System Hiển thị màn hình lịch sử
điểm cao
Luồng thực thi
mở rộng
4a System Không thực hiện gì nếu ô
được chọn đã được chọn
trước đó.
4b System Nếu ô đó chưa được chọn,
thực hiện luồng thực thi số 5
5a System Nếu ô không có tàu, thay đổi
ô đó thành biểu tượng ô màu
trắng (không có tàu). Thực
hiện luồng thực thi 8
5b System Nếu ô có tàu, thay đổi biểu
tượng ô thành hình ảnh ô
màu đỏ, thực hiện luồng thực
thi 6
6a System Nếu chưa, thực hiện luồng
thực thi 8
6b System Nếu rồi, thay hình ảnh các ô
tại vị trí con tàu đó thành
hình ảnh của con tàu, thực

9
IT3100 – Lập trình hướng đối tượng 20212
hiện luồng thực thi 7
7a System Nếu chưa, thực hiện luồng
thực thi 8
7b System Nếu rồi, hiển thị kết quả của
người chơi và chờ người chơi
lựa chọn trở về menu hoặc
xem lịch sử điểm cao
8a System Thực hiện luồng thực thi 4.
10a System Nếu điểm của người chơi cao
hơn 1 số điểm cao trong dữ
liệu thì cập nhật lại điểm cao
10b System Nếu điểm người chơi thấp
hơn các điểm cao thì không
cập nhật.
13a System Nếu người chơi ấn nút reset,
xóa lịch sử điểm cao
13b System Quay về giao diện của
MainMenu nếu người chơi ấn
nút back
Điều kiện sau Người chơi xem điểm cao hoặc quay về gia diện MainMenu

10
IT3100 – Lập trình hướng đối tượng 20212

CHƯƠNG 2. PHÂN TÍCH THIẾT KẾ BÀI TOÁN

2.1. Thiết kế Cơ sở dữ liệu hoặc Cấu trúc tệp dữ liệu


Không có

2.2. Biểu đồ trình tự


-Biểu đồ trình tự của use case Prepare

11
IT3100 – Lập trình hướng đối tượng 20212

-Biểu đồ trình tự của use case Fight

12
IT3100 – Lập trình hướng đối tượng 20212

2.3. Biểu đồ lớp


- Các lớp trong chương trình:
+ Lớp Map

+ Lớp Ship

+ Lớp PlayGame

13
IT3100 – Lập trình hướng đối tượng 20212

+ Lớp Creator

14
IT3100 – Lập trình hướng đối tượng 20212

+ Lớp MainMenu

15
IT3100 – Lập trình hướng đối tượng 20212

+ Lớp HighScore

+ Lớp EndScreen

+ Lớp BattleShip

- Biểu đồ lớp
16
IT3100 – Lập trình hướng đối tượng 20212

17
IT3100 – Lập trình hướng đối tượng 20212
2.4. Thiết kế chi tiết lớp
Phân tích: để giải quyết bài toán này chúng ta xây dựng 8 lớp:
Lớp Ship: chứa hình ảnh của các con tàu với các kích thước khác nhau
Lớp Map: là một bản đồ có kích thước 10x10, mỗi đối tượng của lớp Map là một bản
đồ.
Lớp MainMenu: hiển thị các thành phần của Menu để người chơi lựa chọn, bao gồm:
bật/ tắt âm thanh, chọn chế độ chơi (khó hay dễ), xem điểm cao, bắt đầu vào trò chơi,
thoát trò chơi và hướng dẫn chơi
Lớp HighScore: hiển thị điểm cao mà người chơi đã đạt được, nếu muốn xóa các điểm
cao đã đạt được thì người chơi ấn nút reset, nếu ấn nút back thì quay về MainMenu
Lớp Creator: hiển thị khung chứa các tàu chiến và hiển thị bản đồ để người chơi có thể
đặt các con tàu lên bản đồ đó. Ngoài ra người chơi có thể sử dụng nút Auto để tự động
sắp xếp tàu với vị trí ngẫu nhiên.
Lớp PlayGame: hiển thị 2 bản đồ (bản đồ của người chơi và bản đồ của máy). Người
chơi sẽ lựa chọn tọa độ để bắn trên bản đồ của máy và ngược lại (máy sẽ bắn trên bản
đồ của người chơi được cài đặt từ Creator), đồng thời hiển thị các thông số game như:
vị trí người chơi đã bắn, bắn trúng hay bắn trượt
Lớp EndScreen: hiển thị số điểm của người chơi, tạo âm thanh, hiển thị kết quả thắng
thua của người chơi, nút Highscore để vào HighScore, nút Play Again để quay về
MainMenu
Lớp BattleShip: khởi tạo đối tượng MainMenu để bắt đầu thực thi trò chơi.

Chi tiết từng lớp:


1. Lớp Ship
Chứa hình ảnh của các con tàu (ship: Image) với chiều dài 1,2,3,4,5 (chiều dài tính
theo số ô trên bản đồ, 1 ô tương đương với chiều dài là 1)
- Lớp ship có 1 phương thức khởi tạo với tham số truyền vào là (length, w, h, isNgang)
lần lượt là chiều dài con tàu (ứng trên bản đồ), chiều dài và rộng của hình ảnh con tàu
đó (ứng với màn hình của người chơi) và tham số kiểm tra tàu ngang hay dọc
- Phương thức rotateShip() với 4 tham số truyền vào là (length, w, h, isNgang) để lấy
đường dẫn tương ứng với tàu ngang hay dọc và theo chiều dài của tàu
- Phương thức loadImage() với 3 tham số truyền vào (s,w,h): trả về hình ảnh được lấy
từ đường dẫn s và được ép kích thước sang (w,h).

2. Lớp Map
Lớp này kế thừa lớp JPanel, bao gồm các thành phần:
- Mảng mapPiece[][] với kiểu dữ liệu là JButton, đây là mảng có kích thước 10x10,
ứng với 10x10 ô trên bản đồ
- Mảng boolean isShip[][]: đánh dấu xem ô (i,j) trên bản đồ có tàu ở đó hay không.
Lớp Map có 1 phương thức khởi tạo:
+ constructor với 2 tham số truyền vào là w, h ứng với kích thước dài, rộng của bản
đồ. Trong constructor này có khởi tạo mảng mapPiece và isShip, mảng mapPiece được
add vào JPanel để hiển thị các nút bấm trên bản đồ (phục vụ cho người chơi khi chơi)
+ Phương thức init() khởi tạo mảng isShip ban đầu là false, để đánh dấu các ô trên
bản đồ đều chưa xuất hiện tàu nào

3. Lớp MainMenu

18
IT3100 – Lập trình hướng đối tượng 20212
Là lớp thực hiện nhiệm vụ hiển thị Menu với các lựa chọn cho người chơi, bao gồm:
bắt đầu chơi, bật/tắt âm thanh, chọn chế độ chơi (khó/dễ), xem điểm cao, thoát khỏi trò
chơi, hướng dẫn chơi. Lớp Menu có 1 JFrame để chứa màn hình lựa chọn cho người
chơi, JFrame bao gồm 1 JLabel menu1 chứa các button tương ứng với các chức năng
để người chơi sử dụng như trên đó là
+ PLAY: khởi tạo đối tượng của Creator, màn hình xếp tàu được hiện ra để người chơi
sắp xếp đội hình
+ EASY/HARD: chọn chế độ khó/ dễ (nếu button hiển thị là easy -> chế độ dễ, hard ->
chế độ khó)
+ GAME RULE: hiển thị hướng dẫn luật chơi
+ HIGHSCORE: hiển thị lịch sử điểm cao
+ SOUND OFF/ON: bật/ tắt âm thanh
+ EXIT: thoát khỏi chương trình
+ Lớp MainMenu còn bao gồm 1 đối tượng của lớp Creator, đối tượng này sẽ được
khởi tạo khi người chơi bấm vào nút Play và 1 đối tượng của lớp HighScore, đối tượng
này cũng sẽ được khởi tạo khi ấn vào nút HighScore
+ Biến clip với kiểu dữ liệu Clip trong lớp MainMenu có chức năng phát âm thanh
trong trò chơi, biến static isPlaySound có kiểu boolean, giúp chương trình nhận biết
âm thanh đang bật hay tắt
+ Lớp có 1 phương thức khởi tạo với các tham số truyền vào lần lượt là các biến (w, h,
playSound) với w, h là chiều dài, chiều rộng của frame, playSound là biến boolean
giúp nhận biết âm thanh đang bật hay tắt (isPlaySound = playSound). Trong phương
thức khởi tạo này, màn hình menu1 được khởi tạo, đồng thời âm thanh (clip) có thể
được khởi tạo nếu người chơi bật âm thanh
+ Phương thức loadImage() với 3 tham số truyền vào (s,w,h): trả về hình ảnh được lấy
từ đường dẫn s và được ép kích thước sang (w,h).
+ Phương thức playSound() dùng để khởi tạo đối tượng clip để phát âm thanh với
tham số truyền vào là chuỗi ký tự thể hiện đường dẫn đến file.
+ Các button trong class MaiMenu đều được cài đặt sự kiện (actionListener).
+ Phương thức actionPerformed() xử lý sự kiện trên các button. Đối với button Play,
khi người chơi click vào thì đối tượng của lớp Creator sẽ được khởi tạo, chương trình
sẽ chuyển qua phần sắp sếp tàu chiến; còn với button HighScore, đối tượng của
HighScore được khởi tạo, chương trình chuyển qua phần hiển thị lịch sử điểm cao;
button sound dùng để bật/ tắt âm thanh; button gameMode để chọn chế độ khó/ dễ;
với button gameRule khi người chơi ấn vào thì label showRules được set visible và khi
ấn lại vào button gameRule thì label showRules sẽ được xóa bỏ; và cuối cùng nếu ấn
vào button Exit thì sẽ thoát khỏi chương trình

4. Lớp HighScore
Lớp HighScore có phương thức khởi tạo với 3 tham số truyền vào là w, h và
playSound, dùng để add frame và các button là reset (xóa lịch sử điểm cao) và back
(quay về menu chính)
+ Phương thức resetHighScore(): dùng để sửa file high.txt để các giá trị đều bằng 0
+ Phương thức showScore(): đọc file high.txt và hiển thị lịch sử điểm của 5 lần điểm
cao nhất
+ Phương thức loadImage(): với 3 tham số truyền vào (s,w,h): trả về hình ảnh được
lấy từ đường dẫn s và được ép kích thước sang (w,h).

19
IT3100 – Lập trình hướng đối tượng 20212
+ Phương thức playSound() dùng để khởi tạo đối tượng clip để phát âm thanh với
tham số truyền vào là chuỗi ký tự thể hiện đường dẫn đến file.

5. Lớp Creator
Lớp Creactor kế thừa lớp JLabel, có chức năng hiển thị tàu và hiển thị hình ảnh bản
đồ để người chơi có thể xếp tàu lên đó.
Lớp Creator bao gồm:
+ 1 JFrame (frame) dùng để chứa các Label và button để hiển thị lên màn hình. Các
Label chính bao gồm: shipContainer dùng để chứa hình ảnh của tàu, bản đồ (map).
Các button bao gồm back (quay trở lại màn hình menu của lớp MainMenu), auto (tự
động sắp xếp tàu trên bản đồ theo thuật toán được cài sẵn), ready (chuyển sang màn
hình PlayGame khi người chơi đã sắp xếp hết các con tàu lên map).
+ Mảng ship[] là mảng các đối tượng của lớp Ship, dùng để lưu hình ảnh các con tàu
với kích thước khác nhau để dán lên label shipContainer. Mảng lengShip[] lưu chiều
dài cảu con tàu.
+ Các biến static: X,Y dùng để bắt tọa độ của chuột khi kéo thả các con tàu lên bản đồ.
xLeft, xRight, yUp, yDown dùng để lưu tọa độ 4 góc của map trên frame. xStart, yStart
dùng để lưu tọa độ ban đầu của con tàu khi người chơi bắt đầu tương tác chuột với con
tàu đó. Mảng boolean M[][] dùng để đánh dấu các ô trên map có tàu hay không. Mảng
xS[], yS[] dùng để lưu tọa độ ban đầu của các con tàu (là các Label) khi chưa kéo thả.
Mảng boolean isNgang[] dùng để kiểm tra xem con tàu đó nằm ngang hay dọc.
+ Biến boolean isHard để lưu độ khó của trò chơi (true nếu là khó và false nếu là dễ).
isPlaySound dùng để kiểm tra xem âm thanh bật hay tắt.
+ Mảng ArrayList <String> A, B dùng để mã hóa tọa độ của điểm bắt của các con tàu.
Mảng A và B giúp chương trình nhận biết con tàu nằm bắt đầu từ ô bao nhiêu trên bản
đồ map.
+ Biến clip với kiểu dữ liệu Clip dùng để phát âm thanh trong trò chơi.
+ Lớp Creator có 1 phương thức khởi tạo với các tham số truyền vào lần lượt là: w, h
dùng để cài đặt kích thước cho frame; gameMode là chế độ chơi (khó hay dễ);
playSound để kiểm tra âm thanh bật hay tắt. Trong phương thức khởi tạo này, các
thuộc tính của lớp Creator được khởi tạo, các Label và button được add vào
+ Phương thức init() khởi tạo mảng M, isNgang và xS, yS. Mảng M ban đầu các phần
tử đều là fasle (chưa có tàu trên map), mảng isNgang ban đầu có các phần tử đều là
true, tức là mặc định ban đầu đều là tàu ngang
+ Phương thức build() được gọi từ phương thức khởi tạo, dùng để add button, add các
sự kiện (ActionListener) vào các button, add label shipContainer để chứa hình ảnh các
tàu
+ Phương thức loadImage() với 3 tham số truyền vào (s,w,h): trả về hình ảnh được lấy
từ đường dẫn s và được ép kích thước sang (w,h).
+ Phương thức put() với kiểu trả về là boolean, trả về true nếu đặt con tàu vào vị trí
mới thành công, false nếu đặt con tàu không thành công. Các tham số truyền vào của
phương thức này bao gồm: tmp là chỉ số của con tàu trong mảng ship[], x,y là tọa độ
mới để đặt con tàu, i và j là chỉ số hàng ngang – hàng dọc của tọa độ đặt tàu trên bản
đồ 10x10, isNgang dùng để kiểm tra xem tàu ngang hay dọc
+ Phương thức putForRandom() tương tự như phương thức put(), phương thức này
dùng để đặt con tàu lên bản đồ khi sử dụng thuật toán random. Phương thức này có
thêm 1 tham số truyền vào là isForPlayer, dùng để nhận biết hàm random này dùng để
sắp xếp tàu cho người chơi hay cho máy và leng để xác định chiều dài của tàu. Nếu

20
IT3100 – Lập trình hướng đối tượng 20212
dùng cho người chơi, mảng A sẽ được mã hóa theo vị trí các con tàu được đặt, nếu
dùng cho máy, mảng B sẽ được mã hóa.
+ Phương thức setRandom() dùng để sắp xếp ngẫu nhiên các con tàu lên bản đồ theo
thứ tự trong mảng ship[]. Phương thức này sẽ lấy tàu từ mảng ship[], chọn ngẫu nhiên
1 ô (i, j) và đặt thử con tàu vào đó bằng phương thức putForRandom(). Phương thức sẽ
kết thúc thực hiện khi các con tàu đều đã nằm trên bản đồ. Tham số truyền vào là
isForPlayer, dùng để nhận biết thuật toán random đang sử dụng cho người chơi hay
cho máy tính.
+ Các phương thức xử lý sự kiện chuột: MouseDragged, MousePressed,
MouseClicked, MouseReleased dùng để xử lý sự kiện khi người chơi kéo thả các con
tàu.
+ Phương thức actionPerformed() xử lý sự kiện trên các button ready, auto, back. Khi
người chơi chọn back, chương trình sẽ quay lại màn hình menu của lớp MainMenu.
Khi chọn auto, chương trình sẽ sắp xếp tự động các con tàu cho người chơi. Khi người
chơi chọn ready, chương trình kiểm tra xem tàu đã nằm trên map hết chưa bằng
phương thức isReady(), nếu rồi thì chuyển sang PlayGame.
+ Phương thức isReady() với kiểu trả về là boolean dùng để kiểm tra xem tàu đã nằm
trên map hết chưa.
+ Phương thức getFinalMap() dùng để lưu tại tọa độ của các con tàu vào các đối
tượng SmallMap và trả về đối tượng SmallMap đó.
+ Phương thức goToPlay() dùng để khởi tạo đối tượng PlayGame khi người chơi ấn
nút ready.
+ Phương thức playSound dùng để khởi tạo âm thanh.

6. Lớp PlayGame
Lớp PlayGame kế thừa lớp JLabel hiển thị màn hình chơi game, bao gồm 2 bản đồ là
đối tượng của lớp Map (đặt tên là playerMap và computerMap).
+ Người chơi sẽ thực hiện bắn tàu trên computerMap và máy thực hiện bắn trên
playerMap. Đồng thời trên màn hình hiển thị thông tin đã bắn của người chơi là bắn
trúng hay trượt, vị trí bắn
+ Các biến static: playerHit, computerHit lưu số điểm bắn trúng hiện tại, sumHit lưu
tổng số điểm cần bắn trúng, biến sumTurn lưu số lượt đã bắn, biến Score lưu kết quả
tính điểm khi kết thúc 1 game, biến boolean isPlayer để kiểm tra lượt chơi hiện tại là
của người hay máy, mảng boolean markP[][], markC[][] đánh dấu từng ô trên
computerMap và playerMap đã được bắn hay chưa. Biến boolean isHard kiểm tra chế
độ chơi (khó hay dễ), biến boolean isPlaySound để kiểm tra có bật âm thanh hay
không. Biến boolean isNgangPlayer và isNgangComputer đánh dấu là tàu ngang hay
dọc
+ Hàng đợi Queue <String> Q: Lưu tọa độ liên quan của ô bị bắn trúng tàu (dùng cho
chế độ khó).
+ Biến clip với kiểu dữ liệu Clip dùng để phát âm thanh trong trò chơi.
+ Lớp PlayGame có 1 phương thức khởi tạo. Khởi tạo frame, add các bản đồ của
người chơi và máy, hiển thị thông tin của người chơi. Trong đó có phương thức init()
khởi tạo các vị trí đã bắn của cả người chơi và máy đều là false (chưa được bắn) và
phương thức addAction()
+ Phương thức updateHistoryText() cập nhật lại các thông số (bắn trúng hay trượt, vị
trí đã bắn, số lần đã bắn) của người chơi sau mỗi lượt bắn.

21
IT3100 – Lập trình hướng đối tượng 20212
+ Phương thức shot() có 2 tham số truyền vào là i, j, dùng để bắn ô (i, j). Phương thức
trả về true nếu ô đó chưa bị bắn và false nếu ô đã bị bắn từ trước.
+ Phương thức hitRandom() chọn ngẫu nhiên 1 ô trên bản đồ để bắn bằng biến Radom
rd ( dùng cho chế độ dễ)
+ Phương thức hitRandomHard() chọn 1 ô trên bản đồ để bắn (dùng cho chế độ khó),
phương thức có sử dụng hàng đợi Q để thêm các ô liên quan khi có 1 ô có tàu bị bắn
trúng. (giả sử ô (i, j) bắn trúng thì các ô (i+1, j), (i-1, j), (i, j+1), (i, j-1)
+ Phương thức addActon() thêm các ActionListener trên các button của computerMap
+ Phương thức checkDeadOnComputerMap() kiểm tra số tàu bị hạ hoàn toàn trên
computerMap. Nếu có tàu bị hạ hoàn toàn sẽ cho hiển thị con tàu đó lên.
+ Phương thức isPlayerWin() kiểm tra người chơi thắng hay chưa và trả về giá trị
boolean tương ứng. (kiểm tra bằng biến playerHit và sumHit)
+ Phương thức isComputerWin() kiểm tra máy thắng hay chưa và trả về giá trị
boolean tương ứng. (kiểm tra bằng biến computerHit và sumHit)
+ Phương thức loadImage() với 3 tham số truyền vào (s,w,h): trả về hình ảnh được lấy
từ đường dẫn s và được ép kích thước sang (w,h).
+ Phương thức actionPerformed() xử lý sự kiện trên các button.
+ Phương thức gameOver() hiển thị màn hình over khi người chơi hoặc máy chiến
thắng
+ Phương thức setHighScore() cập nhật lại file điểm cao khi phương thức gameOver
được gọi.
+ Phương thức playSound() dùng để khởi tạo âm thanh.

7. Lớp EndScreen
Lớp EndScreen kế thừa JLabel hiển thị màn hình kết quả sau khi người chơi hoặc máy
bắn hết tàu của đối phương trước.
Lớp EndScreen có phương thức khởi tạo với các tham số w, h, isPlayWin, score,
playSound lần lượt là độ rộng, chiều cao của frame, người chơi thắng hay thua, số
điểm người chơi đạt được và thiết lập tắt/bật âm thanh thắng thua. Ngoài ra có các
button Highscore để hiển thị lịch sử điểm cao và Play Again để quay về menu chính.
Lớp EndScreen cũng có phương thức loadImage() với 3 tham số truyền vào (s,w,h):
trả về hình ảnh được lấy từ đường dẫn s và được ép kích thước sang (w,h) và
playSound() dùng để khởi tạo âm thanh từ tham số là đường link

8. Lớp BattleShip
Lớp BattleShip chứa hàm main, bắt đầu trò chơi thông qua khởi tạo đối tượng của lớp
MainMenu.

9. Tổng quan về trình tự khởi tạo đối tượng của các lớp
+ Đầu tiên khi người chơi bắt đầu khởi chạy trò chơi, 1 đối tượng của lớp MainMenu
được khởi tạo. Màn hình menu có kích thước 1120 x 690, âm thanh mặc định là false.
+ Khi người chơi cài đặt các thông số từ menu (âm thanh, chế độ khó hay dễ) và nhấn
Play, đối tượng của lớp Creator được khởi tạo và được add vào JFrame của lớp
MainMenu. Màn hình sắp xếp tàu sẽ hiển thị.
+ Nếu người chơi bấm vào nút back trên màn hình sắp xếp tàu, frame của lớp
MainMenu sẽ gỡ đối tượng của lớp Creator ra và quay về màn hình của lớp
MainMenu. Đối tượng của lớp Creator bị gỡ ra này sẽ được trình dọn rác (Garbage
Collection) thu dọn.

22
IT3100 – Lập trình hướng đối tượng 20212
+ Khi người chơi đã sắp xếp hết các tàu lên map và bấm vào nút ready trên màn hình
sắp xếp đội hình (ứng với đối tượng của class Creator), 2 đối tượng của lớp Map (đặt
tên là playerMap và computerMap) được khởi tạo để lưu lại tọa độ các tàu của người
chơi và máy tính (các tàu của máy tính được sắp xếp bằng random). Đối tượng của lớp
Creator này được gỡ bỏ khỏi màn hình chơi, thay vào đó là màn hình chơi game (ứng
với đối tượng của lớp PlayGame được khởi tạo). PlayerMap và computerMap được
add vào frame của PlayGame, người chơi sẽ lựa chọn các ô bắn trên computerMap.
+ Khi trò chơi kết thúc, đối tượng của lớp PlayGame được thu hồi, đối tượng của lớp
EndScreen được khởi tạo mới và hiển thị ra màn hình kết quả người chơi thắng hay
thua, lúc này trên màn hình có 2 nút là score và play again
+ Nếu người chơi ấn score thì sẽ khởi tạo đối tượng của lớp HighScore, màn hình sẽ
hiển thị lịch sử 5 lần điểm cao nhất. Khi đó sẽ có tiếp 2 nút là reset và back. Nếu người
chơi ấn reset sẽ xóa lịch sử điểm cao, nếu ấn back sẽ khởi tạo đối tượng của
MainMenu, hiển thị màn hình menu chính
+ Nếu người chơi ấn play again, đối tượng của MainMenu được khởi tạo, menu chính
sẽ hiển thị lên màn hình
+ Khi người chơi bấm vào nút exit (ở màn hình menu chính) hoặc tắt cửa sổ trò chơi,
chương trình sẽ dừng hoạt động, các đối tượng của các lớp đang chạy được thu hồi.

23
IT3100 – Lập trình hướng đối tượng 20212

CHƯƠNG 3. THUẬT TOÁN SỬ DỤNG

3.1. Công nghệ sử dụng


Để giải quyết bài toán về giao diện đồ họa, nhóm sử dụng công nghệ Java Swing và
Java AWT

3.2. Các thuật toán đã sử dụng


3.2.1 Thuật toán sắp xếp tàu vào bản đồ
Sau khi ấn vào nút Play ở menu, người chơi sẽ được chuyển sang màn hình sắp xếp
các con tàu vào từng vị trí trên bản đồ. Tại đây, mảng boolean M[][] được khởi tạo với
các giá trị ban đầu là false.
+ Khi người chơi giữ chuột vào 1 con tàu nào đó để chuẩn bị kéo thả, phương thức
mousePressed sẽ được gọi. Tại đây, biến xStart, yStart nhận giá trị tọa độ của con tàu
(tọa độ của điểm góc trên bên trái của tàu) , biến X,Y nhận giá trị là tọa độ của chuột.
+ Khi người chơi kéo con tàu trên bản đồ, phương thức MouseDragged được gọi, hình
ảnh con tàu sẽ di chuyển theo chuột.
+ Khi người chơi vừa kéo tàu ra vừa ấn chuột phải, đồng thời phương thức
mouseClicked và phương thức mousePressed sẽ được gọi, tàu sẽ xoay theo mỗi lần ấn
chuột phải
+ Khi người chơi thả chuột ra, phương thức MouseReleased sẽ kiểm tra xem tại vị trí
thả chuột, con tàu có nằm trong vùng bản đồ hay không. Nếu không trong bản đồ, con
tàu sẽ đượt di chuyển về vị trí xStart và yStart (2 biến đã được tính toán trong
MousePressed). Nếu con tàu nằm trong vùng bản đồ, chương trình kiểm tra xem tại vị
trí mới đã có tàu khác nằm ở đó hay chưa. Nếu đã có tàu khác, tàu sẽ được di chuyển
về xStart và yStart. Nếu chưa có tàu khác, tàu sẽ được chuyển đến tọa độ mới, mảng M
sẽ được cập nhật lại.

3.2.2 Thuật toán chơi game chế độ dễ


Ở chế độ dễ, mỗi lượt máy bắn sẽ là 1 ô bất kỳ trên bản đồ nhờ vào phương thức
hitRandom và biến random rd trong phương thức.

3.2.3 Thuật toán chơi game chế độ khó


Ở chế độ khó, chương trình sử dụng 1 hàng đợi Q để lưu tọa độ các ô trên bản đồ, xuất
phát từ Q rỗng.
Khi đến lượt máy bắn, chương trình kiểm tra hàng đợi Q rỗng hay không:
+ Nếu Q rỗng, chương trình sử dụng biến random để bắn một ô bất kỳ trên bản đồ.
Nếu ô này có tàu, gọi đó là ô (i,j) thì 4 ô (i+1,j) , (i-1,j), (i, j+1) và (i, j-1) sẽ được thêm
vào hàng đợi để chờ lượt bắn sau.
+ Nếu Q có phần tử, chương trình lấy ra ô ở đầu hàng đợi để bắn. Nếu ô này có tàu,
gọi đó là ô (i,j) thì 4 ô (i+1,j), (i-1,j), (i, j+1) và (i, j-1) sẽ được thêm vào hàng đợi để
chờ lượt bắn sau.

24
IT3100 – Lập trình hướng đối tượng 20212

CHƯƠNG 4. XÂY DỰNG CHƯƠNG TRÌNH MINH HỌA

4.1. Kết quả chương trình minh họa


Chương trình đã thực hiện được những chức năng chính sau:
+ Cho phép người chơi lựa chọn tàu chiến, sắp xếp đội hình (mỗi loại tàu chiến có các
kích thước, hướng khác nhau)
+ Đánh dấu tọa độ bắn trật, bắn trúng của mỗi lượt chơi
+ Thống kê số lần đã bắn, bắn trúng hay trượt, vị trí đã bắn
+ Lưu lại điểm số của người chơi
+ Xây dựng thuật toán cho máy chơi ở chế độ khó và dễ
+ Chơi với máy, xem lịch sử điểm cao.
+ Cấu hình game: tắt bật âm thanh, reset điểm cao

4.2. Giao diện chương trình


1. Giao diện khi bắt đầu khởi chạy game

25
IT3100 – Lập trình hướng đối tượng 20212

2. Giao diện xem lịch sử điểm cao

3. Giao diện sắp xếp tàu lên bản đồ

26
IT3100 – Lập trình hướng đối tượng 20212

4. Giao diện chơi game

5. Giao diện kết thúc game

27
IT3100 – Lập trình hướng đối tượng 20212

4.3. Kiểm thử các chức năng


Các chức năng chính cần kiểm thử:
+ Cho phép người chơi sắp xếp đội hình (mỗi loại tàu chiến có các kích thước khác
nhau, có thể thay đổi hướng của tàu)
+ Lưu lại điểm số của người chơi
+ Xem lịch sử điểm cao, reset điểm cao
28
IT3100 – Lập trình hướng đối tượng 20212
+ Tắt, bật âm thanh
+ Xem hướng dẫn chơi

4.3.1. Kiểm thử cho chức năng 1


Chức năng: cho phép người chơi lựa chọn, sắp xếp, xoay tàu chiến.

Số lượng tàu chiến của từng loại tàu được quy định sẵn là 5 tàu với 5 kích thước (độ
dài tàu ứng với số ô trên bản đồ là tàu độ dài 1, 2, 3, 4, 5).
Kết quả kiểm thử sắp xếp tàu chiến
STT input Exception Kết quả
1 Các tàu chưa nằm Xử lý: không cho người chơi OK
hết trong map. bấm vào nút ready
2 Các tàu đã nằm Xử lý: cho phép người chơi OK
trên map bấm nút ready

4.3.2. Kiểm thử cho chức năng 2

Chức năng: Lưu lại điểm số, xem lịch sử điểm số, reset điểm cao
Kết quả kiểm thử

STT input Exception Kết quả


1 File highscore.txt Xử lý: tạo mới file OK
không tồn tại highscore.txt
2 File highscore.txt được Không xử lý OK
nhập thành công

4.3.3. Kiểm thử cho chức năng 3


Chức năng: bật tắt âm thanh
Kết quả kiểm thử

STT input Exception Kết quả


1 File sound.wav không Xử lý: bỏ qua âm thanh OK
tồn tại
2 File sound.wav đã tồn Không xử lý OK
tại

4.3.4. Kiểm thử cho chức năng 4


Chức năng: xem hướng dẫn chơi
29
IT3100 – Lập trình hướng đối tượng 20212
Kết quả kiểm thử
STT input Exception Kết quả
1 File gamerule.txt Xử lí: không hiện OK
không tồn tại hướng dẫn chơi
2 File gamerule.txt Không xử lí OK
được tìm thấy

4.3.5. Kết luận


Chương trình chạy ổn định, ít lỗi logic xảy ra. Nếu có lỗi xảy ra thì đa phần là do các
file input bị thiếu hoặc lỗi.

KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN


Chương trình đã hoàn thành được những yêu cầu cơ bản của bài toán.
Ưu điểm:
+ Không có lỗi logic
+ Giao diện dễ nhìn
+ Nhẹ, tốn ít tài nguyên
Nhược điểm:
+ Một số hình ảnh trong game chưa thực sự đẹp
+ Các lớp trong chương trình còn sử dụng nhiều thuộc tính
Hướng phát triền cho đề tài:
+ Giảm thiểu các thuộc tính cho các lớp bằng các biến cục bộ
+ Tìm kiếm thêm hình ảnh để giao diện game trau chuốt hơn
+ Thêm hướng dẫn chơi để người chơi dễ hiểu

Mặc dù còn một số thiếu sót, tuy vậy những gì thu được từ bài tập lớn lần này giúp
chúng em tự tin hơn để tiếp tục đam mê trong lập trình.
Chúng em rất mong nhận được những đánh giá của thầy.
Chúng em xin chân thành cảm ơn!

30
IT3100 – Lập trình hướng đối tượng 20212

31
IT3100 – Lập trình hướng đối tượng 20212

TÀI LIỆU THAM KHẢO


[1] Lập trình hướng đối tượng với Java, Đoàn Văn Ban, NXB Khoa học và kỹ thuật
[2] Slide bài giảng lập trình hướng đối tượng, Ths. Nguyễn Mạnh Tuấn
[3] Trang web viettus.vn
[4] Trang web docs.oracle.com
[5] Trang web stackoverflow.com
[6] Trang web github.com
[7] Youtube.com

32
IT3100 – Lập trình hướng đối tượng 20212

PHỤ LỤC
Hướng dẫn cài đặt
+ Giải nén file BattleShip.zip
+ Chạy file BattleShip.exe trong thư mục vừa giải nén
+ Để xem source code, import thư mục vừa giải nén vào eclipse hoặc các IDE hỗ trợ
java khác.

33

You might also like