Tải bản đầy đủ (.pdf) (33 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.81 MB, 33 trang )

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
Đinh Duy Anh
Đỗ Vũ Tùng Lâm
Nguyễn Đắc Hoàng Anh
Cao Thành Huy
Nguyễn Viết Toàn

Mã sinh viên
20200013
20204574
20204510
20204656
20200545

Lớp
132623
132623
132623
132623
132623

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



Khóa
65
65
65
65
65


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 TỐN...............................5

1.1. Mơ tả u cầu bài tố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 TỐ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 TỐN SỬ DỤNG.............................................................24

3.1. Cơng nghệ sử dụng.......................................................................................24
3.2. Các thuật tố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.
4.3.2.
4.3.3.
4.3.4.
4.3.5.

Kiểm thử cho chức năng 1.......................................................................28
Kiểm thử cho chức năng 2.......................................................................29
Kiểm thử cho chức năng 3.......................................................................29
Kiểm thử cho chức năng 4.......................................................................29
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 tố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 tốn để hồ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 đã hồ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



Khảo sát đặc tả u Hồn
cầu bài tố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ũ
Tùng Lâm



Xây dựng chương trình Hồn
chi tiết
thành
Xây dựng thư mục
hình ảnh và âm thanh
Viết slide

Nguyễn Đắc
Hồng Anh

Phân tích bài tốn
Vẽ các biểu đồ lớp

Hồn
thành

Viết báo cáo
Kiểm thử chương trình
Cao Thành
Huy




Kiểm thử chương trình

Hồn
Tham gia viết 1 số thành
chức năng

Nguyễn
Viết Tồn



Tìm kiếm tài liệu

Hồn
Tìm kiếm cơng nghệ thành
và các thuật tố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Ả U CẦU BÀI TỐN
1.1. Mơ tả u cầu bài tố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
Thố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ác nhân

Điều kiện trước
Luồng thực thi
chính
No.
1

Người chơi (Player)
Người chơi click vào nút Play ở giao diện MainMenu
Thực hiện
Player

2

System

3

Player

4

System

5
6

Player
System

Tên usecase


Prepare

Hành động
Kéo tàu từ container chứa tàu vào
trong Map
Hiển thị vị trí tàu người chơi kéo
vào
Kéo tàu từ vị trí cũ đến vị trí mới
trong Map
Hiển thị vị trí tàu người chơi vừa
kéo thả
Click vào nút auto
Sắp xếp tàu ở container vào trong
Map một cách ngẫu nhiên
Click vào nút back
Khởi tạo giao diện MainMenu
Click vào nút ready
Khởi tạo giao diện PlayGame

7
8
9
10
Luồng thực thi
mở rộng
1a

Player
System

Player
System

Mã UC (UC #)

BS009

Tác nhân
Điều kiện trước

Người chơi (Player)
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

Đổ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 ở ngồ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 ở ngồ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

Luồng thực thi

System

Tên usecase

Fight

8


IT3100 – Lập trình hướng đối tượng
chính
No.

1
2

Thực hiện
Player

System

3

Player

4

System

5

System

6

System

7

System

8

System

9

Player


10

System

11
12

System
Player

13

System

Luồng thực thi
mở rộng
4a

System

4b

System

5a

System

5b


System

6a

System

6b

System

20212

Hành động
Click vào nút back
Đóng cửa sổ PlayGame và
hiện cửa sổ với giao diện
MainMenu
Click vào 1 ô bất kỳ trên bản
đồ.
Kiểm tra ơ đó đã được đánh
hay chưa.
Kiểm tra ơ được chọn có tàu
hay khơng
Kiểm tra xem có tàu nào bị
hạ hoàn toàn chưa
Kiểm tra người chơi hoặc
máy đã thắng chưa
Chọn 1 ô ngẫu nhiên để bắn
tàu người chơi
Click nút “Play Again” khi

player hoặc máy đã thắng
Lưu kết quả điểm số của
người chơi vào dữ liệu điểm
Quay trở về Menu
Click nút Highscore khi
player hoặc máy đã thắng
Hiển thị màn hình lịch sử
điểm cao
Khơng thực hiện gì nếu ơ
được chọn đã được chọn
trước đó.
Nếu ơ đó chưa được chọn,
thực hiện luồng thực thi số 5
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
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
Nếu chưa, thực hiện luồng
thực thi 8
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

7a
7b

8a
10a
10b
13a
13b
Điều kiện sau

20212

hiện luồng thực thi 7
System
Nếu chưa, thực hiện luồng
thực thi 8
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
System
Thực hiện luồng thực thi 4.
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
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.
System
Nếu người chơi ấn nút reset,
xóa lịch sử điểm cao
System
Quay về giao diện của
MainMenu nếu người chơi ấn
nút back
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 tố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,
thố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 đồ đó. Ngồ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, thố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: thố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ẽ thố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 tố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 tố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ạ hồn tồn trên
computerMap. Nếu có tàu bị hạ hồn tồ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. Ngồ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 TỐN SỬ DỤNG
3.1. Cơng nghệ sử dụng
Để giải quyết bài tố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 tố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


×